SlideShare una empresa de Scribd logo
1 de 591
Descargar para leer sin conexión
Documentación de PySafet
Publicación
Cenditel
23 de March de 2015
Índice general
1. 1.- Introducción 1
1.1. ¿Qué es PySafet? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Arquitectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3. Organización de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4. Motivación y objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.5. Ejemplos de algunos Diagrama de flujo de trabajo . . . . . . . . . . . . . . . . . . . . . . 3
1.6. Sistema Automatizado de Firma Electrónica y Estampado Electrónico . . . . . . . . . . . . 6
2. 2.- Instalación 7
2.1. Debian Wheezy 7.6.0 (64 bits/32bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2. Ubuntu (32 bits/ 64 bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3. Desde los Archivos fuentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4. Herramienta inflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3. 3.- Configuración 17
3.1. Cargar un proyecto(Productos) en el directorio .safet/ . . . . . . . . . . . . . . . . . . . . 17
3.2. Guardar el proyecto del directorio .safet/ . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3. Sobre el directorio .safet/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4. 4.- Descripción de parámetros del directorio <HOME>.safet/ 23
4.1. auth.conf (Archivo de autenticación y autorización) . . . . . . . . . . . . . . . . . . . . . 23
4.2. safet.conf (Archivo de configuración inicial) . . . . . . . . . . . . . . . . . . . . . . . . . 27
5. 5.- API de Safet para el lenguaje de Python 39
5.1. Clase MainWindow(Safet.MainWindow) . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.2. Clase SafetXmlObject (Safet.SafetXmlObject) . . . . . . . . . . . . . . . . . . . . . . . . 45
5.3. Clase SafetDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.4. Clase SafetVariable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.5. Clase SafetYAWL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.6. Clase SafetWorkflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6. 6.- Tutorial de un ejemplo de inventario 51
6.1. Creación de la base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2. Operaciones CRUD+(flujo) utilizando PySafet . . . . . . . . . . . . . . . . . . . . . . . . 63
I
6.3. Crear el flujo de trabajo utilizando un archivo XML . . . . . . . . . . . . . . . . . . . . . 85
6.4. Ver datos usando flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.5. Ver fichas usando flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.6. Ver gráficos coloreado usando flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . 139
6.7. Parámetros usando flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7. 7.- Tutorial del “ejemplo de inventario” usando la interfaz gráfica (Inflow) 163
7.1. Introducción a inflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
7.2. Ejecución de operaciones CRUD+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.3. Ejecución de listados de reportes normal . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
7.4. Ejecución de listados de reportes con parámetros . . . . . . . . . . . . . . . . . . . . . . 241
7.5. Ejecución de listados de reportes con Autofiltros . . . . . . . . . . . . . . . . . . . . . . . 256
7.6. Ejecución de gráficos usando flujos de trabajos normal . . . . . . . . . . . . . . . . . . . 278
7.7. Ejecución de gráficos usando flujos de trabajos con parámetros . . . . . . . . . . . . . . . 301
7.8. Ejecución de gráficos usando flujos de trabajos con autofiltros . . . . . . . . . . . . . . . 320
7.9. Diseño de creación de un nuevo gráfico de flujo de trabajo (.xml) . . . . . . . . . . . . . . 333
7.10. Diseño de agregar nuevos nodos al gráfico (.xml) . . . . . . . . . . . . . . . . . . . . . . 358
7.11. Diseñar el cambio de conexiones de nodos enlazados . . . . . . . . . . . . . . . . . . . . 378
7.12. Diseño de borrar un nodos del gráficos de flujo de trabajo . . . . . . . . . . . . . . . . . . 399
8. 8.- Tutorial del “ejemplo de inventario” usando la interfaz gráfica (Framework Web-Safet) 413
8.1. Instalación y configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
8.2. Ejecución de operaciones CRUD+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
8.3. Ejecución de listados de reportes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
8.4. Ejecución de gráficos de flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
8.5. Ejecución de gráficos de flujos de trabajo de seguimiento . . . . . . . . . . . . . . . . . . 477
9. 9.- Tutorial de firma electrónica 501
9.1. Conceptos básico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
9.2. Instalación de los componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
9.3. Uso de la firma electrónica de manera Web . . . . . . . . . . . . . . . . . . . . . . . . . . 503
10. Documentación del sistema de Plan Operativos Anuales(POA) 509
10.1. 1.- Instroducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
10.2. 2.- Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
10.3. 3.- Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
10.4. 4.- Secciones del Editorflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
10.5. 5.- Ejemplo paso a paso de la herramienta EditFlow . . . . . . . . . . . . . . . . . . . . 570
II
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Documentación de PySafet, Publicación
22 Capítulo 3. 3.- Configuración
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
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/
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
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/
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
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/
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
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/
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
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/
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
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/
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
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/
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
Documentación de PySafet, Publicación
38 Capítulo 4. 4.- Descripción de parámetros del directorio <HOME>.safet/
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
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
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
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
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
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
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
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
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
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
Documentación de PySafet, Publicación
5.4 Clase SafetVariable
Clase SafetVariable : SafetXmlObject
5.4.1 Listado de myinflow
1. addChild (SafetXmlObject) [Procedimiento]
2. id () [Retorna cadenas (String)]
3. setId () [Procedimiento]
4. tokenlink (s) [Retorna cadenas (String)]
5. setTokenlink (b) [Procedimiento]
6. scope (a) [Retorna cadenas (String)]
7. setScope (z) [Procedimiento]
8. type () [Retorna cadenas (String)]
9. setType (a) [Procedimiento]
10. config () [Retorna cadenas (String)]
11. setConfig (q) [Procedimiento]
12. source () [Retorna cadenas (String)]
13. setSource (f) [Procedimiento]
14. documentsource () [Retorna cadenas (String)]
15. setDocumentsource (w) [Procedimiento]
16. description () [Retorna cadenas (String)]
17. setDescription (f) [Procedimiento]
18. foo () [Retorna cadenas (String)]
19. getDocumentCount () [Retorna un entero (int)]
20. getXMLDocument (value,fieldno,documentid) [Retorna cadenas (String)]
21. createXMLFileFromQuery (query,outputFileName) [Retorna cadenas (String)]
QList<SafetDocument*>& getDocuments();
5.5 Clase SafetYAWL
Clase SafetYAWL : SafetXmlObject
5.4. Clase SafetVariable 49
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation
Pysafet workflow and json library documentation

Más contenido relacionado

La actualidad más candente

La actualidad más candente (13)

Sql server desde0
Sql server desde0Sql server desde0
Sql server desde0
 
Electrónica digital: DIseño e implementacion de la plataforma Boole-Weblab-De...
Electrónica digital: DIseño e implementacion de la plataforma Boole-Weblab-De...Electrónica digital: DIseño e implementacion de la plataforma Boole-Weblab-De...
Electrónica digital: DIseño e implementacion de la plataforma Boole-Weblab-De...
 
Desarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaDesarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-java
 
Manual de c# 2
Manual de c# 2Manual de c# 2
Manual de c# 2
 
Instalacion de fedora español
Instalacion de fedora españolInstalacion de fedora español
Instalacion de fedora español
 
Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapa
 
Fedora 14-software management-guide-es-es
Fedora 14-software management-guide-es-esFedora 14-software management-guide-es-es
Fedora 14-software management-guide-es-es
 
Fwpa doc-desarrollo
Fwpa doc-desarrolloFwpa doc-desarrollo
Fwpa doc-desarrollo
 
My sql query browser
My sql query browserMy sql query browser
My sql query browser
 
Manual Jsf
Manual JsfManual Jsf
Manual Jsf
 
19
1919
19
 
Powershell
PowershellPowershell
Powershell
 
Python desde 0
Python desde 0Python desde 0
Python desde 0
 

Similar a Pysafet workflow and json library documentation

Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapaTabu Carlos
 
Desarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaDesarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaFreddy Quina
 
Manual completo python
Manual completo pythonManual completo python
Manual completo pythonalan moreno
 
pfc_jose_ignacio_perez_2007
pfc_jose_ignacio_perez_2007pfc_jose_ignacio_perez_2007
pfc_jose_ignacio_perez_2007Jos P
 
MANUAL DE LENGUAJE C
MANUAL DE LENGUAJE CMANUAL DE LENGUAJE C
MANUAL DE LENGUAJE Cclaudiocj7
 
Archi_NlayerApp
Archi_NlayerAppArchi_NlayerApp
Archi_NlayerAppzinousss
 
pensar_en_cpp-vol1.pdf
pensar_en_cpp-vol1.pdfpensar_en_cpp-vol1.pdf
pensar_en_cpp-vol1.pdfmacario17
 
Introduccion a nodejs
Introduccion a nodejs Introduccion a nodejs
Introduccion a nodejs Erik Gur
 
Introduccion a nodejs_a_traves_de_koans_ebook
Introduccion a nodejs_a_traves_de_koans_ebookIntroduccion a nodejs_a_traves_de_koans_ebook
Introduccion a nodejs_a_traves_de_koans_ebookJose Luis Fernandez
 
Fundamentos de Programación con Lenguaje de Programación C++
Fundamentos de Programación con Lenguaje de Programación C++Fundamentos de Programación con Lenguaje de Programación C++
Fundamentos de Programación con Lenguaje de Programación C++Andy Juan Sarango Veliz
 
El lenguaje de programación c++
El lenguaje de programación c++El lenguaje de programación c++
El lenguaje de programación c++Darkcame
 
kupdf.net_bases-de-datos.pdf
kupdf.net_bases-de-datos.pdfkupdf.net_bases-de-datos.pdf
kupdf.net_bases-de-datos.pdfDnyNone
 
Proyecto final facultad de ingeniería.pdf
Proyecto final facultad de ingeniería.pdfProyecto final facultad de ingeniería.pdf
Proyecto final facultad de ingeniería.pdfceranobrian52
 
Matlab adv esp
Matlab adv espMatlab adv esp
Matlab adv espLuis Maury
 

Similar a Pysafet workflow and json library documentation (20)

Libro javacontapa
Libro javacontapaLibro javacontapa
Libro javacontapa
 
Desarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaDesarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-java
 
PLC
PLC PLC
PLC
 
Tfm javier eduardo_carrillo_plaza
Tfm javier eduardo_carrillo_plazaTfm javier eduardo_carrillo_plaza
Tfm javier eduardo_carrillo_plaza
 
Manual completo python
Manual completo pythonManual completo python
Manual completo python
 
pfc_jose_ignacio_perez_2007
pfc_jose_ignacio_perez_2007pfc_jose_ignacio_perez_2007
pfc_jose_ignacio_perez_2007
 
MANUAL DE LENGUAJE C
MANUAL DE LENGUAJE CMANUAL DE LENGUAJE C
MANUAL DE LENGUAJE C
 
Sistema operativo
Sistema operativoSistema operativo
Sistema operativo
 
Symfony2 es
Symfony2 esSymfony2 es
Symfony2 es
 
Archi_NlayerApp
Archi_NlayerAppArchi_NlayerApp
Archi_NlayerApp
 
SORYP.pdf
SORYP.pdfSORYP.pdf
SORYP.pdf
 
pensar_en_cpp-vol1.pdf
pensar_en_cpp-vol1.pdfpensar_en_cpp-vol1.pdf
pensar_en_cpp-vol1.pdf
 
Introduccion a nodejs
Introduccion a nodejs Introduccion a nodejs
Introduccion a nodejs
 
Introduccion a nodejs_a_traves_de_koans_ebook
Introduccion a nodejs_a_traves_de_koans_ebookIntroduccion a nodejs_a_traves_de_koans_ebook
Introduccion a nodejs_a_traves_de_koans_ebook
 
Fundamentos de Programación con Lenguaje de Programación C++
Fundamentos de Programación con Lenguaje de Programación C++Fundamentos de Programación con Lenguaje de Programación C++
Fundamentos de Programación con Lenguaje de Programación C++
 
El lenguaje de programación c++
El lenguaje de programación c++El lenguaje de programación c++
El lenguaje de programación c++
 
kupdf.net_bases-de-datos.pdf
kupdf.net_bases-de-datos.pdfkupdf.net_bases-de-datos.pdf
kupdf.net_bases-de-datos.pdf
 
Proyecto final facultad de ingeniería.pdf
Proyecto final facultad de ingeniería.pdfProyecto final facultad de ingeniería.pdf
Proyecto final facultad de ingeniería.pdf
 
Matlab adv esp
Matlab adv espMatlab adv esp
Matlab adv esp
 
Open xava manual
Open xava manualOpen xava manual
Open xava manual
 

Más de Víctor Bravo Bravo

Más de Víctor Bravo Bravo (6)

Autorización y Autenticación: REST API para ESB
Autorización y Autenticación: REST API para ESBAutorización y Autenticación: REST API para ESB
Autorización y Autenticación: REST API para ESB
 
SAFET: Generador de aplicaciones con fima electrónica
SAFET: Generador de aplicaciones con fima electrónicaSAFET: Generador de aplicaciones con fima electrónica
SAFET: Generador de aplicaciones con fima electrónica
 
Firma electrónica en procesos de negocios
Firma electrónica en procesos de negociosFirma electrónica en procesos de negocios
Firma electrónica en procesos de negocios
 
Victor bravocibsi2011
Victor bravocibsi2011Victor bravocibsi2011
Victor bravocibsi2011
 
RelacionesYFunciones
RelacionesYFuncionesRelacionesYFunciones
RelacionesYFunciones
 
SAFET
SAFETSAFET
SAFET
 

Pysafet workflow and json library documentation

  • 2.
  • 3. Índice general 1. 1.- Introducción 1 1.1. ¿Qué es PySafet? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2. Arquitectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3. Organización de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.4. Motivación y objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.5. Ejemplos de algunos Diagrama de flujo de trabajo . . . . . . . . . . . . . . . . . . . . . . 3 1.6. Sistema Automatizado de Firma Electrónica y Estampado Electrónico . . . . . . . . . . . . 6 2. 2.- Instalación 7 2.1. Debian Wheezy 7.6.0 (64 bits/32bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2. Ubuntu (32 bits/ 64 bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.3. Desde los Archivos fuentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.4. Herramienta inflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3. 3.- Configuración 17 3.1. Cargar un proyecto(Productos) en el directorio .safet/ . . . . . . . . . . . . . . . . . . . . 17 3.2. Guardar el proyecto del directorio .safet/ . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.3. Sobre el directorio .safet/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4. 4.- Descripción de parámetros del directorio <HOME>.safet/ 23 4.1. auth.conf (Archivo de autenticación y autorización) . . . . . . . . . . . . . . . . . . . . . 23 4.2. safet.conf (Archivo de configuración inicial) . . . . . . . . . . . . . . . . . . . . . . . . . 27 5. 5.- API de Safet para el lenguaje de Python 39 5.1. Clase MainWindow(Safet.MainWindow) . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5.2. Clase SafetXmlObject (Safet.SafetXmlObject) . . . . . . . . . . . . . . . . . . . . . . . . 45 5.3. Clase SafetDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.4. Clase SafetVariable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.5. Clase SafetYAWL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.6. Clase SafetWorkflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 6. 6.- Tutorial de un ejemplo de inventario 51 6.1. Creación de la base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 6.2. Operaciones CRUD+(flujo) utilizando PySafet . . . . . . . . . . . . . . . . . . . . . . . . 63 I
  • 4. 6.3. Crear el flujo de trabajo utilizando un archivo XML . . . . . . . . . . . . . . . . . . . . . 85 6.4. Ver datos usando flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 6.5. Ver fichas usando flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 6.6. Ver gráficos coloreado usando flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . 139 6.7. Parámetros usando flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 7. 7.- Tutorial del “ejemplo de inventario” usando la interfaz gráfica (Inflow) 163 7.1. Introducción a inflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 7.2. Ejecución de operaciones CRUD+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 7.3. Ejecución de listados de reportes normal . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 7.4. Ejecución de listados de reportes con parámetros . . . . . . . . . . . . . . . . . . . . . . 241 7.5. Ejecución de listados de reportes con Autofiltros . . . . . . . . . . . . . . . . . . . . . . . 256 7.6. Ejecución de gráficos usando flujos de trabajos normal . . . . . . . . . . . . . . . . . . . 278 7.7. Ejecución de gráficos usando flujos de trabajos con parámetros . . . . . . . . . . . . . . . 301 7.8. Ejecución de gráficos usando flujos de trabajos con autofiltros . . . . . . . . . . . . . . . 320 7.9. Diseño de creación de un nuevo gráfico de flujo de trabajo (.xml) . . . . . . . . . . . . . . 333 7.10. Diseño de agregar nuevos nodos al gráfico (.xml) . . . . . . . . . . . . . . . . . . . . . . 358 7.11. Diseñar el cambio de conexiones de nodos enlazados . . . . . . . . . . . . . . . . . . . . 378 7.12. Diseño de borrar un nodos del gráficos de flujo de trabajo . . . . . . . . . . . . . . . . . . 399 8. 8.- Tutorial del “ejemplo de inventario” usando la interfaz gráfica (Framework Web-Safet) 413 8.1. Instalación y configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 8.2. Ejecución de operaciones CRUD+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 8.3. Ejecución de listados de reportes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 8.4. Ejecución de gráficos de flujos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 8.5. Ejecución de gráficos de flujos de trabajo de seguimiento . . . . . . . . . . . . . . . . . . 477 9. 9.- Tutorial de firma electrónica 501 9.1. Conceptos básico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 9.2. Instalación de los componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 9.3. Uso de la firma electrónica de manera Web . . . . . . . . . . . . . . . . . . . . . . . . . . 503 10. Documentación del sistema de Plan Operativos Anuales(POA) 509 10.1. 1.- Instroducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 10.2. 2.- Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 10.3. 3.- Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 10.4. 4.- Secciones del Editorflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 10.5. 5.- Ejemplo paso a paso de la herramienta EditFlow . . . . . . . . . . . . . . . . . . . . 570 II
  • 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
  • 26. Documentación de PySafet, Publicación 22 Capítulo 3. 3.- Configuración
  • 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
  • 53. Documentación de PySafet, Publicación 5.4 Clase SafetVariable Clase SafetVariable : SafetXmlObject 5.4.1 Listado de myinflow 1. addChild (SafetXmlObject) [Procedimiento] 2. id () [Retorna cadenas (String)] 3. setId () [Procedimiento] 4. tokenlink (s) [Retorna cadenas (String)] 5. setTokenlink (b) [Procedimiento] 6. scope (a) [Retorna cadenas (String)] 7. setScope (z) [Procedimiento] 8. type () [Retorna cadenas (String)] 9. setType (a) [Procedimiento] 10. config () [Retorna cadenas (String)] 11. setConfig (q) [Procedimiento] 12. source () [Retorna cadenas (String)] 13. setSource (f) [Procedimiento] 14. documentsource () [Retorna cadenas (String)] 15. setDocumentsource (w) [Procedimiento] 16. description () [Retorna cadenas (String)] 17. setDescription (f) [Procedimiento] 18. foo () [Retorna cadenas (String)] 19. getDocumentCount () [Retorna un entero (int)] 20. getXMLDocument (value,fieldno,documentid) [Retorna cadenas (String)] 21. createXMLFileFromQuery (query,outputFileName) [Retorna cadenas (String)] QList<SafetDocument*>& getDocuments(); 5.5 Clase SafetYAWL Clase SafetYAWL : SafetXmlObject 5.4. Clase SafetVariable 49
  • 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