martes, 29 de junio de 2010

Enlazar datos de KMKey desde aplicaciones externas

1 comentarios
 
Es frecuente la necesidad de enlazar o volcar datos de KMKey desde aplicaciones externas, como puede ser algún programa de gestión externo, una intranet, etc. Una forma de abordar esos casos es escribiendo código python y usando ZODB, pero ese es un camino poco conocido para la mayoría de técnicos, y que requiere un tiempo de aprendizaje elevado. Afortunadamente, hay un camino mucho más sencillo y que conocen la gran mayoría de los técnicos: el uso de SQL.

En primer lugar, necesitamos instalar el conector python-psycopg y el producto ZPsycopgDA, tal y como se explicó en http://kmkey-es.blogspot.com/2009/05/pasar-schemas-sql.html

Una vez hecho esto, vamos al ZMI (http://sitio/manage), a portal_schemas, y localizamos los schemas o schemas de los cuales queremos obtener información y los configuramos para que usen SQL. Por ejemplo, imaginemos que queremos obtener información de documentos de un sistema de calidad, iríamos a portal_schemas/kmkey_document, pestaña "SQL", pondríamos el nombre de nuestra conexión "db" y pulsaríamos el botón "Migrate to SQL". Si después de hacer eso visitamos nuestra base de datos PostgreSQL veremos que ha aparecido una tabla nueva de nombre "kmkey_document" que contiene información de los documentos existentes en KMKey.

A partir de aquí, se trata de atacar esa base de datos SQL desde nuestro entorno preferido (todos ellos dispondrán de un sistema de conexión a PostgreSQL). Siguiendo con el ejemplo, imaginemos que tenemos un expediente de gestión documental de ISO 9001 y que queremos obtener información de todos los documentos del punto 4 de la norma. Ejecutaríamos algo como:

select * from kmkey_document where proxy_path like 'workspaces/kmkey/iso-9001-san-nicolas/4-sistema-de-gestion-de/%';

Observemos que en el campo "file" llega una estructura de valores id#=#title#=#content_type#=#filename Con el filename podremos ir a buscar el físicamente el fichero que se encontrará típicamente en nuestro servidor bajo /var/zope/storages/kmkey/files/A/B/filename siendo A/B las dos primeras letras de filename

Las sentencias pueden ser todo lo elaborados que sea necesario, por ejemplo si queremos mostra únicamente la última versión de cada documento, quedaría algo como:

select * from kmkey_document d where proxy_path like 'workspaces/kmkey/iso-9001-san-nicolas/4-sistema-de-gestion-de/%' and current_revision = (select max(current_revision) from kmkey_document d2 where d.internal_docid = d2.internal_docid);

Como se puede observar, una de las ventajas de usar un sistema de código abierto es que no hay información oculta, y podemos integrarla fácilmente con el resto de entornos de la empresa
Leer más...
lunes, 14 de junio de 2010

Patrones de trabajo avanzados

0 comentarios
 

Anteriormente se documentó la forma de definir XML's básicos de patrones de trabajo. Puede
consultarse dicha entrada en: Comunidad KMKey en Español: XML para definir objetos en patrones

Ahora vamos a centrarnos en introducir funcionalidades más avanzadas, de forma que empecemos a usar todo el potencial de esta herramienta que son los patrones de trabajo.

Bloquear o desbloquear perfiles en una tarea


<task otros_atributos blocked_roles="role1,role2,roleN" />
<task otros_atributos non_blocked_roles="role1,role2,roleN" />

Nos permite bloquear o desbloquear explícitamente ciertos perfiles en una tarea del patrón. Corresponde al apartado de Perfiles Bloqueados de la pantalla de Equipo / Permisos cuando nos encontramos en un expediente ya creado. Los role1, role2, .. etc, corresponden al nombre interno
del perfil, que puede consultarse en el campo Perfil Relacionado de un grupo de permisos.


Asignar perfiles a usuarios o grupos concretos


<access usernames="username1,username2" roles="role1,role2"/>

<access groups="41718292,4343413" roles="role1,role2"/>

La nomenclatura es usernames="user1,user2" roles="role_para_user1,role_para_user2", manteniendo una concordancia de usuarios y perfiles.

La misma sintaxis puede usarse para asignar perfiles a usuarios o grupos dentro de una tarea concreta, usando la jerarquía del XML:


<task atributos_de_la_tarea>

<access usernames="username1,username2" roles="role1,role2"/>

<access groups="41718292,4343413" roles="role1,role2"/>

</task>


Uso de patrones de tareas distintos

El tag default_portal_type permite asociar un portal_type por defecto a un tag XML. El caso más típico es el de los tags task usados para la definición de tareas. Pero podemos desear que ciertas tareas se creen usando otro patrón de tareas, por ejemplo en casos que necesiten disponer de campos específicos en la definición de la tarea. En esos casos, se puede usar el atributo portal_type dentro del propio tag task para definir un patrón de tarea a utilizar distinto del establecido por defecto.


<?xml version="1.0" encoding="iso-8859-1" ?>

<objects xmlns:tal="http://xml.zope.org/namespaces/tal">

<default_portal_type tag="task" portal_type="KMKey Task" />

<task Title="Propuesta de Producto" planned_end="reference_date+120"
planned_start="reference_date+0" portal_type="kmkey_patron_tarea"
responsible="role:director_tecnologico" task_id="51" wbs="1"/>

<task Title="Diseño Preliminar" planned_end="reference_date+221" planned_start="reference_date+80" responsible="role:jefe_diseno" task_id="52" wbs="2"/>

</objects>


Uso de TAL para cambiar el patrón segun valores de los campos de Definición


Otra funcionalidad muy interesante es la de poder hacer uso del sistema de plantillas TAL para generar un XML dinámico de definición del patrón de trabajo. Se puede encontrar más información sobre la sintaxis del Template Attributes Language en la red, pero dejamos aquí un enlace a una guía introductoria: http://www.zope.org/Documentation/Books/ZopeBook/2_6Edition/ZPT.stx

El uso de TAL nos permite, por ejemplo, condicionar ciertas tareas a determinados valores de campos de la Definición del expediente, o incluso hacer bucles para crear una tarea N veces. Hay que tener claro que las instrucciones TAL se ejecuta en primer lugar, generando un XML resultante que se procesa en segundo lugar, dando lugar a la generación del expediente. Veamos aquí un ejemplo de una tarea condicional:

<?xml version="1.0" encoding="iso-8859-1" ?>

<objects xmlns:tal="http://xml.zope.org/namespaces/tal" tal:define="project python:here['getKMProject'](here)">

<default_portal_type tag="task" portal_type="KMKey Task" />


<task task_id="1" Title="Proyecto + Geotécnico + Control de Materiales" responsible="role:tecnico-de-obra-oct" planned_hours="56" planned_start="parent['planned_start']-15"planned_end="parent['planned_start']-9" tal:condition="python:'Estabilidad' in project['categories']" />

</objects>


Leer más...
viernes, 11 de junio de 2010

Subir el IVA en KMKey

0 comentarios
 
Como algunos de vosotros sabreis, el gobierno español ha decretado subir los tipos de IVA a partir del próximo mes de julio de 2010, pasando a ser del 18%, 8% y 4% respectivamente. Este cambio quedará lógicamente incorporado en próximas versiones de KMKey, pero como la entrada en vigor es inminente, explicamos aquí los pasos a seguir para incorporar los nuevos tipos de IVA, sea cual sea nuestra versión de KMKey:

1) Entramos en el ZMI (http://url_de_nuestro_kmkey/manage)
2) Vamos al site kmkey, apartado portal_skins/custom
3) Creamos un objeto de tipo "Script (python)", escogiéndolo en el seleccionable de arriba a la derecha
4) Lo podemos llamar, por ejemplo "paga_y_calla", y pulsamos el botón "Add and Edit"
5) Escribimos o copiamos las siguientes linias de codigo:

voc = context.portal_vocabularies.kmkey_tax
voc.clear()
voc.set('18.0', '18 %')
voc.set('16.0', '16 %')
voc.set('8.0', '8 %')
voc.set('7.0', '7 %')
voc.set('4.0', '4 %')
voc.set('0.0', '0 %')
return 'Subida del IVA completada'

6) Pulsamos la pestaña "Test"

Y eso es todo, ya estamos preparados para pagar un 18% de IVA (o no)
Leer más...
jueves, 10 de junio de 2010

Ordenar menús y filtros

0 comentarios
 
Para ordenar la lista de menús tenemos una variable de site

menu_sort_item


entramos a zmi, damos de alta la nueva propiedad en el site (string) y le indicamos el nombre del campo por el cual queremos ordenar (title para alfabético, por defecto ordena por id)
Leer más...