5. CAPÍTULO 1
1.- Introducción
1.1 ¿Qué es PySafet?
Es una librería disponible para los lenguaje de programación C++ y Python, que permite construir aplica-
ciones informáticas de manera rápida, para ello se definen dos conceptos:
1. Flujo de trabajo(workflow): Consiste en el estudio de aspectos operacionales de una actividad de
trabajo, esto es, cómo se realizan y estructuran las tareas, cuál es su orden correlativo, cómo se sin-
cronizan, cómo fluye la información y cómo se hace su seguimiento. Más contenido AQUI.
2. Firma electrónica: Es un concepto jurídico equivalente a electrónico de la firma manuscrita, donde
una persona acepta el contenido de un mensaje electrónico a través de cualquier medio electrónico
válido.
Toda la aplicación se desarrolla con PySafet y no como Framework tradicional. Los conocimientos que
deben manejar para esta aplicacion PySafet son:
1. XML (lenguaje de marcador). Xml.
2. SQL (lenguaje de consultas de base de datos). Sql.
3. Python (lenguaje dinámico). Python.
1.2 Arquitectura
Un motor de flujo de trabajo tiene como principal objetivo calcular (los) el siguiente estado(s) disponibles
para la ficha.
Se agregan:
1. Visualización.
1
6. Documentación de PySafet, Publicación
2. Reporte y tiempos.
3. Validación de estados.
1.3 Organización de trabajo
Unas de las características de las organización de hoy en día es su funciones dinámicas,emergente y
pro activo se plasman en sus procesos.
Una organización es medible a través de sus procesos. Si los procesos funcionan bien la organización
funciona bien.
Es por ello que la gestión debe fundamentarse en los procesos, identificando de manera expedita
posible fallos.
Para medir los procesos se recurre a herramienta informática
¿ Qué pasa si estas herramientas no son flexibles (adaptarse en uno de los procesos)?
1. Muchos procesos o faces de profesos no se automatizan.
2. Los dueños de los procesos no son los adecuados.
3. Se produce aumentos de errores.
4. No es buena la ejecución de los procesos (muchas veces es mala).
5. Es frecuente la aparición de “cuellos de botella”; Al funcionamiento es pésimo cuando se au-
menta la carga.
6. No hay información oportuna y fiable.
7. Las auditorías aumentan grandes esfuerzos y no se obtiene buenos resultados.
Ejemplo de una Organización: Figura 1: Organización de trabajo:
1.4 Motivación y objetivos
1. Pysafet surge como idea de Fundacite y sucede para complementar la infraestructura de firma electró-
nica.
2. Se planteaba como un “motor de flujos de trabajo”.
3. La construcción de un motor de flujo de trabajo es compleja, hay dos modelos teóricos:
BPMN: Extensión UML comunicar y como segundo objetivo implementar y calcular.
Redes de petri: Calcular y segundo objetivos comunican.
2 Capítulo 1. 1.- Introducción
7. Documentación de PySafet, Publicación
Figura 1.1: Figura 1: Organización de trabajo
1.5 Ejemplos de algunos Diagrama de flujo de trabajo
Todo proceso puede modelarse como un flujo de trabajo. Se hace necesario identificar “Even-
tos”,”Estado”,”Fichas”,”Recursos”, “Dependencias”,”Roles”,”Patrones”,”Mensajes”.
Eventos: Posible hecho que cambia de estado es una ficha.
Estado: Lugar donde reside una ficha.
Ficha: Documento único dentro del proceso(puede cambiar de datos durante el cambio de estado,
pero puede mantener un enlace o id único).
Recursos: Lo que necesita el proceso para funcionar.
Roles: Identidades (digitales) como posible o responsabilidades en los activos de información.
Patrones: Compuestos de modelos generales o recurrentes en los procesos.
Mensajes: Información sobre el acontecer de un evento dirigido a un rol externo (generalmente).
1.5.1 1° PRIMER EJEMPLO
Solicitar un permiso de un usuario. PySafet utiliza el gráfico de safet para observar el flujo de trabajo, como
se muestra en la siguiente Figura 2: Gráfico safet:
1.5. Ejemplos de algunos Diagrama de flujo de trabajo 3
8. Documentación de PySafet, Publicación
Figura 1.2: Figura 2: Gráfico safet
1.5.2 2° SEGUNDO EJEMPLO
Como determinar los (Estado,eventos,fichas,dependencias,recursos y roles), de la solicitud de permiso de
un usuario con el gráfico de Petii, como se muestra en la siguiente Figura 3: Gráfico Petrii:
Figura 1.3: Figura 3: Gráfico Petrii
1.5.3 3° TERCER EJEMPLO
Como identificar los (eventos, estados, dependencias, roles,patrones,mensajes) de una caja de ahorro,
con el gráfico de safet, como se muestra en la siguiente Figura 4: Caja de ahorro:
1.5.4 4° CUARTO EJEMPLO
El ejemplo basico de PySafet hola mundo con el gráfico de safet, como se muestra en la siguiente Figura
5: Inicio de PySafet:
4 Capítulo 1. 1.- Introducción
9. Documentación de PySafet, Publicación
Figura 1.4: Figura 4: Caja de ahorro
Figura 1.5: Figura 5: Inicio de PySafet
1.5. Ejemplos de algunos Diagrama de flujo de trabajo 5
10. Documentación de PySafet, Publicación
1.6 Sistema Automatizado de Firma Electrónica y Estampado Elec-
trónico
Es una herramienta que permite desarrollar nuevas aplicaciones de software con flujos de trabajo, es decir,
automatización de forma expedita de procesos de una organización, agregando firma Electrónica y estampi-
llado de tiempo.
La firma electrónica tiene un soporte legal en la Ley sobre Mensajes de Datos y Firma Electrónica (2001)
de la República Bolivariana de Venezuela.
El sistema automatizado para la Firma Electrónica y Estampado de Tiempo (SAFET) surge como una he-
rramienta que permite desarrollar nuevas aplicaciones de software que incluyan las funcionalidad de flujos
de trabajo, firma Electrónica y estampillado de tiempo.
6 Capítulo 1. 1.- Introducción
11. CAPÍTULO 2
2.- Instalación
2.1 Debian Wheezy 7.6.0 (64 bits/32bits)
En este tutorial explicaremos la instalación se Pysafet en la distribución linux(debian), para ello seguimos
los siguientes pasos:
2.1.1 1° PRIMER PASO
Abrimos el archivo sources.list y agregamos el siguiente repositorio:
deb http://tibisay.cenditel.gob.ve/repositorio wheezy main
2.1.2 2° SEGUNDO PASO
Desde la consola de comando, como (SuperUsuario), obtenemos la clave (GPG) del repositorio De-
bian, para ello ejecutamos los siguientes lineas:
# wget http://tibisay.cenditel.gob.ve/repositorio/apt-seguridad.gpg.asc
# apt-key add apt-seguridad.gpg.asc
Nota: Se nos mestra lo siguiente:
2.1.3 3° TERCER PASO
Desde la consola de comando, como (SuperUsuario), ejecutamos un update como se muestra a
continuación:
# aptitude update
7
12. Documentación de PySafet, Publicación
2.1.4 4° CUARTO PASO
Desde la consola de comando, como (SuperUsuario), ejecutamos un update como se muestra a
continuación:
# aptitude install pysafet
Nota: En la siguinte Figura 6: Instalación Pysafet se muestra como esta instalando Pysafet:
Figura 2.1: Figura 6: Instalación Pysafet
2.1.5 5° QUINTO PASO
Desde la consola de comando, como (UsuarioNormal), entramos a la consola de python, como se
muestra a continuación:
$ python
Nota: Al ejecutar python entramos a la consola como se muestra a continuación:
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
8 Capítulo 2. 2.- Instalación
13. Documentación de PySafet, Publicación
2.1.6 6° SEXTO PASO
En la consola de python importamos a Safet, como se muestra a continuación:
>>> import Safet
>>>
2.1.7 7° SEPTIMO PASO
En la consola de python visualizamos algunas funciones de PySafet como se muestra a continuación
>>> dir(Safet)
[’MainWindow’, ’ParsedSqlToData’, ’SafetDocument’,’SafetVariable’,
’SafetWorkflow’, ’SafetXmlObject’,’SafetYAWL’,
’__doc__’, ’__file__’, ’__name__’, ’__package__’]
Otra formar de mostrar las funciones de PySafet:
>>> for i in range(len(dir(Safet))):
... dir(Safet)[i]
...
’MainWindow’
’ParsedSqlToData’
’SafetDocument’
’SafetVariable’
’SafetWorkflow’
’SafetXmlObject’
’SafetYAWL’
’__doc__’
’__file__’
’__name__’
’__package__’
2.2 Ubuntu (32 bits/ 64 bits)
2.3 Desde los Archivos fuentes
El código fuente de la librería Libsafet se encuentra alojada en una plataforma de desarrollo colaborativo
de software (forja) llamada Github, esta plataforma utiliza como sistema de control de versión el software
Git.
2.3.1 A.- Dependencias
PySafet depende de la siguientes dependencias:
1. libgraphviz-dev
2. libtar-dev
2.2. Ubuntu (32 bits/ 64 bits) 9
14. Documentación de PySafet, Publicación
3. g++
4. libglib2.0-dev
5. x11proto-xext-dev
6. libqt4-dev
7. ibssl-dev
8. make
9. python-qt4-sql
10. python-sip-dev
11. python-qt4-dev
12. libqt4-sql-sqlite
Para la misma se debe hacer los siguiente:
Desde la línea de comando o terminal como usuario (root) instalamos la dependencias para pysafet,
como se muestra a continuación:
# aptitude install libgraphviz-dev x11proto-xext-dev g++ libglib2.0-dev
# aptitude install libqt4-dev libssl-dev make python-qt4-sql libtar-dev
# aptitude install python-qt4-dev libqt4-sql-sqlite python-sip-dev
2.3.2 B.- Descargamos el repositorio Libsafet
Para descargar PySafet debemos clonar el repositorio de Libsafet, para ello seguimos los siguentes paso:
1° PRIMER PASO
Desde la consola de comando como usuario (root),instalamos el control de versiones git, como se
muestra a continuación:
# aptitude install git
2° SEGUNDO PASO
Desde nuestro directorio de trabajo, descargamos las fuente pysafet con el comando (git clone url),
como se muestra en el siguiente comando:
$ git clone https://github.com/victorrbravo/pysafet.git pysafet
Nota: Dentro del directorio de trabajo se crea el directorio pysafet, donde se tiene el clone de
la librería Libsafet
10 Capítulo 2. 2.- Instalación
15. Documentación de PySafet, Publicación
2.3.3 C.- Pasos para la compilación de la libraría Libsafet
1° PRIMER PASO
Desde la línea de comando o terminal como usuario (normal), accedemos al directorio (pysa-
fet/websafet) desde nuestro directorio de trabajo, para la misma debe hacer los siguientes:
$ cd pysafet/websafet
2° SEGUNDO PASO
Ejecutamos los siguiente:
pysafet/websafet $ make clean
pysafet/websafet $ qmake-qt4
pysafet/websafet $ make
3° TERCER PASO
Nos cambiamos al directorio (PySafet), como se muestra a continuación:
pysafet/websafet $ cd ../PySafet/
4° CURTO PASO
Dentro de directorio (PySafet), ejecutamos lo siguiente:
pysafet/PySafet $ python configure.py
pysafet/PySafet $ make
5° QUINTO PASO
Dentro de directorio (PySafet/) pero como usuario (root), ejecutamos los siguiente:
pysafet/PySafet # make install
6° SEXTO PASO
Nos cambias al directorio (websafet), como se muestra a continuación:
pysafet/PySafet $ cd ../websafet/
2.3. Desde los Archivos fuentes 11
16. Documentación de PySafet, Publicación
7° SEPTIMO PASO
Dentro de directorio (websafet/) pero como usuario (root), ejecutamos los siguiente:
pysafet/websafet # make install
2.3.4 D.- Verificamos si se instalo PySafet
1° PRIMER PASO
Desde la línea de comando o terminal como usuario (normal) accedemos al interprete de Python,
para la misma debe hacer los siguientes:
pysafet/websafet $ python
Nota: Se mostrara de esta forma:
Python 2.7.3 (default, Jan 2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
2° SEGUNDO PASO
Dentro prompt de python(>>>), importamos la librería de Safet ejecutando el siguiente comando
>>> import Safet
>>>
3° TERCER PASO
Dentro prompt de python(>>>), observamos algunas funciones de Safet, para la misma debe hacer
los siguientes:
>>> dir(Safet)
Nota: Se nos muestra las funciones de la siguiente manera:
[’MainWindow’, ’ParsedSqlToData’, ’SafetDocument’, ’SafetVariable’,
’SafetWorkflow’, ’SafetXmlObject’, ’SafetYAWL’, ’__doc__’,
’__file__’, ’__name__’, ’__package__’]
12 Capítulo 2. 2.- Instalación
17. Documentación de PySafet, Publicación
2.4 Herramienta inflow
En este tutorial es necesario tener conocimiento básico de instalación de paquetes, y actividades mínimas de
administración. Los paquetes necesarios para la instalación inflow son:
1. Librería Trolltech Qt >= 4.4 (libqt4-dev).
2. Librería de Conexión a Datos Qt PSQL (libqt4-sql-psql).
3. Librería de Conexión a Datos Qt SQLITE (libqt4-sql-sqlite).
4. Librería XML2 (libxml2-dev).
5. Librería de archivo tareados (libtar-dev).
6. Librería Graphviz (libgraphiz-dev, para plugins de visualización de gráfico).
7. Libreria libtar-dev (Utilidad “tar” para respaldo de archivos).
8. Compilador g++ y make.
A continuación seguimos los siguientes pasos para la instalación de la (interfaz inflow):
2.4.1 1° PRIMER PASO
Desde la consola de comando, como usuario root, instalamos todo los paquetes para inflow, como se
muestra a contiuación:
# aptitude install libqt4-dev libqt4-sql-psql libxml2-dev libtar-dev
# aptitude install g++ make libqt4-sql-sqlite libgraphviz-dev
Nota: A continuación se muestra la instalación en la siguiente Figura 7: Instalación de
paquetes para inflow:
Figura 2.2: Figura 7: Instalación de paquetes para inflow
2.4. Herramienta inflow 13
18. Documentación de PySafet, Publicación
2.4.2 2° SEGUNDO PASO
Desde la consola de comando, como usuario normal, creamos un directorio llamado inflow en nuestro
<HOME>, como se muestra a continuación:
$ mkdir $HOME/inflow
2.4.3 3° TERCER PASO
Desde la consola de comando, como usuario normal, accedemos al directorio que creamos inflow,
como se muestra a continuación:
$ cd $HOME/inflow
2.4.4 4° CUARTO PASO
Desde la consola de comando, como usuario normal, descargarmos la fuentes con el comando git,
como se muestra a continuación:
inflow $ git clone https://bitbucket.org/victorrbravo/inflow.git
Nota: Observamos la siguiente Figura 8: Descargamos inflow:
Figura 2.3: Figura 8: Descargamos inflow
2.4.5 5° QUINTO PASO
Desde la consola de comando, como usuario normal, accedemos al directorio descomprimido inflow/,
la cual se descargo cuando ejecutamos el comando git, como se muestra a continuación:
inflow $ cd inflow/
2.4.6 6° SEXTO PASO
Desde la consola de comando, como usuario normal, ejecutamos el paquete qmake o qmake-qt4
para generar el archivo de compilación (Makefile), como se muestra a continuación:
14 Capítulo 2. 2.- Instalación
19. Documentación de PySafet, Publicación
inflow/inflow $ qmake-qt4
Nota: Observe la siguiente Figura 9: qmake-qt4:
Figura 2.4: Figura 9: qmake-qt4
Nota: Si en la pantalla no se muestran errores pasamos al siguiente paso.
2.4.7 7° SEPTIMO PASO
Desde la consola de comando, como usuario normal, realizamos la compilación ejecutando make,
como se muestra a continuación:
inflow/inflow $ make
Nota: Observe la siguiente Figura 10: make:
Figura 2.5: Figura 10: make
2.4. Herramienta inflow 15
20. Documentación de PySafet, Publicación
2.4.8 8° OCTAVO PASO
Desde la consola de comando, como usuario root, ejecuramos make install desde el directorio <HO-
ME>inflow/inflow, como se muestra a continuación:
inflow/inflow $ make install
Nota: Observe la siguiente Figura 11: make install:
Figura 2.6: Figura 11: make install
Nota: ¡Si no se presenta ningún mensaje de error SAFET, entonces ya está instalado correctamente
en su sistema!
16 Capítulo 2. 2.- Instalación
21. CAPÍTULO 3
3.- Configuración
3.1 Cargar un proyecto(Productos) en el directorio .safet/
En este tutorial montaremos nuestro primer proyecto inicial Pysafet en el directorio <HOME>.safet/, la
cual comenzaremos a trabajar con pysafet para ello siguimos los siguientes paso:
3.1.1 1° PRIMER PASO
Desde la consola de comando, creamos un directorio en nuestro <HOME> por ejemplo Pysafet,
como se muestra a continuación:
$ mkdir $HOME/Pysafet
3.1.2 2° SEGUNDO PASO
Descargamos nuestro ProyectoInicial.tar dando un clik al link que se muestra en la siguiente imagen:
3.1.3 3° TERCER PASO
Desde la consola de comando, copiamos el archivo que descargamos anteriormente ProyectoIni-
cial.tar a nuestra carpeta <HOME>Pysafet/, como se mestra a continuación:
$ cp $HOME/Descargas/ProductosInicial.tar $HOME/Pysafet/
3.1.4 4° CUARTO PASO
Desde la consola de comando, accedemos al directorio <HOME>Pysafet, como se muestra a conti-
nuación:
$ cd $HOME/Pysafet
17
22. Documentación de PySafet, Publicación
Figura 3.1: Click Aquí (ProyectoInicial.tar)
3.1.5 5° QUINTO PASO
Desde la consola de comando, creamos un archivo (.py) por ejemplo MontarProyectoInicial.py
dentro del directorio <HOME>Pysafet/, como se muestra a continuación:
Pysafet $ touch MontarProyectoInicial.py
3.1.6 6° SEXTO PASO
Abrimos el archivo .py(MontarProyectoInicial.py), insertamos el siguiente Script de python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
# Colocamos el nombre del proyecto (.tar)
myinflow.doLoadConfiguration("ProyectoInicial.tar")
3.1.7 7° SEPTIMO PASO
Desde la consola de comando, ejecutamos el archivo .py(MontarProyectoInicial.py), como se mues-
tra a continuación:
18 Capítulo 3. 3.- Configuración
23. Documentación de PySafet, Publicación
Pysafet $ python MontarProyectoInicial.py
Nota: Al ejecutar el archivo (MontarProyectoInicial.py) se mostrara el siguiente mensaje:
3.1.8 8° OCTAVO PASO
Desde la consola de comando, listaremos el directorio creado <HOME>.safet/, como se muestra a
continuación:
Pysafet $ ls $HOME/.safet/
Nota: Se nos mostrara el siguiente contenido:
auth.conf digidoc.conf flowfiles images log reports xmlrepository
certs dtd graphs input mydb.db safet.conf
3.2 Guardar el proyecto del directorio .safet/
En este tutorial explicaremos con un script python, como guardar el proyecto que estamos trabajando del
directorio .safet/ con la extención .tar, para ello siguimos los siguientes paso:
3.2.1 1° PRIMER PASO
Desde la consola de comando, accedemos al directorio que creamos en el paso anterior <HO-
ME>Pysafet, como se muestra a continuación:
$ cd $HOME/Pysafet
3.2.2 2° SEGUNDO PASO
Desde la consola de comando, creamos un archivo (.py) por ejemplo GuardarProyecto.py dentro del
directorio <HOME>Pysafet/, como se muestra a continuación:
Pysafet $ touch GuardarProyecto.py
3.2.3 3° TERCER PASO
Abrimos el archivo .py(GuardarProyecto.py), insertamos el siguiente Script de python:
import Safet
import os
myhome = os.getenv("HOME")
3.2. Guardar el proyecto del directorio .safet/ 19
24. Documentación de PySafet, Publicación
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
# Nombre del proyecto a guardar (.tar)
myinflow.doSaveConfiguration("Proyecto.tar")
3.2.4 4° CUARTO PASO
Desde la consola de comando, ejecutamos el archivo GuardarProyecto.py, como se muestra a con-
tinuación:
Pysafet $ python MontarProyectoInicial.py
Nota: Al ejecutar el archivo (GuardarProyecto.py) se mostrara el siguiente mensaje:
3.2.5 5° QUINTO PASO
Desde la consola de comando, listamos la carpeta que estamos trabajando Pysafet para ver el proyecto
que guardamos del directorio .safet/, como se muestra a continuación:
Pysafet $ ls
Nota: Archivos:
GuardarProyecto.py, Proyecto.tar
3.3 Sobre el directorio .safet/
Es importante destacar las características básicas del directorio .safet/, Para ello el comando (tree) ya insta-
lado, nos permite mostrar el contenido en forma de álbol. A continuación seguimos los siguientes pasos:
3.3.1 1° PRIMER PASO
Desde la consola de comando, ejecutaremos comando tree -d ** para obtener la estructura de
directorio **<HOME>.safet/ como se muestra a continuación:
$ tree -d $HOME/.safet/
Nota: Nos mostrara que el contenido es de nueve (9) directorios:
20 Capítulo 3. 3.- Configuración
25. Documentación de PySafet, Publicación
.safet/ # Carpeta principal
|-- certs # Certificados de ejemploss y la CRL,
# Certificate Revocation y lista para verificar
# firmas elctrónicas
|-- dtd # Archivos de validación de los .xml
|-- flowfiles # Diversos ejemplos para el flujo de
# tickets ’workflows’
|-- images # Imagenes en formato png - Portable Network Graphics
|-- input # Archivos de configuración de entrada de datos
|-- log # Archivo de registro de errores
|-- reports # Archivos de reportes de sistemas
|-- sql # Archivos de las base de datos de ejemplo PostgresSQL
|-- xmlrepository #
3.3.2 2° SEGUNDO PASO
Desde la consola de comando, ejecutaremos comando tree para obtener los directorios con su conte-
nido, como se muestra a continuación:
$ tree $HOME/.safet/
Nota: Nos mostrara el contenido de los nueve (9) directorios de ”.safet/”:
3.3. Sobre el directorio .safet/ 21
27. CAPÍTULO 4
4.- Descripción de parámetros del directorio <HOME>.safet/
4.1 auth.conf (Archivo de autenticación y autorización)
En este archivo (auth.conf) se especifican los valores de (autorización, autenticación y conexión) y su
tipo de gestor de base de datos admitidos.
Los tipos de base de base de dato que admite son:
Psql : Postgresql.
Sqlite : sqlite3.
Mysql:
A continuación se explicara las secciones de configuración:
4.1.1 1° PRIMERA SECCION [Database]
En esta sección se configura las fuentes de datos. Una fuente de datos esta asociada a una conexión con una
base de datos relacional. Es posible tener varias fuentes de datos, cada una representada por un índice.
A continuación el siguiente block:
[Database]
# Información de configuración de fuentes de datos.
# Una fuente de datos está asociada a una conexión con una base
# De datos relacional. Es posible tener varias fuentes de datos, cada
# una representada por un índice.
# Especifica el número de fuentes de datos diferentes
database.datasources = 1
Nota: Esté elemento (database.datasources) me indica el número de base de datos, de aquí en adelante
todos los elementos que se requiera estará identificado por el índice asociado a una base de datos.
# Para realizar la conexión de base de datos asociada a una fuente de datos
# Se requieren varios elementos:
23
28. Documentación de PySafet, Publicación
# Nombre de la fuente de datos 1
database.sourcename.1 = nombre_fuente_datos_1
# Especifica el controlador asociado a la fuente de datos
# Tipo de gestor de base de datos admitidos
database.driver.1 = controlador_fuente_datos_1
Nota: Ejemplo: database.driver.1 = psql
# Especifica si la fuente de datos esta activa o no
database.actived.1 = on
# Especifica el nombre de host para la fuente de datos
database.host.1 = host_base_de_datos
Nota: Ejemplo: 127.0.0.0
# Especifica el nombre de la base de datos para la fuente de datos
database.db.1 = nombre_database .1
# Especifica el puerto de conexión para la base de datos
database.port.1 = puerto_database.1
# Especifica el nombre de usuario para la fuente de datos
database.user.1 = usuario_database.1
# Especifica la contraseña de acceso para la fuente de datos
database.password.1 = contrasena_database.1
4.1.2 2° SEGUNDA SECCION [Roles]
En esta sección se definen los roles para un sistema como tal. Un rol comprende dos : command:(2) elemen-
tos:
roles.name.n = nombre del rol n.
roles.description.n = descripción del rol n.
A continuación el siguiente block:
[Roles]
roles.name.1 = Administrador
roles.description.1 = usuario(s) que administra el sistema
roles.name.2 = rol_1
roles.description.2 = descripción del rol
roles.name.3 = rol_2
roles.description.3 = descripción del rol
24 Capítulo 4. 4.- Descripción de parámetros del directorio <HOME>.safet/
29. Documentación de PySafet, Publicación
.
.
.
roles.name.n = rol_n
roles.description.3 = descripción del rol
Nota: Ejemplo: Acciones asociadas al grupo o al usuario con el rol_1, rol_2,rol_n.
4.1.3 3° TERCERA SECCION [Auth]
En esta sección se agrega los usuarios del sistemas, la definición de un usuario comprende cuatro (4) ele-
mentos:
auth.account.n = Nombre del usuario n.
auth.pass.n = Contraseña del usuario n cifrada en md5.
auth.realname = Nombre apellido y correo del usuario n separada por espacio.
auth..role.n = Rol del usuario n, este rol debe está definido en el sección [Roles].
A continuación el siguiente block:
[Auth]
auth.account.1 = usuario 1
auth.pass.1 = 0f885ebbc5a6c77dac0c319a7411f6039496f06f
auth.realname.1 = Nombre_apellido_usuario1 correo_usuario1
auth.role.1 = rol del usuario
auth.account.2 = usuario1
auth.pass.2 = 22cd2d1c596f4091e248aff0e4aa0d47c84b2b36
auth.realname.2 = Nombre_apellido_usuario1 usuario1@mail.com
auth.role.2 = rol del usuario
.
.
.
auth.account.n = usuarion
auth.pass.n = ddc6fdd484d5a71b9619beb8b19a7ea06980d8ff
auth.realname.n = Nombre_apellido_usuarion usuarion@mail.com
auth.role.n = Desarrollador
Nota: Ejemplo:
auth.account.1: admin
auth.pass.1: contraseña del admin en md5
auth.realname.1: admin@mail.com
auth.role.1: Administrador
4.1. auth.conf (Archivo de autenticación y autorización) 25
30. Documentación de PySafet, Publicación
4.1.4 4° CUARTA SECCION [Permises]
En esta sección se van a definir los permisos de los usuarios en función de los roles y acciones que puedan
ejecutar en el sistema.
La definición de cada permisos comprende cuatro: command:(4) elementos:
permises.operation.n = nombre de la operación n a ejecutar (estas acción debe estar definida en el
archivo deftrac.xml que más adelante se explicara).
permises.accounts.n = nombre del o los usuario(s) que ejecutara(n) la operación (esta usuario debe
estar definido en la sección [Auth]). Si son varios usuarios deben estar separados por punto y como
(;) Ejemplo: permises.accounts.n = usuario1;usuario2;usuarion.
permises.types.3 = tipo de acción a ejecutar, entre las acciones tenemos: read,execute y modify deben
ir separadas por punto y como (;) Ejemplo: permises.types.3 = read;execute;modify.
permises.roles.4 = rol que puede ejecutar esta acción, de esta manera se puede indicar a un grupo
de usuarios que tenga un rol en especifico ejecutar la acción sin la necesidad de especificarlo en el
elemento permises.accounts.n, los roles debe estar definidos en la sección [Roles].
A continuación el siguiente block:
[Permises]
permises.operation.1 = operacion_1
permises.accounts.1 = usuario1;admin
permises.types.1 = read;execute;modify
permises.roles.1 = Administrador;rol_1;rol_2
permises.operation.2 = operación_2
permises.accounts.2 = admin
permises.types.2 = read;execute;modify
permises.roles.2 = Administrador
.
.
.
permises.operation.n = operacion_n
permises.accounts.n = admin
permises.types.n = read;execute;modify
permises.roles.3 = Administrador;rol_1;rol_2
# Operaciones de Consulta, Lista de datos y gráficos
permises.operation.24 = Listar_datos
permises.accounts.24 = admin
permises.types.24 = read;execute;modify
permises.roles.24 = Desarrollador;Administrador
permises.operation.25 = Listar_datos_con_autofiltro
permises.accounts.25 = admin
26 Capítulo 4. 4.- Descripción de parámetros del directorio <HOME>.safet/
31. Documentación de PySafet, Publicación
permises.types.25 = read;execute;modify
permises.roles.25 = Administrador
# Viñetas
permises.operation.31 = Formulario
permises.accounts.31 = admin
permises.types.31 = read;execute;modify
permises.roles.31 = Administrador;Desarrollador
permises.operation.32 = Consulta
permises.accounts.32 = admin
permises.types.32 = read;execute;modify
permises.roles.32 = Administrador;Desarrollador
4.2 safet.conf (Archivo de configuración inicial)
En este archivo se especifican los parámetros generales de flujo de trabajo para el funcionamiento de la
librería PySafet.
A continuación los siguientes parámetros generales:
4.2.1 1° PRIMER PARAMETRO [Workflow]
En esta sección se define el color del flujo y Sección para la interfaz Web.
A continuación el siguiente block:
[Workflow]
# Establece el color por defecto
defaultcolor = white
# Establece el color activo
activecolor = white
# Establece el color pasivo
traccolor = white
Nota: Admite: white,black,blue y formato RGB #000000
4.2.2 2° SEGUNDO PARAMETRO [Operators]
En esta sección se establecen las variables de la imágenes de los operadores que son definido en un flujo de
trabajo, entre las variables se encuentra:
4.2. safet.conf (Archivo de configuración inicial) 27
32. Documentación de PySafet, Publicación
split.xor = Se activa un enlace saliente una vez terminada la tarea.
split.and = Activa todos los vínculos salientes una vez terminada esta tarea
split.or = Se utiliza para desencadenar algunos, pero no necesariamente todos los flujos salientes a
otras tareas.
join.xor = Esta tarea se activa cada vez que un nuevo enlace se ha activado.
join.and = Esta tarea se activa cuando todos los vínculos se han activado.
join.or = Esta tarea se activa cuando almeno un vinculo se ha activado.
A continuación el siguiente block:
[Operators]
# Operador split.xor
split.xor = imgs/xor.png
# Operador split.and
split.and = imgs/and.png
# Operador split.or
split.or = imgs/or.png
# Operador join.xor
join.xor = imgs/join-xor.png
# Operador join.and
join.and = imgs/join-and.png
# Operador join.or
join.or = imgs/join-or.png
# Ningun operador
none = imgs/none.png
Nota: Archivo de imagen se encuentra en el directorio <HOME>.safet/imgs
4.2.3 3° TERCER PARAMETRO [Log]
En esta sección se configura las diferentes opciones de la información sobre el registro de los eventos. Entre
las opciones tenemos:
log.filepath = Establece la ruta absoluta donde reside el archivo de registro ejemplo: <HO-
ME>.safet/.log
log.debug = Habilita la opción de registro de mensajes de depuración (on/off)
log.action = Habilita la opción de registro de de mensajes de acciones (on/off)
log.warning = Habilita la opción de registro de de mensajes de advertencia (on/off)
28 Capítulo 4. 4.- Descripción de parámetros del directorio <HOME>.safet/
33. Documentación de PySafet, Publicación
log.error = Habilita la opción de registro de de mensajes de error (on/off)
log.output = Salida del registro de ejecución, las opciones son: default (file), file y screen para panta-
lla.
A continuación el siguiente block:
[Log]
# Establece la ruta absoluta donde reside el archivo de registro
log.filepath = /home/pbuitrago/.safet/log
# Habilita la opción de registro de mensajes de depuración
log.debug = on
# Habilita la opción de registro de mensajes de acciones
log.action = on
# Habilita la opción de registro de mensajes de advertencia
log.warning = on
# Habilita la opción de registro de mensajes de error
log.error = on
# Salida del registro de ejecución,
# las opciones son: default (file), file y screen
log.output = file
4.2.4 4° CUARTO PARAMETRO [XmlRepository]
Información sobre repositorio de documentos firmados electrónica mente bajo el formato “bdoc” (firma
electrónica xml) asociados a flujos de trabajos.
A continuación el siguiente block:
[XmlRepository]
# En caso de utilizar un repositorio de documentos XML remoto se debe
# especificar la informacion de acceso al mismo a traves de un servicio web
xmlrepository.remote.ip = 150.187.36.6
xmlrepository.remote.urlwebservice = http://150.187.36.6/cgi-bin/safet
# Establece el tipo de repositorio de documenfet_auth_conftos XML.
# Valores posibles:
# 1.- (dir): para repositorio basado en un directorio local
# 2.- (dbxml): para repositorio DBXML
xmlrepository.type = dir
# Establece la ruta absoluta al repositorio XML
xmlrepository.path = <HOME>.safet/xmlrepository
# Establece el nombre del repositorio XML
xmlrepository.name = container1
4.2. safet.conf (Archivo de configuración inicial) 29
34. Documentación de PySafet, Publicación
4.2.5 5° QUINTO PARAMETRO [Input]
Opciones para la entrada/modificación de datos
A continuación el siguiente block:
[Input]
# Establece la ruta absoluta para el directorio
# en la entrada/modificación de datos
input.path = <HOME>.safet/input
#input.file = deflista.xml
input.file = deftrac.xml
4.2.6 6° SEXTO PARAMETRO [System]
Opciones generales referentes al funcionamiento (inflow) del tipo de aplicación : Consola/Web/Gráfica.
A continuación el siguiente block:
[System]
# Información referente a la base de datos o repositorio
# para el acceso de la librería
system.evalexit = on
Nota: Preguntar al salir de la aplicación “inflow”.
4.2.7 7° SEPTIMO PARAMETRO [Widgets]
Objetos para entrada de datos.
A continuación el siguiente block:
[Widgets]
# Lector de archivo en el sistema
# lista de archivos de acceso rápido
widgets.getfilewidget.* = <HOME>.safet/flowfiles/mensajes.xml
# Introducción para el widget "wiki"
widgets.texteditwidget.wiki.leftbold = ’’’
widgets.texteditwidget.wiki.rightbold = ’’’
widgets.texteditwidget.wiki.leftitalic = ’’
widgets.texteditwidget.wiki.rightitalic = ’’
widgets.texteditwidget.wiki.leftunderline = __
widgets.texteditwidget.wiki.rightunderline = __
30 Capítulo 4. 4.- Descripción de parámetros del directorio <HOME>.safet/
35. Documentación de PySafet, Publicación
4.2.8 8° OCTAVO PARAMETRO [GeneralOptions]
Esta sección incluye parámetro de uso de opciones generales.
A continuación el siguiente block:
[GeneralOptions]
# Consultas del archivo productos.xml
generaloptions.consoleactions.* = Gráfico Mensajes;
operacion:Generar_gráfico_coloreado
Cargar_archivo_flujo: <HOME>.safet/flowfiles/productos.xml
# Consultas del archivo productos.xml con clave
generaloptions.consoleactions.* = Grafico por clave;
operacion:Generar_gráfico_para_clave
Cargar_archivo_flujo: <HOME>.safet/flowfiles/productos.xml Clave: 1
# Titulo para el gráfico de flujo de trabajo
generaloptions.currentflowtitle = Tareas Proyecto SAFET
# Opciones On (Incluir en el gráfico, No incluir),
# Off si no se quiere incluir
generaloptions.currentflowtitle.font = Dejavu Sans
# Tamaño de la fuente para el texto de informacin
# en cada flujo de trabajo
generaloptions.currentflowtitle.size = 18
# Separación de la fuente para el texto de informacin
# en cada flujo de trabajo
generaloptions.currentflowtitle.separation = 10
# Directorio donde se almacenan los archivos
# de salida grafos(.png,svg)
generaloptions.dir.media = <HOME>PySafet
generaloptions.currentflowtitle.include = off
# Ver http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# Zona horaria
generaloptions.timezone = America/Caracas
# mostrar información estadística en el grafo
generaloptions.extrainfo.showonly = off
generaloptions.extrainfo.showhumanize = on
Nota: opciones:
Mostrar el dialogo para los parámetros para cada documento de flujo de trabajo
Se colocan las opciones generales del sistema SAFET (Lista de acciones guardadas, entre otros)
4.2. safet.conf (Archivo de configuración inicial) 31
36. Documentación de PySafet, Publicación
4.2.9 9° NOVENO PARAMETRO [Stats]
En este parámetro se usa para la estadística de grafos y sus valores para el cálculo de estadísticas.
A continuación el siguiente block:
[Stats]
#Activar la recolección de estadísticas
stats.actived = off
#Fecha de inicio de cálculo de estadística,
# (*) significa que no hay fecha colocada
stats.fromdate = *
#Fecha de fin de cálculo de estadística,
#(*) Significa que no hay fecha colocada
stats.todate = *
4.2.10 10° DECIMO PARAMETRO [Libdigidoc]
Este parámetro es para la firma electrónica y se establece variables de configuración para la librería Libdi-
gidoc utilizada por Libsafet.
A continuación el siguiente block:
[Libdigidoc]
# Ruta del archivo de configuración digidoc para
# usarlo con protocolo OCSP
libdigidoc.configfi:q
lepath = <HOME>.safet/digidoc.conf
# directorio donde se almacenan los certificados de validación
libdigidoc.x509storepath = <HOME>.safet/certs
# Tipo de validación de firma de Digidoc
# "ocsp" : via protocolo OCSP, "keystore": Repositorio
# de claves del navegador Mozilla / Firefox
#libdigidoc.validationtype = keystore
# Tipo de archivos "MIME" permitidos
libdigidoc.mimestypes.* = application/vnd.sun.xml.writer sxw
libdigidoc.mimestypes.* = application/vnd.sun.xml.writer.template stw
libdigidoc.mimestypes.* = application/vnd.sun.xml.writer.global sxg
libdigidoc.mimestypes.* = application/vnd.stardivision.writer sdw vor
libdigidoc.mimestypes.* = application/vnd.stardivision.writer-global sgl
libdigidoc.mimestypes.* = application/vnd.sun.xml.calc sxc
libdigidoc.mimestypes.* = application/vnd.sun.xml.calc.template stc
libdigidoc.mimestypes.* = application/vnd.stardivision.calc sdc
libdigidoc.mimestypes.* = application/vnd.sun.xml.impress sxi
libdigidoc.mimestypes.* = application/vnd.sun.xml.impress.template sti
libdigidoc.mimestypes.* = application/vnd.stardivision.impress sdd sdp
32 Capítulo 4. 4.- Descripción de parámetros del directorio <HOME>.safet/
37. Documentación de PySafet, Publicación
libdigidoc.mimestypes.* = application/vnd.sun.xml.draw sxd
libdigidoc.mimestypes.* = application/vnd.sun.xml.draw.template std
libdigidoc.mimestypes.* = application/vnd.stardivision.draw sda
libdigidoc.mimestypes.* = application/vnd.sun.xml.math sxm
libdigidoc.mimestypes.* = application/vnd.stardivision.math smf
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.text odt
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.text
-template ott
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.text-web oth
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.text-master odm
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.graphics odg
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.graphics
-template otg
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.presentation
odp
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.presentation
-template otp
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.spreadsheet ods
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.spreadsheet
-template ots
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.chart odc
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.formula odf
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.database odb
libdigidoc.mimestypes.* = application/vnd.oasis.opendocument.image odi
libdigidoc.mimestypes.* = application/pdf pdf
libdigidoc.mimestypes.* = application/xml xml
libdigidoc.mimestypes.* = text/plain txt
libdigidoc.mimestypes.* = text/css css
libdigidoc.mimestypes.* = text/xml xml
libdigidoc.mimestypes.* = text/html html
libdigidoc.mimestypes.* = application/x-gzip tgz
libdigidoc.mimestypes.* = application/zip zip
4.2.11 11° DECIMO PRIMERO PARAMETRO [Autofilter]
Este parámetro sirve para opciones de los Auto filtros y para realizar clasificaciones automáticas.
A continuación el siguiente block:
[Autofilter]
autofilter.datetime.period = 672
4.2.12 12° DECIMO SEGUNDO PARAMETRO [DefaultValues]
Opciones que se toman por defecto.
A continuación el siguiente block:
[DefaultValues]
4.2. safet.conf (Archivo de configuración inicial) 33
38. Documentación de PySafet, Publicación
defaultvalues.report = yes
defaultvalues.digidoc.manifest = Investigador
defaultvalues.digidoc.city = Mérida
defaultvalues.digidoc.state = Mérida
defaultvalues.digidoc.country = VE
defaultvalues.digidoc.zip = 5101
defaultvalues.panel.info.secondstohide = 4000
4.2.13 13° DECIMO TERCERO PARAMETRO [Reports]
Opción para la generación de reportes y configuraciones para mostrar información en la aplicación Inflow.
A continuación el siguiente block:
[Reports]
# tipo de protocolo (file,http,ftp,entre otros)
reports.protocol = file
# ruta para obtener la plantilla (HTML)
reports.path = <HOME>.safet/reports
# nombre de la plantilla HTML + AJAX
reports.general.template = <HOME>.safet/reports/sf_plantillaLista01.html
# nombre de la plantilla para documento a firmar
reports.documenttosign.template = <HOME>.safet/reports/
sf_plantillaFirma01.html
# transformar fecha numerica a formato de fecha
reports.options.datetransform = on
reports.options.dateformat = dd/MM/yyyy
4.2.14 14° DECIMO CUARTO PARAMETRO [Graphs]
Opciones Para los gráficos de flujo de trabajo
A continuación el siguiente block:
[Graphs]
#Opciones para el texto de información en cada flujo de trabajo
# opciones on/off
graphs.infotext.include = on
#Formato para el texto de información en cada flujo de trabajo
# (el %date indica Fecha y %time Hora, %datetime Hora y Fecha)
graphs.infotext.format = Generado en %datetime
#Nombre de la fuente para el texto de información en
# cada flujo de trabajo
graphs.infotext.font = Book Antiqua
34 Capítulo 4. 4.- Descripción de parámetros del directorio <HOME>.safet/
39. Documentación de PySafet, Publicación
#Tamaño de la fuente para el texto de información
# en cada flujo de trabajo
graphs.infotext.size = 14
#Separación de la fuente para el texto de información
# en cada flujo de trabajo
graphs.infotext.separation = 30
4.2.15 15° DECIMO QUINTO PARAMETRO [Ftp]
Opción para la trasferencia de archivos utilizando el protocolo FTP.
A continuación el siguiente block:
[Ftp]
ftp.default.server = victorbravo.info
ftp.default.account = victorrbravo
4.2.16 16° DECIMO SEXTO PARAMETRO [ExtraInfo]
Parámetros de la información extra de cada nodo de grafos.
A continuación el siguiente block:
[ExtraInfo]
extrainfo.infotext.fields = owner,porcentage,completed
extrainfo.infotext.separator =
extrainfo.infotext.completed = [*]
# Mostrar campos coloreados (lo ya pasados)
extrainfo.coloured = yes
# Mostrar estadísticas al final del grafo (resumen)
extrainfo.summarize = yes
extrainfo.title = Porcentaje:
extrainfo.formula = sumall
extrainfo.pattern = #PAR0#CLA00-9#CLA1+#PAR1#SLA%
4.2.17 17° DECIMO SEPTIMO PARAMETRO [Plugins]
Opciones para las librerías adicionales Plugins (Complementos o componentes).
A continuación el siguiente block:
4.2. safet.conf (Archivo de configuración inicial) 35
40. Documentación de PySafet, Publicación
[Plugins]
#Ruta donde se encuentra las librerías
# adicionales (plugins)
plugins.path = /usr/lib/libsafet
4.2.18 18° DECIMO OCTAVO PARAMETRO [Plugins.Graphviz]
Componentes para la generación de grafos utilizando la biblioteca Graphviz.
A continuación el siguiente block:
[Plugins.Graphviz]
#Formato de archivo de salida de grafo,
# valores posibles: svg/png/gif
plugins.graphviz.graphtype = svg
# Información a mostrar en cuadro de información
# extra Porc,Tokens,Total,InfoText,InfoDate
plugins.graphviz.extrainfo.show = Porc,Tokens,Total,InfoText,InfoDate
#Color activo de para ser utilizado en los gráficos
plugins.graphviz.task.fillcolor = #f1f1f1
#Color activo de la lnea para ser utilizado en los gráficos
plugins.graphviz.task.color = black
#Atributo utilizado en la estadística,
# opciones posibles (Color/Size/Line/Custom)
plugins.graphviz.stats.attribute = Color
# Tamaño máximo para la estadística de (Tamaño Máximo)
plugins.graphviz.stats.sizemax = 2
# Tamaño mínimo para la estadística de (Tamaño Mínimo)
plugins.graphviz.stats.sizemin = 1
# Color para dibujar estadística
plugins.graphviz.stats.colorgradient = yellow
# Color del texto para cuadro de estadística
plugins.graphviz.stats.fontcolor = black
# Color de fondo para cuadro de estadística
plugins.graphviz.stats.fillcolor = antiquewhite
# Estilo de la línea del cuadro de estadística
plugins.graphviz.stats.style = dashed
# Mostrar cuadro de estadística
plugins.graphviz.showstats = yes
36 Capítulo 4. 4.- Descripción de parámetros del directorio <HOME>.safet/
41. Documentación de PySafet, Publicación
#Dirección del grafo TB (Arriba-Abajo) LR (Izquierda-Derecha)
plugins.graphviz.graph.rankdir = TB
# Tamaño del fuente para todos los nodos
plugins.graphviz.graph.fontsize = 12
# Separador del rank
plugins.graphviz.graph.ranksep = 0.5 equally
# Figura para la tarea (Task)
plugins.graphviz.task.shape = box
# Estilo de la Figura para la tarea
# (Task) filled,bold,dotted,empty
plugins.graphviz.task.style = filled
#Color activo de para ser utilizado en los gráficos
plugins.graphviz.condition.fillcolor = #FFFFFF
#Color activo de la línea para ser utilizado en los gráficos
plugins.graphviz.condition.color = black
# Figura para la (Condition) (box, ellipse, circle, etc.)
plugins.graphviz.condition.shape = ellipse
# Estilo de la Figura para la tarea (Condition)
plugins.graphviz.condition.style = filled
# Mostrar la información extra solo donde existan tokens (fichas)
plugins.graphviz.extrainfo.showwheretokens = on
#Mostrar la estadística en
#el nodo "FINAL", valores admitidos (on/off)
plugins.graphviz.extrainfo.showfinal = on
4.2. safet.conf (Archivo de configuración inicial) 37
42. Documentación de PySafet, Publicación
38 Capítulo 4. 4.- Descripción de parámetros del directorio <HOME>.safet/
43. CAPÍTULO 5
5.- API de Safet para el lenguaje de Python
5.1 Clase MainWindow(Safet.MainWindow)
5.1.1 Constructor (MainWindow (home-usurio))
home-usuario: Directorio del usuario donde se encuentra la carpeta .safet/, como se muestra en el siguiente
ejemplo de script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
# MainWindow
myinflow = Safet.MainWindow(myhome)
5.1.2 Listado de myinflow
1. setHostURL (u) [Procedimiento]:
Coloca el url del servidor web actual, como se muestra en el siguiente ejemplo de script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
# setHostURL
myinflow.setHostURL(myurl)
2. setMediaPath (m) [Procedimiento]:
39
44. Documentación de PySafet, Publicación
Coloca la ruta del directorio de los archivos gráficos„ como se muestra en el siguiente ejemplo de
script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
# setMediaPath
myinflow.setMediaPath(mymedia)
3. addInfoGraphDateText () [Retorna cadenas (String)]:
Agregar la información de fechas al grafo.
4. addNodeToXMLWorkflow (fname,beforenode = “”,nodename = “newnode”,isparallel = fal-
se,options””,query = “”,nodetitle = “”,documentsource = “”) [Retorna cadenas (String)]:
Agregar un nodo al grafo.
5. autoComplete (path) [Retorna cadenas (String)]:
Retorna la lista de autocompletación.
6. changeConnXMLWorkflow (fname,currnode,nextnode,newnode,newoptions = “”,newquery
=”” ) [Retorna cadenas (String)]:
Cambia una conexión entre nodo.
7. checkUserRegister (fullname,account,email,passone,passtwo) [Retorna cadenas (String)]:
Realiza el registro de un nuevo usuario.
8. createBdoc (content) [Retorna verdadero si se ejecuto la acción, en caso contrario retorna falso]:
Crea un documento “bdoc” vacío.
9. currentDATA () [Retorna cadenas (String)]:
Devuelve los datos (DATA) actual.
10. currentError () [Retorna cadenas (String)]:
Devuelve el error actual, como se muestra en el siguiente ejemplo de script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
40 Capítulo 5. 5.- API de Safet para el lenguaje de Python
45. Documentación de PySafet, Publicación
myinflow.setHostURL(myurl)
myconsult = u"operacion:Listar_datos
Cargar_archivo_flujo:/home/cenditel/.safet/flowfiles/productos.xml
Variable: vIniciado"
result = myinflow.login("usuario","usuario")
if not result:
#currentError()
print "Consult failed error: %s" % (myinflow.currentError())
exit()
11. currentGraphTitle () [Retorna cadenas (String)]:
Devuelve el titulo del último gráfo generado.
12. currentJSON () [Retorna cadenas (String)]:
Devuelve la imformación en formato JSON de la última acción generada, como se muestra en el
siguiente ejemplo de script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
myconsult = u"operacion:Listar_datos
Cargar_archivo_flujo:/home/cenditel/.safet/flowfiles/productos.xml
Variable: vIniciado"
result = myinflow.login("usuario","usuario")
if not result:
#currentError()
print "Consult failed error: %s" % (myinflow.currentError())
exit()
# currentJSON()
print u"%s" % (myinflow.currentJSON())
13. currentTable () [Retorna cadenas (String)]:
Obtiene los datos en forma de tabla del último gráfo generado.
14. delNodeToXMLWorkflow (fname,nodename) [Retorna cadenas (String)]:
Elimina un nodo de un gráfo.
15. doLoadConfiguration (fileName)[Procedimiento]:
5.1. Clase MainWindow(Safet.MainWindow) 41
46. Documentación de PySafet, Publicación
Carga un archivo de proyecto, como se muestra en el siguiente ejemplo de script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
# doLoadConfiguration
myinflow.doLoadConfiguration("Proyecto.tar")
16. doSaveConfiguration (fileName)[Procedimiento]:
Guarda un archivo de proyecto (en el directorio .safet/ del usuario actual), como se muestra en el
siguiente ejemplo de script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
# doSaveConfiguration
myinflow.doSaveConfiguration("usuario.tar")
17. doSaveGraph (mypars) [Retorna verdadero si se ejecuto la acción, en caso contrario retorna
falso]:
Guarda los parámetros de último gráfo generado.
18. generateFormFooter (o) [Retorna cadenas (String)]:
Imprime el HTML del pie de pagina general para websafet.
19. generateFormHead (o) [Retorna cadenas (String)]:
Imprime el HTML de la cabecera general para websafet.
20. generateModifyHTML (operation,fieldname,key,secondkey,form) [Retorna cadenas (String)]:
Genera una consulta “AJAX” para los campos de combos de selección.
21. getFlowParameters (flowfilename) [Retorna cadenas (String)]:
Obtiene una lista de parámetros dado un nombre de gráfo.
22. getInfoOfUser (user) [Retorna cadenas (String)]:
Obtiene la información de un usuario.
23. hostMediaPath () [Retorna cadenas (String)]:
42 Capítulo 5. 5.- API de Safet para el lenguaje de Python
47. Documentación de PySafet, Publicación
Obtiene la ruta del directorio de archivos multimedia.
24. hostURL () [Retorna cadenas (String)]:
Obtiene el url del host (websafet).
25. inputPath () [Retorna cadenas (String)]:
Obtiene el directorio (ruta) de las aplicaciónes actual (.safet).
26. lastInfoGraph () [Retorna cadenas (String)]:
Obtiene información sobre el último gráfo generado.
27. loadReportTemplate (json,filename = “”,nameoperation = “Listar_datos”) [Retorna cadenas
(String)]:
Carga una plantilla para generar una salida HTML (websafet).
28. log (message)[Procedimiento]:
Escribe en el “log” de safet <HOME>.safet/log/safet.log.
29. login (name,pass) [Retorna verdadero si se ejecuto la acción, en caso contrario retorna falso]:
Inicia una sesión PySafet, como se muestra en el siguiente ejemplo de script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
myconsult = u"operacion:Listar_datos
Cargar_archivo_flujo:/home/cenditel/.safet/flowfiles/productos.xml
Variable: vIniciado"
#login
result = myinflow.login("usuario","usuario")
30. logout () [Retorna verdadero si se ejecuto la acción, en caso contrario retorna falso]:
Sale una de las sesión PySafet.
31. mediaPath () [Retorna cadenas (String)]:
Obtiene las rutas del directorio “media” utilizando para generar los gráfos (.svg/.png).
32. menuCommands () [Retorna cadenas (String)]:
Obtiene la lista de acciones en formato HTML.
33. menuForm (o) [Retorna cadenas (String)]:
5.1. Clase MainWindow(Safet.MainWindow) 43
48. Documentación de PySafet, Publicación
Obtiene un formulario escrito en HTML correspondiente a una acción en el archivo <HO-
ME>.safet/input/deftrac.xml.
34. postAction () [Retorna cadenas (String)]:
Obtiene la acción posterior a ejecutar en uan operación.
35. registerLogin (user) [Procedimiento]:
Escribe en el registro de PySafet el inicio de una seción.
36. registerLogout (user) [Procedimiento]:
Escribe en el registro de PySafet el inicio de la salida de una sesión.
37. sendCheckEmail (user,plink) [Retorna verdadero si se ejecuto la acción, en caso contrario re-
torna falso]:
Envía un correo de chequeo para el resgistro de un usuario.
38. setConffileValues (values) [Procedimiento]:
Coloca los valores de configuración.
39. setHostMediaPath (m) [Procedimiento]:
Coloca la ruta para los archivo de medias.
40. setTemplatePath (t) [Procedimiento]:
Coloca el directorio de los archivos de plantilla (templates).
41. templatePath () [Retorna cadenas (String)]:
Obtiene el directorio para los archivos de plantilla (templates).
42. toInputConsole (action, withpermises = true) [Retorna verdadero si se ejecuto la acción, en caso
contrario retorna falso]:
Ejecuta una operación de consulta X en el archivo defconsole.xml, como se muestra en el siguiente
ejemplo de script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
myconsult = u"operacion:Listar_datos
Cargar_archivo_flujo:/home/cenditel/.safet/flowfiles/productos.xml
Variable: vIniciado"
# toInputConsole
result = myinflow.toInputConsole(myconsult)
44 Capítulo 5. 5.- API de Safet para el lenguaje de Python
49. Documentación de PySafet, Publicación
43. toInputForm (action, withpermises = true) [Retorna cadenas (String)]:
Se ejecuta una operación de entrada de datos (Formulario) descrita en el archivo de deftrac.xml,
como se muestra en el siguiente ejemplo de script python:
import Safet
import os
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
myconsult = u"operacion:agregar_mensaje Titulo: hola mundo"
# toInputForm
result = myinflow.toInputForm(myconsult)
44. toInputUsers (action) [Retorna verdadero si se ejecuto la acción, en caso contrario retorna fal-
so]:
Ejecuta una acción de gestión de usuarios descrita en el archivo defusers.xml.
5.2 Clase SafetXmlObject (Safet.SafetXmlObject)
5.2.1 Clase SafetXmlObject
{
%TypeHeaderCode
#include "../websafet/src/SafetXmlObject.h"
%End
public:
SafetXmlObject();
bool syncAttributes(const QDomElement&);
};
5.3 Clase SafetDocument
5.3.1 Clase SafetDocument
SafetXmlObject: Esta clase modela un documento de una variable en PySafet (el documento puede ser
firmado electrónicamente).
5.2. Clase SafetXmlObject (Safet.SafetXmlObject) 45
50. Documentación de PySafet, Publicación
5.3.2 Listado de myinflow
1. getCertFileList (ext = ”.pem”) [Retorna cadenas (String)]:
Obtiene la ruta del certificado usado para firmar el documento.
2. numberOfDataFileOnOpenXAdESContainer () [Retorna un entero (int)]:
Número de archivos que contienen el documento firmado.
3. numberOfSignaturesOnOpenXAdESContainer () [Retorna un entero (int)]:
Número de firmas que contienen el documento firmado.
4. getDataFileName (index = 0) [Retorna cadenas (String)]:
Nombre del archivo contenido de índice “index”.
5. getDataFileLength (index = 0) [Retorna un (long)]:
Tamaño del archivo contenodo de índice “index”.
6. getDataFileMimeType (index = 0) [Retorna cadenas (String)]:
Tipo de archivo contenido de índice “indice”.
7. numberOfDataFileAttributes (index = 0) [Retorna un entero (int)]:
Atributo del archivo contenido de índice “indice”.
8. getXmlQuery (query,dcount,info = “”) [Retorna cadenas (String)]:
Obtiene consulta XML.
9. addSignatureToExistingDigidocFile (keyFile,passwd,certFile,inFile,outFile) [Retorna un entero
(int)]:
Agrega un firma al archivo.
10. signWithPrivateKeyOnFile (keyFile, passwd, certFile, inFile, outFile, manifest, city, state,
zip,country, notaryUrl, proxyHost, proxyPort)[Retorna un entero (int)]:
Firma electrónicamente un archivo con un certificado PCKS#LZ.
11. initPKCS11Lib (libName) [Procedimiento]:
Inicia el manejador de la tarjeta inteligente.
12. initDigidocConfigStore (configFile) [Retorna un entero (int)]:
Inicializa la configuración.
13. verifySignMadeWithSmartCard (fileName) [Retorna verdadero si se ejecuto la acción, en caso
contrario retorna falso]
14. verifySignMadeWithSmartCard (fileName,signatureIndex) [Retorna verdadero si se ejecuto la
acción, en caso contrario retorna falso]
15. verifySignMadeWithSmartCard (fileName,listOfSigners,isneg,op = SafetDocument::AND )
[Retorna verdadero si se ejecuto la acción, en caso contrario retorna falso]
46 Capítulo 5. 5.- API de Safet para el lenguaje de Python
51. Documentación de PySafet, Publicación
# (13-15) Verifica una firma electrónica que se realiza utilizando
# la tarjeta inteligente.
16. testSmartCardDriver (slot) [Procedimiento]:
Realiza una prueba a la conexión con la tarjeta inteligente.
17. getCN (signatureIndex) [Retorna cadenas (String)]:
Retorna el nombre común de la firma “signature Index” (commun name) .
18. getSignerIndex (cn) [Retorna un entero (int)]:
Retorna el índice de firma del correspondiente nombre camún (ch).
19. getCommonNameOfSigners () [Retorna cadenas (String)]:
Obtiene una lista con el nombre camún de los firmantes del archivo.
20. getNumberOfPrivateKeys (slot,passwd,libName) [Retorna un entero (int)]:
Obtiene el número de claves privadas utilizados para el archivo.
21. writeFileToDisk (string,name) [Retorna cadenas (String)]:
Escribe en otro archivo el documento.
22. returnFileToString (pathFileName) [Retorna cadenas (String)]:
Convierte el archivo a una cadena.
23. decryptDocument (inFile,outputFile,pin) [Retorna un entero (int)]:
Descifra (decencripta) el archivo.
24. decryptString (inFile,pin)[Retorna cadenas (String)]:
Descifra (decencripta) una cadena.
25. getTempNameFiles (n) [Retorna cadenas (String)]:
Crea “n” archivos temporales.
26. getCommonNameFromCertificate (certPath) [Retorna cadenas (String)]:
Obtiene el nombre camún (CN) de un archivo de certificación.
27. getCountryOfSignature (index = 0) [Retorna cadenas (String)]:
Obtiene el valor de país “country” especificado para la frima electrónica de índice “Index”.
28. getStateOfSignature (index = 0) [Retorna cadenas (String)]:
Obtiene el valor del Estado (STATE) departamento o región especificando para la firma electrónica
de índice “Indice”.
29. getCityOfSignature (index = 0) [Retorna cadenas (String)]:
Obtiene el valor de la Ciudad.
5.3. Clase SafetDocument 47
52. Documentación de PySafet, Publicación
30. getPostalCodeOfSignature (index = 0) [Retorna cadenas (String)]:
Obtiene el valor de código Postal.
31. getCountOfRoles (index = 0) [Retorna un entero (int)]:
Obtiene el número de roles (nominación de cargo del firmante).
32. getRole (index = 0,roleIndex = 0) [Retorna cadenas (String)]:
33. getSingingTime (index = 0) [Retorna cadenas (String)]
34. getSingingTimeOnlyDate (index = 0) [Retorna cadenas (String)]
35. getSingingTimeOnlyHour (index = 0) [Retorna cadenas (String)]
36. getSignatureType (index = 0) [Retorna cadenas (String)]
37. getSignatureFormat (index = 0) [Retorna cadenas (String)]
38. getSignerCertificateIssuerName (index = 0) [Retorna cadenas (String)]
39. getSignerCertificateSerial (index = 0) [Retorna cadenas (String)]
40. getValidAt (index = 0) [Retorna cadenas (String)]
41. getValidUntil (index = 0) [Retorna cadenas (String)]
# (32-42)Obtiene datos del certificado electrónico usado para la firma
# de índice "Indice".
42. getPathOfSafetDocument () [Retorna cadenas (String)]:
Obtiene la ruta donde se guarda los documentos firmados.
43. setPathOfSafetDocument (path) [Procedimiento]
44. getSubjectDN (index = 0) [Retorna cadenas (String)]
45. getIssuerDN (index = 0) [Retorna cadenas (String)]
46. policies (index = 0) [Retorna cadenas (String)]
47. getPublicKeyAlgorithm (index = 0) [Retorna cadenas (String)]
48. getPublicKeyLength (index = 0) [Retorna cadenas (String)]
49. writeX509ToFile (path,PEM,index = 0) [Procedimiento]
QByteArray versionNumber(int index = 0)
QByteArray serialNumber(int index = 0);
QByteArray toHex( const QByteArray &in, QChar separator );
QByteArray authorityKeyIdentifier(int index = 0);
QByteArray subjectKeyIdentifier(int index = 0);
48 Capítulo 5. 5.- API de Safet para el lenguaje de Python
54. Documentación de PySafet, Publicación
5.5.1 Listado de myinflow
1. openXML (a) [Procedimiento]
2. convertXMLtoObjects () [Procedimiento]
3. openDataSources () [Procedimiento]
4. setCurrentPin (p) [Procedimiento]
5. currentPin () [Retorna cadenas (String)]
6. signDocumentsFromData (c,nametowrite,list,doc,withsmartcard = true) [Retorna verdadero si se
ejecuto la acción, en caso contrario retorna falso]
7. verifyDocumentsFromData (data,doc) [Retorna verdadero si se ejecuto la acción, en caso contrario
retorna falso]
8. loadAllConfFiles (option = 3) [Procedimiento]
9. loadPlugins (plugname) [Procedimiento]
5.6 Clase SafetWorkflow
Clase SafetWorkflow: SafetXmlObject
5.6.1 Listado de myinflow
enum OutputFormat { XML, JSON, SVG };
1. SafetWorkflow ()
2. listTasks (inc = false,c = “n”) [Retorna cadenas (String)]
# SafetDocument getDocuments(const QString& idvariable,
# OutputFormat of = XML const QString& info ="");
# SafetDocument getDocuments(const QString& idvariable,
# QList<QSqlField>& fields,int &howmanydocuments,
# OutputFormat of = XML,const QString& info ="");
50 Capítulo 5. 5.- API de Safet para el lenguaje de Python
55. CAPÍTULO 6
6.- Tutorial de un ejemplo de inventario
6.1 Creación de la base de datos
SQLITE es un gestor de bases de datos muy ligero y potente. Por sus características se utiliza en una
gran variedad de aplicaciones, como Skype, Mozilla Firefox, Adobe Photoshop Elements, el navegador web
Opera, ...; y por supuesto en KEME-Contabilidad, donde es una alternativa para el almacenamiento de las
contabilidades, junto con MySQL y PostgreSQL.
Las bases de datos bajo SQLITE se almacenan en un archivo que puede ser accedido por un programa mo-
nitor interactivo en modo texto denominado sqlite3. Mediante esta aplicación se pueden efectuar consultas
y ediciones utilizando sentencias SQL.
Si estamos acostumbrados a utilizar MySQL o Postgres, sabemos que disponemos de aplicaciones para la
administración de estas bases de datos bajo interfaz gráfica. Los máximos exponentes son las aplicaciones
PHPmyADMIN y PgAdmin. Pues bien, para el caso de SQLITE estamos de enhorabuena porque dispone-
mos de un plugin para el navegador Firefox que se denomina SQLITE Manager y que nos va a permitir
la administración y consulta de nuestras bases de datos locales. Más información en el siguiente enlace
Administración gráfica de SQLITE con SQLite Manager
En este tutorial crearemos la base de datos y sus 2 entidades (productos y productos_registro) con el
plugins (sqlite-manager), para trabajar con el modelo de (inventario). Permitiendo así el aprendizaje de
PySafet.
Las dos tablas (productos) y (productos_registro) significa los siguiente:
La tabla (productos): Representa la lista de fichas (token) en los flujos de trabajo (Wonkflow).
La tabla (productos_registros): Representan la lasta de eventos de cambio de estado (status) en los
flujos de trabajo.
A continuación seguimos los siguiente pasos:
6.1.1 A.- Instalación del plugins (sqlite-manager) en el navegador web
1° PRIMER PASO
Nos vamos al siguiente enlace Sqlite-Manager.
51
56. Documentación de PySafet, Publicación
2° SEGUNDO PASO
Damos click al botón + Add to Firefox, como se muestra en la Figura 12: Agregar Sqlite-manager.:
Figura 6.1: Figura 12: Agregar Sqlite-manager.
3° TERCER PASO
Damos click en el botón Permitir para permitir la instalación en el navegador Web, como se muestra
en la Figura 13: Permitir la instalación.:
4° CUARTO PASO
Damos click en el botón Instalar para la instalación, como se muestra en la Figura 14: Instalar el
plugins.:
52 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
57. Documentación de PySafet, Publicación
Figura 6.2: Figura 13: Permitir la instalación.
Figura 6.3: Figura 14: Instalar el plugins.
6.1. Creación de la base de datos 53
58. Documentación de PySafet, Publicación
5° QUINTO PASO
Damos click en el botón Reiniciar para reiniciar el navegador web, como se muestra en la Figura 15:
Reiniciar navegador.:
Figura 6.4: Figura 15: Reiniciar navegador.
6.1.2 B.- Creación de la base de datos con el plugins Sqlite-Manager
1° PRIMER PASO
1. Abrimos el navegador web.
2. Buscamos en la barra de herramientas del navegador web, el plugins Sqlite-Manager.
3. Damos clik a la opción Sqlite-Manager.
Observen la siguiente Figura 16: Plugins (Sqlite-Manager):
2° SEGUNDO PASO
Configuramos la extensión de la base de datos, para ello nos vamos a la opción de herramientas
(Opciones), como se muestra en la Figura 17: Configuración.:
54 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
59. Documentación de PySafet, Publicación
Figura 6.5: Figura 16: Plugins (Sqlite-Manager)
Figura 6.6: Figura 17: Configuración.
6.1. Creación de la base de datos 55
60. Documentación de PySafet, Publicación
3° TERCER PASO
Cambiamos la extensión por defecto (sqlite) por la extensión (db) y pulsamos en el botón (Cerrar),
como se muestra en la Figura 18: Extensión.:
Figura 6.7: Figura 18: Extensión.
4° CUARTO PASO
Damos click a la opción (Nueva base de datos), como se muestra en la siguiente Figura 19: Opción
para crear la base de datos:
56 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
61. Documentación de PySafet, Publicación
Figura 6.8: Figura 19: Opción para crear la base de datos
6.1. Creación de la base de datos 57
62. Documentación de PySafet, Publicación
5° QUINTO PASO
Agregamos el nombre de la base de datos, por ejemplo (mydb) y pulsamos en el botón (Aceptar),
como se muestra en la siguiente Figura 20: Nombre de la (base de datos):
Figura 6.9: Figura 20: Nombre de la (base de datos)
6° SEXTO PASO
Guardamos la base de datos en el directorio <HOME>.safet/, para ello buscamos el directorio y
damos click al botón (Abrir), como aparece en la siguiente Figura 21: Guardar la (Base de datos):
6.1.3 C.- Creación de la tabla (productos)
La tabla (productos) contiene los atributos (id, mensaje, status, cantidad, nombre, pedir), para ello se-
guimos los siguientes pasos:
58 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
63. Documentación de PySafet, Publicación
Figura 6.10: Figura 21: Guardar la (Base de datos)
1° PRIMER PASO
Buscamos en la barra de herramientas la opción (Tabla) y damos click en (Crear Tabla), como se
muestra en la siguiente Figura 22: Opción (Crear tabla):
2° SEGUNDO PASO
Llenáremos el formulario, colocando el nombre de la tabla (productos) y los atributos (id, mensaje,
status, cantidad, nombre, pedir), como se muestra en la siguiente Figura 23: tabla (productos:
Nota: El atributo (id) es una clave primaria y va a tener un contador.
3° TERCER PASO
Se nos muestra un mensaje si deseamos realizar la operación, le decimos que (si), como se muestra
en la siguiente Figura 24: Mensaje de la tabla:
6.1. Creación de la base de datos 59
64. Documentación de PySafet, Publicación
Figura 6.11: Figura 22: Opción (Crear tabla)
Figura 6.12: Figura 23: tabla (productos
60 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
65. Documentación de PySafet, Publicación
Figura 6.13: Figura 24: Mensaje de la tabla
4° CUARTO PASO
Observamos la tabla (productos) con los campos creados en la base de datos, como se muestra en la
siguiente Figura 25: Tabla creada (productos):
6.1.4 D.- Creación de la tabla (productos_registro)
La tabla (productos_registros) contiene los atributos (id, productoid, fecha, reqstatus), para ello seguimos
los siguientes pasos:
1° PRIMER PASO
Buscamos en la barra de herramientas la opción (Tabla) y damos click en (Crear Tabla), como se
muestra en la siguiente Figura 26: Opción (Crear tabla):
2° SEGUNDO PASO
Llenáremos el formulario, colocando el nombre de la tabla (productos_registro) y los atributos (id,
productoid, fecha, reqstatus), como se muestra en la siguiente Figura 27: tabla productos_registros:
6.1. Creación de la base de datos 61
66. Documentación de PySafet, Publicación
Figura 6.14: Figura 25: Tabla creada (productos)
Figura 6.15: Figura 26: Opción (Crear tabla)
62 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
67. Documentación de PySafet, Publicación
Figura 6.16: Figura 27: tabla productos_registros
Nota: El atributo (id) es una clave primaria y va a tener un contador.
3° TERCER PASO
Se nos muestra un mensaje si deseamos realizar la operación, le decimos que (si), como se muestra
en la siguiente Figura 28: Mensaje de la tabla:
Nota: Si durante el tutorial les ocurrió algún error en la creación de base de datos o tablas,
podemos descargar la base de datos (mydb.db) en el siguiente enlace. Click aquí (mydb.db):
6.2 Operaciones CRUD+(flujo) utilizando PySafet
Las operaciones CRUD, son acciones generales que representan un modelo basíco para la creación de siste-
ma de información. Puede ser una descripción más detallada en el siguiente enlace SOBRE CRUD.
Los operaciones que vamos a utilizar son las siguientes:
1. C (Insertar)
6.2. Operaciones CRUD+(flujo) utilizando PySafet 63
68. Documentación de PySafet, Publicación
Figura 6.17: Figura 28: Mensaje de la tabla
Figura 6.18: Click aquí (mydb.db)
64 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
69. Documentación de PySafet, Publicación
2. R (Listar*)
3. U (Actualizar)
4. D (Borrar o Eliminar)
5. + (Flujo de trabajo)
El simbolo “+” indica las adición de operaciones asociada a flujo de trabajo. Las operaciones se alojan en
una archivo llamado deftrac.xml, que se ubica en el directorio <HOME>.safe/input/, la cual se podara
ejecutar estas operaciones mensionadas.
Este archivo debe crearce y contiene una estructura a seguir para ello comenzaremos con los siguientes
pasos:
6.2.1 A.- Encabezado (Información de Autor).
Este archivo deftrac.xml contiene un encabezado como el siguiente:
1° PRIMER PASO
Creamos el archivo deftrac.xml en el directorio <HOME>.safe/input/.
.safet/input$ touch deftrac.xml
2° SEGUNDO PASO
Abrimos el archivo deftrac.xml, insertamos el siguiente encabezado:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Documento : deftrac.xml
Creado : Fulano de tal
Autor : Fulano de tal
Descripcion: Archivo de Entrada para SAFET - Inflow
-->
3° TERCER PASO
Debajo del encabezado insertamos la ruta del validador XML(formato DTD):
<!DOCTYPE operations SYSTEM
"file:///home/cenditel/.safet/dtd/yawlinput.dtd">
6.2.2 B.- Operaciones CRUD+(flujo)
Las operaciones CRUD comienzan con la etiqueta principal <operations> donde se le asignan las opera-
ciones principales Agregar,Modificar,Eliminar,Listar”.
6.2. Operaciones CRUD+(flujo) utilizando PySafet 65
70. Documentación de PySafet, Publicación
En el archivo deftrac.xml, insertamos el siguiente código:
<operations suffix=":" commandname="operacion">
<operation name="Productos"
desc="Agregar,Modificar,Eliminar,Listar"
icon="firmadoc.png">
</operation>
6.2.3 1° Primera operación CRUD+ “C(Insertar)”
Las operaciones en PySafet consiste en una lista de comandos que se ejecutan secuencialmente.
Los comandos se componen de campos “Fields” que corresponden a los diferentes tipos de datos básicos y
complejos. Por ejemplo analicemos el código XML del archivo deftrac.xml (operación agregar pruducto).
Se define los siguiente:
1. El tipo de comando es “agregar”.(type), los tipos posibles son “agregar”,”actualizar” y “elimi-
nar”.
2. La tabla de la base de datos donde se realizará el comando “command” es “productos”.
3. Luego se especificar la lista de campos “fields”. Para este campo se especificaran dos campos, el
nombre del producto “Nombre”, y el estado del producto que tomará el valor literal “literal”, “Re-
gistrado”.
4. El segundo comando de la operación “Agregar_producto” también es del tipo “Agregar” y ojo
los campos que son necesarios para registrar el eventos “Agregar_producto” en la tabla “produc-
tos_registro”.
5. La palabra de PySafet “_USERNAME” se utiliza para obtener el usuario actual.
A continuación se mostrara la operación para el archivo “deftrac.xml”:
1° PRIMER PASO
Abrimos el archivo deftrac.xml, insertamos la primera operación:
<operation name="agregar_producto" desc="" icon="plus.png">
<command id ="1" type="agregar" table="productos" >
<fields>
<field type="string" icon="resumen.png" mandatory="yes"
validation="" title="Nombre" desc="">
nombre
</field>
<field type="string" literal="Registrado" mandatory="yes" >
status
</field>
</fields>
66 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
71. Documentación de PySafet, Publicación
</command>
<command id ="1" type="agregar" table="productos_registro" >
<fields>
<field type="datetime" mandatory="yes"
function="seq from sqlite_sequence where
name=’productos’" input="no">
productoid
</field>
<field type="datetime" mandatory="yes" function="datetime(’now’)"
format="time_t" input="no">
fecha
</field>
<field type="string" literal="_USERNAME" mandatory="yes" >
rol
</field>
<field type="string" literal="Registrado" mandatory="yes" >
regstatus
</field>
</fields>
</command>
</operation>
2° SEGUNDO PASO
Creamos el archivo .py por ejemplo Script.py en el directorio <HOME>.
$ touch Script.py
Abrimos el archivo que creamos Script.py, insertamos el siguiente código:
# -*- coding: utf-8 -*-
# D(Borrar o eliminar)
# myconsult = u"operacion:borrar_producto id:5"
# U(Actualizar)
#myconsult = u"operacion:modificar_producto id:3 Nombre:Amoxicilina"
# +(Flujo de trabajo)
# myconsult = u"operacion:Actualizar_producto id:3
# Estado_producto: Pedido"
# Importación de la librería Safet y os
import Safet
import os
6.2. Operaciones CRUD+(flujo) utilizando PySafet 67
72. Documentación de PySafet, Publicación
# Aqui obtengo mi home,media y url
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
# Constructor principal
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
# Si no es un usuario registrado el metodo "login" retorna False
result = myinflow.login("admin","admin")
# Operación C(Insertar)
# Agregamos el poducto a ingresar por ejemplo "Champu Olorin",
# "ComplejoB","Aspirina","Acetaminofén","Ibuprofeno".
myconsult = u"operacion:agregar_producto Nombre: Champu Olorin"
if result:
result = myinflow.toInputForm(myconsult)
else:
print "n ---Usuario autenticado---n"
exit()
if result:
print "n --Se Actualizo correctamente el producto---n"
else:
print "n No se Actualizo el producto....!!!n"
if not result:
print "nConsulta failed error: %sn" % (myinflow.currentError())
exit()
print u" %sn" % (myinflow.currentJSON())
Nota: Este Script contiene la operación:
Operación: agregar_producto
Nombre: El nombre del Producto agregar
3° TERCER PASO
Ejecutamos el archivo .py(Script.py), desde la consola de comando como usuario normal:
68 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
73. Documentación de PySafet, Publicación
$ python $HOME/Script.py
Nota: Nos mostrara un mensaje como nos aparece en la siguiente Figura 31: Insertar producto
Figura 6.19: Figura 31: Insertar producto
4° CUARTO PASO
Abrimos la base de datos (mydb.db) con el plugins Sqlite-Manager y verificamos si realizó la operación
correctamente, como se muestra en la siguientes imagenes:
1.- Observamos la tabla (productos): Figura 32: Tabla (productos)
2.- Observamos la tabla (productos_registro): Figura 33: Tabla (productos_registro)
6.2.4 2° Segunda operación CRUD+ “D(Borrar o Eliminar)”
Esta operación consiste en Borrar un producto de la base de datos para ello seguimos los siguientes pasos:
1° PRIMER PASO
Abrimos el archivo desctrac.xml del directorio <HOME>.safe/input/, insertamos la siguiente ope-
ración:
<operation name="borrar_producto" desc="Eliminar " icon="clear.png">
<command id ="1" type="eliminar" table="productos">
<fields>
<field type="combolisttable"
options="id:productos::id || ’ - ’ || nombre"
mandatory="yes"
6.2. Operaciones CRUD+(flujo) utilizando PySafet 69
74. Documentación de PySafet, Publicación
Figura 6.20: Figura 32: Tabla (productos)
Figura 6.21: Figura 33: Tabla (productos_registro)
70 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
75. Documentación de PySafet, Publicación
primarykey="yes"
title="id"
order="desc">
id
</field>
id
</field>
</fields>
</command>
<command id ="1" type="eliminar" table="productos_registro">
<fields>
<field type="string" mandatory="yes" title="id" >
productoid
</field>
</fields>
</command>
</operation>
2° SEGUNDO PASO
Abrimos el archivo Script.py y combiamos la operación en la variable myconsulta como se muestra
en el siguiente código:
# -*- coding: utf-8 -*-
# C(Insertar)
# Agregamos el poducto a ingresar por ejemplo "Champu Olorin",
# "ComplejoB","Aspirina","Acetaminofén","Ibuprofeno".
#myconsult = u"operacion:agregar_producto Nombre: ComplejoB"
# U(Actualizar)
#myconsult = u"operacion:modificar_producto id:3 Nombre:Amoxicilina"
# +(Flujo de trabajo)
# myconsult = u"operacion:Actualizar_producto id:3
# Estado_producto: Pedido"
# Importación de la librería Safet y os
import Safet
import os
# Aqui obtengo mi home,media y url
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
6.2. Operaciones CRUD+(flujo) utilizando PySafet 71
76. Documentación de PySafet, Publicación
# Constructor principal
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
# Si no es un usuario registrado el metodo "login" retorna False
result = myinflow.login("admin","admin")
# Operación D(Borrar o eliminar)
# Eliminamos el porducto numero 5
myconsult = u"operacion:borrar_producto id:5"
if result:
result = myinflow.toInputForm(myconsult)
else:
print "n ---Usuario autenticado---n"
exit()
if result:
print "n --Se borro correctamente el producto---n"
else:
print "n No se borro el producto....!!!n"
if not result:
print "nConsulta failed error: %sn" % (myinflow.currentError())
exit()
print u" %sn" % (myinflow.currentJSON())
Nota: En este Script se utiliza la operación “borrar_producto”:
• Operación: borrar_producto
• id: Aqui colocaremos el valor de id del producto por ejemplo borraremos el producto Ibupro-
feno y su id es 5. Observe la Figura 32: Tabla (productos)
3° SEGUNDO PASO
Ejecutamos el archivo Script.py, desde la consola de comando:
$ python $HOME/Script.py
Nota: Nos mostrara un mensaje como nos aparece en la siguiente Figura 34: Eliminar producto
72 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
77. Documentación de PySafet, Publicación
Figura 6.22: Figura 34: Eliminar producto
4° CUARTO PASO
Abrimos la base de datos con el plugins Sqlite-Manager y verificamos si realizó la operación correctamente
como se muestra en la siguientes imagenes:
1.- Observamos la tabla (productos): Figura 35: Tabla (productos)
Figura 6.23: Figura 35: Tabla (productos)
2.- Observamos la tabla (productos_registro): Figura 36: Tabla (productos_registro)
6.2. Operaciones CRUD+(flujo) utilizando PySafet 73
78. Documentación de PySafet, Publicación
Figura 6.24: Figura 36: Tabla (productos_registro)
6.2.5 3° Tercera operación CRUD+ “U(Actualizar)”
Esta operación U(Actualizar) consiste en actualizar o modificar el nombre de un producto de la base de
datos, para ello seguimos los siguientes paso:
1° PRIMER PASO
Abrimos el archivo desctrac.xml del directorio <HOME>.safe/input/, insertamos la siguiente ope-
ración:
<operation name="modificar_producto" desc="" icon="plus.png">
<command id ="1" type="actualizar" table="productos" >
<fields>
<field type="combolisttable"
options="id:productos::id || ’ - ’ || nombre"
mandatory="yes"
primarykey="yes"
title="id"
order="desc">
id
</field>
<field type="string" icon="resumen.png" mandatory="yes" validation=""
title="Nombre" desc="">
nombre
74 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
79. Documentación de PySafet, Publicación
</field>
</fields>
</command>
</operation>
2° SEGUNDO PASO
Abrimos el archivo Script.py y combiamos la operación myconsulta como se muestra en el siguiente
código:
# -*- coding: utf-8 -*-
# C(Insertar)
# Agregamos el poducto a ingresar por ejemplo "Champu Olorin",
# "ComplejoB","Aspirina","Acetaminofén","Ibuprofeno".
#myconsult = u"operacion:agregar_producto Nombre: ComplejoB"
# D(Borrar o eliminar)
# Eliminamos el porducto numero 5
#myconsult = u"operacion:borrar_producto id:5"
# +(Flujo de trabajo)
# myconsult = u"operacion:Actualizar_producto id:3
# Estado_producto: Pedido"
# Importación de la librería Safet y os
import Safet
import os
# Aqui obtengo mi home,media y url
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
# Constructor principal
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
# Si no es un usuario registrado el metodo "login" retorna False
result = myinflow.login("admin","admin")
# U(Actualizar)
# Se actualizara el nombre del producto número 3
myconsult = u"operacion:modificar_producto id:3 Nombre:Amoxicilina"
6.2. Operaciones CRUD+(flujo) utilizando PySafet 75
80. Documentación de PySafet, Publicación
if result:
result = myinflow.toInputForm(myconsult)
else:
print "n ---Usuario autenticado---n"
exit()
if result:
print "n --Se Actualizo correctamente el producto---n"
else:
print "n No se Actualizo el producto....!!!n"
if not result:
print "nConsulta failed error: %sn" % (myinflow.currentError())
exit()
print u" %sn" % (myinflow.currentJSON())
Nota: Seguidamente vamos a utilizar esta operación “Actualizar_producto” en un Script de python
como se muestra a continuación:
• Operación: Actualizar_producto
• id: Aqui colocaremos el valor del producto por ejemplo vamos a actualizar el producto Aspirina
y su id es 3. Observe la Figura 32: Tabla (productos)
• Nombre: Aqui se coloca el nombre al que le vamos a modificar por ejemplo Amoxacilina por
Aspirina.
3° TERCER PASO
Ejecutamos el archivo Script.py, desde la consola de comando:
$ python $HOME/Script.py
Nota: Nos mostrara un mensaje como nos aparece en la siguiente Figura 37: Actualizar pro-
ducto
4° CUARTO PASO
Abrimos la base de datos (mydb.db) con el plugins Sqlite-Manager y verificamos si realizó la operación
correctamente como se muestra en la siguiente: Figura 38: Tabla (productos)
76 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
81. Documentación de PySafet, Publicación
Figura 6.25: Figura 37: Actualizar producto
Figura 6.26: Figura 38: Tabla (productos)
6.2. Operaciones CRUD+(flujo) utilizando PySafet 77
82. Documentación de PySafet, Publicación
6.2.6 4° Cuarta operación CRUD+ “+ (Flujo de trabajo (Estado))”
1° PRIMER PASO
Abrimos el archivo desctrac.xml del directorio <HOME>.safe/input/, insertamos la siguiente ope-
ración:
<operation name="Actualizar_producto" desc="" icon="padlock.png">
<command id ="1" type="actualizar" table="productos">
<fields>
<field type="combolisttable"
options="id:productos::id || ’ - ’ || nombre"
mandatory="yes"
primarykey="yes"
title="id"
order="desc">
id
</field>
<field type="comboflow" mandatory="yes" options="next"
path="/home/cenditel/.safet/flowfiles/productos.xml"
title="Status_producto">
status
</field>
</fields>
</command>
<command id ="1" type="agregar" table="productos_registro" >
<fields>
<field type="datetime" mandatory="yes"
function="seq from sqlite_sequence where name=’productos’"
input="no">
productoid
</field>
<field type="datetime" mandatory="yes" function="datetime(’now’)"
format="time_t" input="no">
fecha
</field>
<field type="string" literal="_USERNAME" mandatory="yes" >
rol
</field>
<field type="string" title="Status" mandatory="yes" >
regstatus
</field>
78 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
83. Documentación de PySafet, Publicación
</fields>
</command>
</operation>
2° SEGUNDO PASO
Abrimos el archivo Script.py y combiamos la operación myconsulta como se muestra en el siguiente
código:
# -*- coding: utf-8 -*-
# C(Insertar)
# Agregamos el poducto a ingresar por ejemplo "Champu Olorin",
# "ComplejoB","Aspirina","Acetaminofén","Ibuprofeno".
#myconsult = u"operacion:agregar_producto Nombre: ComplejoB"
# D(Borrar o eliminar)
# Eliminamos el porducto numero 5
#myconsult = u"operacion:borrar_producto id:5"
# U(Actualizar)
# Se actualizara el nombre del producto número 3
#myconsult = u"operacion:modificar_producto id:3 Nombre:Amoxicilina"
# Importación de la librería Safet y os
import Safet
import os
# Aqui obtengo mi home,media y url
myhome = os.getenv("HOME")
mymedia = myhome + "/tmp"
myurl = "http://localhost"
# Constructor principal
myinflow = Safet.MainWindow(myhome)
myinflow.setMediaPath(mymedia)
myinflow.setHostURL(myurl)
# Si no es un usuario registrado el metodo "login" retorna False
result = myinflow.login("admin","admin")
# +(Flujo de trabajo)
# Se actualizara su estado
myconsult = u"operacion:Actualizar_producto id:3 Estado_producto:Pedido"
if result:
6.2. Operaciones CRUD+(flujo) utilizando PySafet 79
84. Documentación de PySafet, Publicación
result = myinflow.toInputForm(myconsult)
else:
print "n ---Usuario autenticado---n"
exit()
if result:
print "n --Se actualizo el producto correctamente el producto---n"
else:
print "n No se actualizo el producto....!!!n"
if not result:
print "nConsulta failed error: %sn" % (myinflow.currentError())
exit()
print u" %sn" % (myinflow.currentJSON())
Nota: Seguidamente vamos a utilizar esta operación “Actualizar_producto” en un Script de python
como se muestra a continuación:
• Operación: Actualizar_producto
• id: Aqui colocaremos el valor de id del producto por ejemplo vamos a actualizar el producto
Aspirina y su id es 3. Observe la Figura 32: Tabla (productos)
• Estado_producto: Aqui se coloca el estado del producto es decir si es por lle-
gar,Agotarse,Pedido,En Espera. En este caso esta Registrado vamos a modificarlo a pedido.
3° TERCER PASO
Ejecutamos el archivo Script.py, desde la consola de comando:
$ python $HOME/Script.py
Nota: Nos mostrara un mensaje como nos aparece en la siguiente Figura 39: Actualizar estado
Figura 6.27: Figura 39: Actualizar estado
80 Capítulo 6. 6.- Tutorial de un ejemplo de inventario
85. Documentación de PySafet, Publicación
4° CUARTO PASO
Abrimos la base de datos (mydb.db) con el plugins Sqlite-Manager y verificamos si realizó la operación
correctamente como se muestra en la siguientes imagenes:
1.- Observamos la tabla (productos): Figura 40: Tabla (productos)
Figura 6.28: Figura 40: Tabla (productos)
2.- Observamos la tabla (productos_registro): Figura 41: Tabla (productos_registro)
6.2.7 5° Quinta operación CRUD+ “(Siguiente estado)”
1° PRIMER PASO
Abrimos el archivo desctrac.xml del directorio <HOME>.safe/input/, insertamos la siguiente ope-
ración:
<operation name="Siguiente_estado_producto" desc="" icon="padlock.png">
<command id ="1" type="actualizar" table="productos">
<fields>
<field type="combolisttable"
options="id:productos::’(’|| id || ’)’ || nombre"
mandatory="yes"
primarykey="yes"
6.2. Operaciones CRUD+(flujo) utilizando PySafet 81
86. Documentación de PySafet, Publicación
Figura 6.29: Figura 41: Tabla (productos_registro)
changekey="yes"
title="id"
order="desc" >
id
</field>
<field type="comboflow" mandatory="yes" options="next"
path="/home/debian/.safet/flowfiles/productos_siguiente_Estado.xml"
title="Siguiente_status" changefor="id">
status
</field>
</fields>
</command>
<command id ="1" type="agregar" table="productos_registro" >
<fields>
<field type="datetime" mandatory="yes"
function="seq from sqlite_sequence where name=’productos’" input="no">
productoid
</field>
<field type="datetime" mandatory="yes" function="datetime(’now’)"
format="time_t" input="no">
fecha
82 Capítulo 6. 6.- Tutorial de un ejemplo de inventario