Capitulo 8

Manejo de Workflows

Una de las fortalezas de Plone es su componente de workflow. Los Workflows es uno de los temas base de content management, que es la seperación de la lógica, el contenido y la presentación. Este capítulo tratará los workflows detalladamente.

Este capítulo comienza cubriendo algunas definiciones claves relacionadas con los workflows, con las herramientas claves involucradas, de modo que usted pueda empezar a conceptualizar lo referente a workflows. Una vez que los conceptos estén claros, entonces entraremos a discutir como agregar y corregir sus propios workflows.

A traves de este capitulo, haré referencia a cambios simples que usted puede realizar al workflow. Tambien doy una serie de ejemplos para ayudarle a realizar tareas tales como crear notificaciones, contenido móvil, etcétera. Finalmente muestro algunas de características mas avanzadas del desarrollo de workflows y algunas de las herramientas mas útiles disponibles.

¿Qué es Workflow?

Workflow es una cadena de eventos que ocurren sobre algo para alcanzar un objetivo. Los Workflows expresan las reglas de negocios que pueden existir. Cada negocio tiene diversas reglas y políticas sobre las tareas que deben hacerse dentro de la compañía. Algunos ejemplos de esto son:

El workflow separa la lógica de estas reglas de negocio y estandariza el concepto del pensamiento acerca de estos cambios. Teniendo la logica separada, es fácil ahora cambiar la aplicacion para que se amolde a los negocios y reglas de negocios.

Comprendiendo los Workflows en plone

La herramienta Workflow de plone provee ciertas caracteristicas y limitaciones que es clave comprender. El producto workflow usado en plone es DCWorkflow el cual es un producto opensource lanzado por Zope Corporation. hay disponibles otros sistemas de workflows, orientados a diferentes conceptos como lo son a las tareas etc, algunos de ellos estan incorporados en Plone. como OpenFlow. Sin embargo DCWorkflow es bastante simple y de gran alcance, proporciona toda la funcionalidad que la mayoria de usuarios necesitan.

DCWorkflow asume que hay un objeto en el sistema este es el objetivo del workflow por ejemplo, una piesa de contenido, asume mas adelante que todos los objetos del mismo tipo pasan con el mismo workflow.

Puesto que el sistema DCworkflow se incluye en Plone, no hay que instalarlo. Es representado en el ZMI por el objeto portal_workflow.

Conceptualización de un workflow

Antes de explicar Workflows, explicare algunos terminos simples: estados, transiciones.

Un estado es informacion sobre un articulo del contenido en un momento particular. los ejemplos de estados son:  privado, publico, pendiente y visible. Todos los workflows tienen un estado inicial. El workflow entonces movera el contenido en una serie de estados, por la interaccion del usuario o por un cierto proceso automatizado. Cuando el contenido alcanza un estado final, seguira estando en este estado por mucho tiempo. El contenido puede pasar por mas de un estado en el proceso del workflow.

Para que un contenido pase de un estado a otro es nesesario una transicion. Una transiocion conecta un estado que comienza a un estado que termina. una transicion puede tener diversas caracteristicas asociadas a ella, usted vera mas adelante esto, Una transicion es iniciada generalmete por una accion externa, tal como un usuario presiona un boton en la pagina web o un script interactuando con la pagina.

Visualizar un workflow, especialmete cuando se habla de algo cuyo contenido no es muy claro, puede ser algo confuso. Pensar en una ocurrencia diaria nos ayudara. en ete caso, el ejemplo siguiente nos muestra el pago de una targeta de credito, esto se lleva a cabo cada mes:

Para este caso usted puede tener diferentes estados. Mirando los pasos anteriores, usted no vera la nesecidad de crear diversos estados para recibir la cuenta, que incluye la apertura de la cuenta y el ponerla en el escritorio. igualmente, usted no nesecita molestarse con cada revision que suceda. Aun que estos son todos los pasos validos que ocurren, el intentar hacer un workflow para cada estado seria demasiado incomodo. En lugar de esto, usted puede resumir el workflow con los siguientes estados:

Ahora que usted acaba de ver los estados, usted puede pensar en los cambios que deben ocurrir. Para cada uno de estos casos, usted tendra por lo menos una transicion que servira para mover una la cuenta de un estado al otro:

Esta transicion conectaria el estado borrador con el estado revisado.

Este estado conectaria el estado revisado con el estado pagado.

Esta transicion conectaria el estado revisado con el estado borrador, es decir regresariamos al inicio del workflow.

img(1)

Comprendiendo Roles y Seguridad en los workflows

En cualquier sistema complejo, usted tendra usuarios para todos los roles y grupos. estos roles dan a Plone una gran flexibilidad y seguridad, pero tambien puede ser complicado.

El capítulo 9 trata sobre seguridad, Roles locales, y grupos, pero en este capitulo trataremos sobre como estos asuntos se relacionan con los workflows.

Cuando una piesa de contenido es movida de un estado a otro, el workflow puede procesar los cambios de seguridad sobre este contenido. los ajustes de la seguridad determinan que usuario puede realizar que accion sobre que piesa de contenido. Al manipular los ajustes de la seguridad del workflow, usted puede causar el cambio de una pieza de contenido durante el ciclo de vida. Los usuarios de sistema estaticos como Zope tienden a confundirse por que en Zope, todas las piezas de contenido tienen los mismos ajustes de seguridad a traves de su ciclo de vida.

Regresando al ejemplo anterior, usted puede inferir los ajustes a la seguridad para la cuenta de la tajeta de credito. Una de las formas de representar esto es produciendo una tabla que amplie la seguridad en teminos generales para las transiciones que pueden ocurrir en cada uno de los diferentes estados.

tabla tansiciones y estados que pueden hacer(8.1)

Usted a visto las transiciones y quien puede ejecutarlas. Pero uste no a pensada en el acceso que cada usuario tiene en cada punto del flujo. ¿¿Por ejemplo, en las cuales alguien puede corregir la cuenta y cuando puede ser vista ?? esto se llaman acciones.

segun la tabla 8.2 yo tengo acceso a ver la cuenta de mis targetas de credito,asi mismo el banco en cualquier momento puede ver la cuenta de la targeta de credito y contestar a mis preguntas.

Actualmente, yo no puedo editar la cuenta de mi targeta de credito; solamente el banco puede editarla cuando el estado es borrador. yo puedo devolver mi cuenta al ser rechazada. En esta situacion, se asume que el banco es el propietario de la cuenta de la targeta de credito. Esto demuestra un concepto llamado Propiedad.

Yo puedo tener varias cuentas de targetas de credito de varios bancos, y en cada caso usted puede pensar en el banco como el duenño. Cada banco posee sus propias cuentas de targetas de credito, pero el banco A no es dueño de las cuentas del banco B. la tabla 8.3 combina las transiciones y las acciones, cambiando los terminos yo y banco por beneficiario y propietario, respectivamente.

tabla(8.3) tansiciones y acciones combinadas, mas los roles de las personas.

Por supuesto, esto es solo un ejemplo, pero ilustra como usted puede aplicar workflows a los estado basicos, mas tansiciones y estados pueden ocurrir, eso depende de la complejidad del problema.

Antes de ver como crear y modificar workflows, veremos el workflow por defecto con el que viene Plone.

Introduccion a los Workflows de Plone

Plone viene con un sistema de workflows por defecto para su sitio Plone. Estos workflows proporcionan una manera logica de mover los contenidos atraves de un sitio Plone. Un sitio Plone estandar viene con dos workflows. el workflow por defecto y el workflow de la carpeta. Las secciones siguientes presentan cada uno alternadamente.

Workflow por defecto

En el capitulo 3 se trato el workflow por defecto y los ajustes con los cuales viene por defecto al publicar un contenido. Se discutio la seguridad y los ajustes para cada estado en el workflow. Sin embargo, una imagen vale mas de mil palabras, asi la imagen (8.2) muestra los estados del workflow.

img(8.2) el contenido del workflow por defecto de plone.

La figura (8.2) muestra los estados principales y las transiciones. Esta imagen tiene un linea gris punteada que representa una divicion de la seguridad. a la azquierda de la linea es donde los dueños del contenido obran reciprocamente generalmete con el contenido. a la derecha de la linea es donde los revisores interactuan con el contenido.

NOTA: El propietario del contenido es la persona que creo el contenido originalmente. Un propietario es un miembro particular de un sitio Plone. Aunque hayan muchos miembros en un sitio Plone, solamente una persona puede ser el propietario de una piesa de contenido en un sitio Plone. Por que el rol de propietario es calculado cuando un objeto es creado, el rol propietario es especial.

La Tabla 8.4 moldea los permisos para los contenidos en los diferentes estados.

tabla(8.4) workflow por defecto.

View hace referencia a los siguientes permisos: acceso a la informacion del contenido y verlos. edit hace referencia a los siguientes permisos: modificar el contenido.

Como puede ver en la tabla (8.4), por defecto solamente cuando el estado esta en privado, esta oculto en realidad para cada uno. Cuando el contenido esta en el estado publicado, solo el administrador puede editarlo. Luego en la seccion editando permisos explicare como pueden cambiaar estos permisos facilmente por la web.

Workflow Folder

tambiem se discutio en el capitulo 3, cuando toque el tema de el contenido que se publica. Sin embargo, como mostre en aquel capitulo, no exise el estado pendiente en aquel workflow. En este caso usted tiene un workflow levemente mas sencillo segun lo demuestra la imagen (8.3)

img (8.3) El workflow folder para Plone.

Otros Workflows

Numerosos workflows estan disponibles para un sitio Plone, incluyendo workflows privados, comunitarios, workflows de un solo paso de publicasion, etc. ZopeZen viene con un workflow, y Plone CollectorNG viene con un workflow. DCWorkflow viene con cuatro workflows.

Actualmete, vienen dos workflows en el producto PloneWorkflows en el proyecto colectivo sobre SourceForge el worflow de la comunidad y el workflow de un solo paso de la publicacion. El wokflow de un solo paso en la publicacion tiene solo dos estados Privado y Publicado.

Es el momento que, usted no tiene ninguna forma facil de instalar y desinstalar los workflow, y usted no tiene un manera verdaderamente facil de pasar de el contenido entre un estado y otro. Por ejemplo, si usted instala el workflow de un solo pasa de publicacion en un estado existente, usted nesecitara arreglar los estados para todos los objetos y moverlos dentro de un estado nuevo. en este caso, todos los contenidos que esten en un estado privado solo podran ser pasados a un estado publicado y viceversa.

Añadiendo y editando Workflows

Despes de dar click en portal_workflow usted vera una lista de asignaciones del workflows. Una caracterisiteca de DCWorkflow es que cada tipo de objeto tiene un solo workflow asignado a el; La imagen (8.4) muestra esta asignacion.

http://www.cogniware.net/Members/guio/work_flow/work_flow2.png

imagen 8.4 lista de workflow por tipo.

En esta pagina usted vera una lista de cada tipo de contenido y el workflow que a sido asignado a este. Si un workflow no es especificado a este no le sera aplicado ningun workflow, Por ejemplo, por defecto el para el tipo Portal Site esta en blanco. Usted en realidad no desea intentar transicionar (transitioning) el sitio en si mismo, apenas los objetos en el contenidos. Si el valor es (Default), el workflow por defecto al es aplicado al tipo de contenido. En la figura 8.4 para topics y folder_workflow el workflow utilizado es folder_workflow y para todos los otros tipos de contenido es asignado plone_workflow. El nombre de el workflow hace referencia a el nombre del objeto workflow importado o creado dentro de la herramienta workflow. para mas informacion sobre los workflows disponibles, seleccione la solapa de contenido. Esta abre una lista de los workflows que han sido cargados dentro del sistema, vea la imagen 8.5.

http://www.cogniware.net/Members/guio/work_flow/work_flow3.png

imagen 8.5 workflows disponibles

Usted puede añadir workflows oprimiendo el boton añadir workflow. este boton habre una lista de workflows disponibles; para crear un workflow, seleccione un tipo de workflow e ingrese el nombre del nuevo workflow.

Editando un Workflow

En la solapa Contenido, usted puede dar click en un workflow para acceder al la pantalla de administracion de ese workflow: todos los estados, transiciones, y caracteristicas asociadas. La serie de solapas que se encuentranen la parte superior de la pagiana. manegan la funcionalidad de un workflow bastante bien:Estados, Transiciones, Variables, Listas de trabajo, Scripts y Permisos.Entrare a cada una de las solapas y algunas otras opciones disponibles. A menos que esten mencionadas de otra manera, todas las solapas son accesibles desde la pagina principal del workflow.

Crear o editar workflows puede requerir de porciones de (clicking)y puede ser un poco confuso. si usted es un diseñador acostumbrado a usar el sistema de ficheros, entonces usted puede hacer todo esto con Python esto lo trataremos mas adelante en la seccion escribiendo un workflow en python

Ajustando el estado inicial

Para seleccionar el estado inicial, vaya a la solapa de Estados y compruebe los estados disponibles; Al lado de uno de los estados vera un asterisco, segun se ve en la imagen 8.6

http://www.cogniware.net/Members/guio/work_flow/work_flow4.png

imagen 8.6 ajustando el estado inicial para un workflow.

Usted fija el estado inicial seleccionando el estado y luego oprimiendo el boton Set Initial State. Todos los contenidos creados, de ahora en adelante con este workflows tendran este estado inicial. Usted solo puede selccionar un estado inicial por workflow.

¿Como Ajustar como el estado inicial como Privado?

En algunos sitios puede tener sentido que el contenido no se muestre en el momento de ser creado y que solo el administrador y el propietario tengan acceso a este. la mejor manera de hacer esto es tomar como estado inicial el estado Privado. En el estado Privado solo los administradores y los propietarios pueden ver realmente el articulo.

Para tomar el estado inicial por defecto Privado debemos ingrezar al la herramienta portal_workflow luego seleccionar la solapa Contenido luego dar click en plone_workflow seleccione la solapa Estados y entonces seleccione el estado que va a quedar por defecto como estado inicial y damos click en el boton Set Initial State. ahora el estado inicial sera Privado y nungun usuario a parte del administrador o el propietario tendra acceso a el.

Editando Estados

La solapa de Estados lista todos los estado disponibles para este workflow. Al inicio de este capitulo se explico que un estado represena a un objeto en un punto particular de tiempo. cada estado tiene una identificacion que es unica; este es por lo jeneral un vervo como lo son Pendiente , Publicado .Para agregar un estado, de una identificacion y oprima el boton agregar, este sera añadido a la lista de estados del workflow.

Usted tambien vera las siguientes opciones:

Titulo: El titulo del estado sera mostrado en su sitio Plone.

Descripcion: La descripcion del estado es una descripcion larga del mismo. Esto no sera mostrado a los usuarios, puede servir como informacion respecto a lo que hace el estado para aclarar dudas a futuros administradores.

Transiciones Posibles: Esto enumera todas las transiciones que pueden partir de de este estado. Esta lista solo le mostrara las transiciones que hay en el sistema. Simple mente selecciones las transiciones que nesecita para este estado, usted esta seleccionando el punto de partida para esta transicion desde este estado.

Para modificar un estado, ingese los cambios y oprima el boton salvar cambios. Al dar click sobre el estado creado se abrira una ventana la cual nos permitira editar el estado, en esta ventan nos aparece una solapa Permisos si la seleccionamos nos aparesera los permisos que tendra el objeto en este estado, esto quiere decir que podemos cambiar los permisos de los contenidos cuando cambian de estado. la forma de acerlo es muy facil, lo unico que debemos hacer es seleccionar los permisos que debe tener cada rol y listo segun como se muestra en la imagen 8.7

http://www.cogniware.net/Members/guio/work_flow/work_flow6.png

imagen 8.7 Pagina de permisos de estados.

Si usted a los permisos para un estado particular del workflow, los cambios no seran aplicados a ningun objeto que pase por este estado, este quedara con los permisos viejos, lo que debe hacer es cuando termine de hacer todos los cambios, vaya a la pagina del workflow en la raiz y presione el boton de actualizar la seguridad como se muestra en la imagen 8.4 La actualizacion de estos datos dependen de el numero de objetos que se han acutualizado.

La solapa Variables permite asignar valores a las variables cuando un objeto se encuetra en este estado. El workflow determina las variables disponibles para cada estado. para mayor informacion ver la seccion. Editando variables.

Editando Transiciones.

La solapa transiciones lista todas las transiciones que pueden ocurrir en este workflow. Al inicio de este capitulo se trato como una transicion representa los cambios que le ocrren a los objetos. Cada transicion tiene algunas variables. Para agregar una transicion, ingrese una identificacion y oprima el boton Agregar que se encuentra al fondo de la pagina. segun lo muestra la imagen 8.8

http://www.cogniware.net/Members/guio/work_flow/work_flow9.png

imagen 8.8 detalles de la pagina de transicion.

Si usted ahora oprime una transicion , usted vera los sigientes detalles de esa transicion:

De estos valores, el estado destino es absolutamente interesante. aunque he mencionado ya que las transiciones cambian normalmente el estado, esto no siempre es asi. Porque cada transicion puede corre los scripts y escribir algo en el historial. Esto Pede ser util algunas veces que no cambia el estado. para un ejemplo de esto, vea la seccion siguiente de en este capitulo Usando workflows para seguir cambios. Si su transicionno cambia el estado del contenido entonces selecciones el nuevo estado como estado de destino.

Una transicion puede tener multiples puntos de partida pero solo un punto de destino; Si Usted nesecita destinos multiples, tendra que crear multiples transiciones. Usted puede especificar los scripts que correran antes y despues de esta transicion. Dos ejemplos comunes es: mover un objeto en el workflow y ademas enviar una notificacion por E-Mail. La seccion Ejemplos de tareas comunes, trata este ejemplo.

Antes que la transicion se ejecutada se comprueba primero la las condiciones de seguridad para asegurarse que el el usuario que la ejecuta tenga los derechos de hacerlo. La seguridad tiene los tres siguienes componentes:

Editando Variables

La solapa Variables lista las variables que han sido creadas y modificadas en el workflow. En esta seccion trataremos este tema.

no siempre es posible, y no es recomendale que lo intente, encapsular toda la informacion que usted nesecita en un workflow dentro de estados y transiciones. en lugar de esto, usted puede utilizar variables para almacenar sierta informacion. relacionado al workflow. Por ejemplo, en el ejemplo de la tarjeta de credito, la cuenta se podria pagar por diferentes medios ( por internet, cheque, etc). usted podria almacenar el metodo la cantidad (por ejemplo $100.000) en una variable. Si se rechaza o se altera la cuenta, esa cantidad sera actualizada. el punto de una variable es tener algo que cambie entre cada estado y transicion.

Asi pues, en la pagina principal del workflow, oprima la solapa Variables para traer el listado de todas las variables. Para agregar una variable ingrese un identificador de la variable (ID) y oprima el boton Agregar que esta en el fondo de la pagina. Para determinar en que estado se encuentra un objeto en determinado momento, DCWorkflow almacena el estado actual en una variable en el objeto. El nombre de esta variable por defecto es review_state.

NOTA Si usted nesecita cambiar el nombre de esta variable por que le genera conflicto con el nombre de otra variable, usted puede hacer esto en el fondo de la pagina. Sin embargo tenga mucho cuidado con esto, por que al hacer esto todos los objetos actuales perderan su estado, Tenga mucho cuidado siempre que cambie este valor.

Cada variable del workflow tiene las siguientes propiedades:

Editando Worklists

La solapa Worklist provee acceso a todos los worklist que son asignados a este workflow. Un worklist es un metodo para preguntar al workflow por informacion aserca de el numero de objetos en este workflow. Por ejemplo, quisiera preguntarle al workflow facilmete por todas las cuentas excepcionales de la targeta de credito que tengo.

Para añadir un worklist, ingrese un identificador (ID) y oprima el boton Añadir. Cada worklist tiene las siguientes propiedades:

Regresando al ejemplo de la tajeta de credito, si nesecito saber todas las cuentas de la targeta de credito que hacen falta ser revisadas, despues podria poner esta informacion, despues podria poner esta informacion en un worklist. Primero, la variable review_state tendria el estado actual para cada articulo. Todas la cuentas de la targeta de credito que nesecitan ser revisadas estarian en el estado revision. Segundo, Agregaria un worklist llamado review_queue, y el valor de la variable seria pendiente. Prodria pedir ahora al worklist todos los articulos en el review_queue.

Aunque un worklist es una manera conveniente de lamacenar esta informacion, Plone no los utiliza. En lugar de esto, Plone utiliza ZCztalog directamente para preguntar por los objetos que son trabajados. Puesto que el worklist de DCWorkflow utiliza la herramienta de catalogo, el resultado al final es el mismo.

Editando Scripts

La solapa scripts lista los scrpts que estan disponibles en ete workflow. Esta lista es actualmente un folder estandar en ZMI, y usted puede añadir casi cualquier cosas alli. puesto que la razon principal es añadir scripts para dirigir de una manera avanzada las transiciones, usted debe agregar solamente scripts hechos en (Python).

Para añadir un script a la solapa scripts selecione el script(python) del menu desplegable y de al script una identificacion. el script es dado a uno y solo un objeto; para mas informacion sobre esto, vea Editando scripts de workflows. Por ejemplo,, si usted nesecita tener acceso al objeto real en el workflow, usted utilizaria un script de python tal como el siguiente:

 ##parameters=state_change
   obj = state_change.object

Que sucede en este script que es cargado por el desarrollador pede correr casi cualquier cosa aqui. Usted puede accinar aontecimientos, y usted puede tener acceso a otro Workflow y transiciones. Para algunos scripts de ejemplo, vea <tt> Enviando las notificaciones por E-mail , Moviendo Objetos</tt> en este capitulo. Cuando los scripts se ejecutan, se ejecutara como el usuario que inicio la transicion. Usted podria asignar roles sobre el script si nesecita hacer como algun otro rol. Volviendo a las transiciones, usted puede asignar este script a cualquier numero de transiciones en la seccion script(before) y ajustes en script(despues) usted puede correr cualquier script antes o despues de una transicion.

Editando permisos

La solapa Permisos lista los permisos que son administrados por este workflow. Usted a visto esros permisos ya al examinar los estados. Usted fijo la lista de permisos en la solapa de estados. Para agregar unnuevo permiso, seleccione de la caja desplegable y seleccione añadir.

¿Como puedo editar un documento publicado?

Bueno, usted no puede editar un documeto ya publicado en el workflow por defecto. almenos que usted tenga el rol de administrador. Esto por lo general se hace regeresando el documento a un estado donde el propietaria pueda modificar el contenido, pero si usted en realidad decea hacerlo desde el estado publicado lo que debera hacer es dirigirse al estado publicado y en la solapa permisos seleccionar la casilla de modifica contenido en el rol propietario y salvar estos cambios.

Recuerde que debe dirigirse despues a la raiz de la herramienta portal workflow y cargar los cambios que se hicieron por que de lo contrario no surgira ningun cambio en el workflow.

Editando script del workflow

Los scripts son una oportunidad para que el desarrollador realice una cierta logica sobre una transicion. Estal logica puede ser casi cualquier cosa que usted desee. Usted podria comprobar que se han realizado algunas condiciones ( Por ejemplo, Este documeto a sido revisado??) o esta que acciones especiales se an realizado. cuando el objeto a sido trasicionado, el script a sido llamado.

Cuando se llama un script, un parametro adicional se pasa a es script. Ese parametro extra provee el acceso a todas las clases de lementos y cualidades transicion-relacionados. Este parametro es llamado el state_change y este tiene los siguientes atributos:

Por ejemplo: encontrar que estado esta siento transicionado y cuando, el siguiente es un objeto script (Python) que le dara esta informacion. Este script registra la informacion aserca de la transicion en el archivo de registro:

 ##parameters=state_change
 st = 'From %s to %s on %s' % (
      state_change.old_state,
      state_change.new_state,
      state_change.getDateTime())
 context.plone_log(st)

TIP: Cuando usted escribe un objeto script(python) usted puede necesitar imprimir el archivo de registro para ayudar a eliminar errores. Un script llamado plone_log hace esto, toma una secuencia (string) y la pasa a las funciones de registro de Plone. Por lo tanto llamar a context.plone_log es una herramiena util para eliminar errores.

Al asignar un script a una transicion, usted tiene dos opciones antes o despues. Un script que es asignado a correr antes tiene proridad al correr antes de las transicion. Esto es conveniente para scripts que compruean si algo sucedio antes de que corra la transicion, tal como comprobar que otro objeto subordinado o pagina alla sido cargado o que no se alla producido errores. Los scripts asignados despues se ejecutaran una vez que corra la transicion, aunque si una excepcion se carga en un script, esta puede causar que la transicion falle, el objeto permanesera en su estado original y la excepcion sera mostrada al usuario.

Editando expreciones del workflow

a traves de este capitulo usted a visto los valores que pueden ser expresdos como expreciones de workflow. Por ejemplo, el valor asignado a una variable es el resultado de una expresion del workflow. Esta expresion no es nada especial; esto es solamente un Template attribute language(TAL) con algunas defientes variables disponibles. Usted ya aprendio sobre expresiones de TAL en el capitulo 5 asi que usted debe estar ya familiarizado con estas expresiones y todas sus opciones, Tales como python, string, y rutas de expresiones.

unlike las espreiones estandar de TAL, algunos parametros extras son pasados por medio del name-pace, referentes al workflow wn particular. El name-pace para una expresion del workflow contiene lo siguiente:

Tareas y Ejemplos comunes

Ahora presentare algunas tareas comunes que usted puede alcanzar facilmente con workflow. Cuando un usuario genera una transicion del workflow, esta transicion corre usando una cuanta de usuario especifica. En muchos de estos ejemplos, un usuario normal puede que o tenga los permisos sufucientes para realizar una tarea. Por ejemplo, los miembros no tienen derechos a acceder a una lista de uuarios almenos que este permiso alla sido concedido.

Para solucionar este problema de permisos, algunos de los siguientes scripts(python) les a sido dado un rol diferente. Para darle a un script el permiso de escritura, acceda a la solapa Proxy sobre el objeto y seleccione el usuario que correra el script, segun se muestra el la imagen 8.9

http://www.cogniware.net/Members/guio/work_flow/proxi.png

imagen 8.9 ajustes del proxy del script.

Usted, por supuesto, se cericiorara que sus scripts ejecutados tengan el minimo rol nesesario, dependiendo lo que haga el script.

Ingresando Expresiones del Workflow

Los siguientes son algunos ejemplos de expresiones de workflows que pueden ser utilizados en varios lugares.

Para traer los comentarios, o una cadena(string) vacia, con esta transicion, use lo siguiente:

 python:state_change.kwargs.get('comment', '')

Para obtener el titulo del folder que contiene el objeto utilice:

 container/Title

Para probar si el estado anterior a este era revision, utilice:

 python: state_change.old_state == 'review'

Para traer el usuario que esta ejecutando esta transicion, utilice:

 user/getId

Si usted buscaba quen fue el ultimo usuario que hizo un transicion en el objeto, podria añadir una variable last_user en el workflow. usted puede hacer esto yendo al workflow y opromiendo la solapa de variables. Entonces agrege la variable last_user. Si usted da la exprecion por defecto a la variable user/getId, cada ves que el objeto cambie, que valor sera almacenado para usted.

Usando Workflows para Seguir Cambios

Para un uso particular un cliente desea no perder de vista cada vez que un articulo es corregido y la razon de esa correccion de modo que cuando revice el articulo mas adelante, habria un comentario por cada cambio. Gracias a los workflows, esto es muy sencillo de conseguir.

En este caso, el wokflow tenia solo un estado pero este trabaja para casi cualquier workflow. A este un workflow, una transicion fue añadida con el nombre edit Esta transicion no cambio realmente el estado; el estado de destino para esta transicion era (permanesca en el estado), significa que no ocurrio ningun cambio.

Cuando se edita un objeto, un metodo es llamado para realizar el cambio. Por ejemplo, cuando se edite un documento, el metodo llamado es document_edit.py. Usted puede encontrar este script oprimiendo portal_skins/Plone_form_scripts, y oprimiendo document_edit. Lo unico necesario es añadir una linea a este script antes de la ultima linea:

 context.portal_workflow.doActionFor(new_context,'edit', comment='')

El metodo doActionFor realiza la transicion dada ( en este caso edit) para el objeto pasado dentro (en este caso, context). Cada vez que se edita el objeto, la transicion edit sera activada. Esto hara que un linea sea agregada a la lista de comentarios de edicion del objeto, cuando fue añadido, y cualquier comentario asociado a el.

Cuando se corrige un objeto, no hay realmente comentarios, asi que debe se un poco mas avanzado, usted tendra que modificar el documento de plantilla, para incluir un campo de comentarios. Usted podria entonces acceder a esta lista de comntarios al ir a la solapa Estados, donde la lista de cambios es mostrada en el fondo.

Moviendo Objetos

Una de las capacidades utiles son las de mover un objeto durante un workflow. Por Ejemplo, Usted nesecita mover todos los lanzamientos de prensa a una carpeta llamada lanzamientos_de_prensa cada vez que se publica uno. El contenido podria ser creado y corregido donde quiera y este ser movido a es folder. El script se ejemplo en el script 8.1 mueve el objeto que es (workflowed) en la carpeta Miembros. Agrega este script, en la herramienta de workflow en el ZMI, y seleccione la solapa de scripts. Entonces seleccione el script(python) de la lista desplegable. De al nuevo objete el nombre moveobject, y luego agrege el script 8.1 en este.

<script 8.1 moviendo un objeto.>

 ##parameters=state_change
 # get the object and its ID
 obj = state_change.object
 id = obj.getId()
 # get the src folder and the destination folder
 dstFldr = context.portal_url.Members
 srcFldr = obj.aq_parent
 # perform the move
 objs = srcFldr.manage_cutObjects([id,])
 dstFldr.manage_pasteObjects(objs)
 # get the new object
 new_obj = dstFldr[id]
 # pass new_obj to the error, *twice*
 raise state_change.ObjectMoved(new_obj, new_obj)

Usted nesecita hacer algunas cosas mas; Primero, asignar este script a una transicion. Utilizaria normalmente tal script en la transicion Plublicar. Para hacer esto, Vaya a esa transicion y asignele el valor del script (despues) al moveobject.

En segundo Lugar, hay otro problemita: este Script mueve objetos dentro de la carpeta Miembros. Usted tendrá en la mente un destino mejor, por supuesto. Para hacer tal movimiento, un usuario debe tener los derechos apropiados de mover objetos entre estas dos carpetas. Normalmente, solamente un administrador puede mover objetos en la carpeta de los Miembros. Usted nesecita darle al script el rol del proxy mananger. Usted puede hacer esto dando click en la solapa Proxy del script y darle el rol de mananger a este script. Puede encontrar mas información en el capitulo 9.

Al ver el codigo, primero el script trae la identificacion del objeto para la transicion namespace. Entonces trae la carpeta de origen y la destino. Entonces utiliza la Interface de programacion de aplicaciones (API en ingles) del ObjectMananger de Zope para realizar la copia y el pegado. Usted podria determinar estas carpetas dependiendo en el usuario que realiza la transicion o el tipo de contenido que sera movido. finalmete, usted consige el objeto y lo pasa a una excepcion ObjetMoved.

La excepcion ObjetMoved es una excepcion especial de DCWorkflow. Pasando el nuevo objeto dosveces como parametro en la excepcion, el nuevo objeto será pasado hasta el frontend de Plone, esto es critico de modo cuando envia el objeto el usuario en respuesta al cambio, este en la nueva localizacion del objeto, no en la vieja. Pro supuesto, usted querra escribir ina funcion que que regrese los cambios hechos despues de rechazar el objeto, quisas regresarlo a la carpeta de origen del miembro.

Otro caso especial, y no tan usual, es el de eliminar un objeto enel workflow. Generalmente el eliminar un objeto es una accion del objeto contenedor, asi que es inusual verlos en el workflow. Para esta tarea, usted puede cargar una excepcion del ObjectDeleted. El script 8.2 nos muestra como hacer una eliminacion.

script 8.2 Eliminando un objeto

 ##parameters=state_change
 # get the object
 obj = state_change.object
 id = obj.getId()
 # get the parent folder, delete the  object
 srcFldr = obj.aq_parent
 srcFldr.manage_delObjects([id,])
 # raise the object deleted method and  pass
 # the folder you want to return to
 raise state_change.ObjectDeleted (srcFldr)

Usted podria llamar este script deleteObject y eliminar con exito objetos en el workflow. Una vez mas asegurandose de llevar el error, Plone sabra que hacer con el; en este caso lleva al usuario a la carpeta que contiene el objeto.

Enviando un E-Mail de Notificacion

Si usted tiene un web site que un usuario no visite regularmente, Poner la informacion que debe revisar es algo inusual, lo mejor seria convertir el workflow en un sistema rudimentario de notificacion enviando E-Mails a los usuarios. Esto tambien podria ser un mensaje instantaneo, un mensaje de texto enviado a un telefono movil, etc.

En este ejemplo, usted enviara un E-Mail asia el objeto MailHost en el servidor para cada usuario que tenga el papel de revisor en el sistema, diciendoles sobre un nuevo articulo que se a sometido a revision. este es el script mas complicado que e mostrado hasta ahora, ya que corre con algunos pasos: definiendo variables, encontrando el nombre de cuenta de cada revisor, encontrando un E-mail y enviando un E-mail. El script 8.3 lo muestra.

 ##parameters=state_change
 # the objects we need
 object = state_change.object
 mship = context.portal_membership
 mhost = context.MailHost
 administratorEmailAddress =  context.email_from_address
 # the message format, %s will be  filled in from data
 message = """
 From: %s
 To: %s
 Subject: New item submitted for  approval - %s
 %s
 URL: %s
 """

Esto traera el mensaje y los objetos que usted nesecita. Aparte del objeto a ser (transitioned), usted tambien nesecita una referencia a la calidad del miembro portal_membership y el servidor Simple Mail Transfer Protocol (SMTP) via MailHost. El mensaje es facilmete configurable al enviar el E-mail en cualquier formato que quiera.

Entonces utilizaremos el metodo listMembers del objeto portal_membership para conseguir una lista de miembreos. Para cada miembro, usted puede ver si el rol es Revisor, esta en la lista de los roles de ese usuario llamado el metodo getRoles:

   1  for user in mship.listMembers():
   2     if "Reviewer" in mship.getMemberById(user.id).getRoles():

El lector astuto observar aque la colocacion a traves de cada miembro en un sitio Plone podria ser un poco lenta si usted tiene millares de usuarios. En el capitulo siguiente, usted modificara este script para traer de la lista de usuarios de un grupo especifico.

No hay razon de enviar un E-mail si usted no tiene la direccion del E-Mail de ese usuario, asi que primero usted comprueba que haya un E_Mail valido. Ahora todo se debe ajustar a un formato de E-Mail y enviarlo. Para esto usted puede usar la funcionalidad de remplaso de secuensias(string) de Python y pasar cuatro parametros que correspondan al %s en la variable del mesaje fijada al principio del script. Despues de este reemplazo, la variable de los msg contendra el E-Mail que desea enviar. para enviar el E-Mail simplemente llame al metodo send del MailHost y pase a traves la secuencia (string) del E-Mail:

   1  if user.email:
   2      msg = message % (
   3           administratorEmailAddress,
   4           user.email,
   5           object.TitleOrId(),
   6           object.Description(),
   7           object.absolute_url()
   8           )
   9      mhost.send(msg)

Esto dara lugar al E-Mail siguiente que sera enviado:

 From: administrator@agmweb.ca
 To: andy@agmweb.ca
 Subject: New item submitted for  approval - Plone's great
 We all know Plone is a great product,  but with the newest release
 it's gotten even better...
 URL: http://agmweb.ca/Members/andym/ News_Item_123

El apendice B muestra el listado completo de este script.

Usando PloneCollectorNG

PloneCollectorNG es un seguidor(tracker) de bugs que esta disponible para Plone. Usted encontrara muchos mas, pero este sera el que vamos a utilizar. De hecho, escribir a un tracker parece ser una de las cosas que comunmente debe hacer un desarrollador. Una de las cosas agradables sobre los workflows es que le permite a sus usuarios cambiar signifiativamente el camino de una aplicacion de trabajo. como desarrollador, desarrollar productos que encajen en DCWorkflow permite que un uso siga siendo flexible. Usted encontrara PloneCollectorNG en PloneCollectorNG

El Producto agrega una serie de tipos de contenidos durante la instalacion; Uno de ellos es PloneInssueNG, Que es una edicion(o informe de bug). Mas bien como la edicion se mueve atraves de la base de dados, un workflow separado se asigna a la edicion. Ese workflow contiene estados, transiciones, variables y worklist apropiados.

En cualquier etapa usted puede buscar que estado tiene un objeto llamando al metodo getInfoFor del portal_workflow. Este metodo tan util acepta un objeto y la variable que sera cargada. En el workflow de PloneCollectoNG, esa variable es llamada state y en el workflow de Plone, se llama review_state. Por ejemplo, para buscar el estado para un objeto usted utiliza:

   1  portal_workflow.getInfoFor(obj, "review_state")

Usted puede buscar los estados posibles para un objeto examinando el estado del objeto directamente del workflow, como :

   1  portal_workflow['pcng_workflow'].states._mapping.keys()

El resultado de esto es que si su usuario desea tener un sistema simple de inssue-tracking, despues de modificar este workflow a traves de la web es relativamente trivial(si, cuado la aplicacion a sido desarrollada, se han considerado las herramientas del workflow). Compare este con otros sistemas populares de bug-tracking, bugzilla, donde cambiar un estado o transicion requiere horas y horas de programamcion en Perl para encontrar todas las referencias al estado del bug.

Distribuyendo y Escribiendo Workflow

Si usted tiene un gran workflow para su aplicacion, usted tiene un par ade maneras de escribir y distribuir workflow. Las secciones siguientes cierran la discucon del workflow presentando un par de opciones.

Escribiendo con el ZMI

La manera probablemente mas sencilla pero la mas laboriosa de escribir un workflow es utilizando el ZMI. aunque el ZMI vuelve locas a muchas personas, esa es una manera simple de instalar las opciones. Desafortunadamente, una vez que usted haya empesado a escribir en el ZMI, usted se pega a este paradigma. Es decir no es facil editar o alterar workdloe sobre el sistema de archivos. Discuti editar un workflow atraves de la web con ustedes en el capitulo anterior. por supuesto.

Para exportar un Workflow del ZMI, de click en portal_workflow y seleccione el workflow que quiera exportar aprobando las cajas de la izquierda del ZMI, y despues oproma exportar/inportar. En la parte superior de la pagina de exportacion, seleccione descargar a la maquina local y oprima exportar. un archivo con extencion .zexp sera creado este puede ser guardado y redistribuido.

Seleccionando formato XML proveera un archivo Extensible Markup language(XML) una extencion .XML .

Si le proveen un workflow en formato .zexp o XML, entonces la importacion de su workflow a Plone es directa. coloque el archivo en el directorio de importacion de Zope en el sistema de ficheros este se encuentra en /ubicacion_de_la_instancia/instancia/import/.

Despues de click en portal_workflow seleccione la solapa Contenido y oprima importa/exportar. En la parte inferior de l apgina, vera un formulario pequeño que captura el nombre del archivo que se va a importar. ingrese el nombre del archivo y deje la propiedad Take ownership of imported objects seleccionada. oprima el boton importar. el workflow sera importado y dado el nombre especificado en la exportacion.

Escribiendo un Workflow en Python

Usar Python para hacer un workflow es talves la manera preferida por los programadores, puesto que pueden ser hechos en Python y ser distribuidos facilmente. Primero haga un modulo de Python en el sistem de archivos. en la pate superior del archivo importe las herramientas apropiadas, como sigue:

   1  from Products.CMFCore.WorkflowTool  import addWorkflowFactory
   2  from Products.DCWorkflow.DCWorkflow  import DCWorkflowDefinition

En segundo lugar, haga una funcion que cree el workflow, en el apendice A muestra como crear un workflow un poco mas detallado. Pero usted mirar todos los grandes ejemplos disponibles en el proyecto de PloneWorkflow, o lo que esta contenido en Plone. Por ejemplo:

   1  def sample(id):
   2       """ Sample workflow """
   3       ob = DCWorkflowDefinition(id)
   4       ob.states.addState('private')
   5       ob.states.addState('public')
   6       # add transitions
   7       return ob

Finalmente coloque el workflow en el sistema, asi:

   1  addWorkflowFactory(sample,
   2                     id='sample_workflow',
   3                     title='Sample workflow')


CategoryDocumentacionTecnica

Plone/Definitive_Guide_to_Plone_(Español) (last edited 2008-04-20 14:40:22 by localhost)