Desarrollo de Productos con Archetypes y ArchGenXML

Post on 12-May-2015

3.306 views 1 download

description

Curso introductorio de desarrollo de productos archetypes para plone. Herramientas UML, introducción a diagramas uml para desarrollo archetypes, ArgoUml, archgenxml, vocabularios, workflow.

Transcript of Desarrollo de Productos con Archetypes y ArchGenXML

corporate training menttes

Sebastian, Ferreyra

info@menttes.com

Desarrollo de Productos con Archetypes y ArchGenXML

menttes

¿Qué es UML?

UML son las siglas para Unified Modeling Language; que en castellano quiere decir: Lenguaje de

Modelado Unificado. Para comprender que es el UML basta con analizar cada una de las palabras

que lo componen por separado.

menttes

Lenguaje

UML es, precisamente, un lenguaje. Lo que implica que éste cuente con una sintaxis y una semántica.

Por lo tanto, al modelar un concepto en UML, existen reglas sobre cómo deben agruparse los elementos del lenguaje y el significado de esta

agrupación.

menttes

Modelado

UML es visual. Mediante su sintaxis se modelan distintos aspectos del mundo real que permiten

una mejor interpretación y entendimiento de éste.

menttes

Unificado

Por que unifica varias técnicas de modelado en una única. 

menttes

UML Tools

ArchGenXML procesa modelos almacenados en formato XMI. Este formato XML no esta pensado para ser escrito en un editor de texto plano ni en un editor

basado en XML, por lo tanto se debe usar una herramienta de diseño UML. A continuación damos un

listado de las herramientas UML mas conocidad

menttes

UML Tools - Poseidon

1) Software comercial2) Escrito en Java, corre en la mayoria de las

plataformas3) Basado en ArgoUML4) Almacena el modelo en formato XMI + información

del diagrama en archivos .zuml (archivos zip)5) Es bastante lento6) Necesita mucha memoria y una rapida CPU

Website y download - www.gentleware.com

menttes

UML Tools - ArgoUML

1) Software libre2) Escrito en Java, corre en la mayoría de las

plataformas3) Almacena el modelo en formato XMI + información

del diagrama en archivos .zuml (archivos zip)4) No posee undo5) Conocidas, pero no criticas bugs

Website y download - argouml.tigris.org

menttes

UML Tools - ObjectDomain

1) Comercial, demo por tiempo limitado <= 30 días2) Escrito en Java, corre en la mayoría de las

plataformas3) Se necesita exportar el modelo desde su nativo

.odm formato

Website y download - objectdomain.com

menttes

UML Tools - Powerdesigner

1) Version XMI 1.12) Se necesita exportar el modelo

Website y download - sybase.com

menttes

UML Tools - Umbrello

1) Software libre2) Corre bajo Linux/KDE3) Almacena el modelo en formato XMI4) Hasta la version 1.4 Umbrello no soportaba de

manera correcta el formato XMI

Website y download - uml.sourceforge.net

menttes

Una breve introducción a UML

UML (Lenguaje de Modelado Unificado), es un lenguaje gráfico diseñado para describir software atraves de diagramas. Tenemos varios tipos de diagramas, pero los mas relevantes para ArchGenXML son:

- Diagrama de clases- Diagrama de estados

El diagrama de clases es utilizado para dibujar interfaces, content types (representados como clases) y herramientas (representadas como clases con el estereotipo portal_tool), así como los atributos y operaciones publicas en los mismos. Además de poder asociar los diagramas para ser contenidos o referenciados entre si.

menttes

Content types – Por defecto

menttes

Content types – De terceros

menttes

Content types – Nuestros

menttes

ArgoUML

menttes

ArgoUML - Windows XP Download

Descargamos ArgoUML 0.24: http://argouml-downloads.tigris.org/argouml-0.24/

menttes

ArgoUML – Ejecutar Jar File

Para ejecutar ArgoUML hacemos doble click en el archivo argouml

menttes

ArgoUML – Descargando archgenxml tagged values

1) Descargamos argouml_profile:

http://plone.org/products/archgenxml/issues/30/18/at_download/attachment/

2) Copiamos el archivo argouml_profile.xmi dentro de la carpeta donde tenemos el ejecutable argouml.jar

menttes

ArgoUML – Creando un .zargo con argouml_profile

1) Abrimos ArgoUML2) Vamos a “Archivo” -> “Guardar el proyecto como ...” y elegimos el nombre de nuestro proyecto (Ejemplo ArtistSite.zargo)

menttes

ArgoUML – Creando un .zargo con argouml_profile

3) Luego lo que hacemos es pararnos encima del archivo .zargo que acabamos de crear y con el boton derecho del mouse elegimos la opción “Abrir con” -> “Elegir programa...”, por el momento seleccionamos el “Bloc de Notas” como programa por defecto para abrir los archivos .zargo para que Windows pueda identificarlos con algún formato.

4) A continuación dentro de la misma carpeta en donde se encuentra el archivo .zargo, elegimos el tab “Tipos de archivo” y elegimos nuestro archivo ZARGO.

menttes

ArgoUML – Creando un .zargo con argouml_profile

5) Clickeamos en “Opciones avanzadas”, luego seleccionamos “open” y a continuación clickeamos en “Editar”, lo que hacemos es modificar “Aplicación utilizada para realizar la acción” por:

"C:\Program Files\Java\jre1.5.0_06\bin\javaw.exe" "-Dargo.defaultModel=your_PC_path\argouml_profile.xmi" -jar "your_PC_path\ArgoUML-0.20\argouml.jar" "%L"

menttes

ArgoUML – Creando un .zargo con argouml_profile

Listo, ahora podemos ver dentro de nuestro modelo las opciones AGX en ArgoUML, y cada ves que

abramos un archivo .zargo se cargara con todos estos tag de manera automática

menttes

¿Que es ArgoUML?

ArgoUML es una herramienta utilizada en el modelaje de sistemas, mediante la cual se realizan diseños en UML llevados acabo en el análisis y pre-

diseño de Sistemas de Software.

menttes

¿Porque ArgoUML?

● Maduro – Este soporta importantes características ● Es relativamente liviano. Lo cual es muy

importante.● El precio es muy bueno. Es gratis.

menttes

Definiendo Custom Content types

Ejemplo Uno: ArtistSite – Diagrama, atributos

Ejemplo Dos: GiveSuggestion – Workflow

Ejercicio Uno: AGAEXDocument – Expandir AT

Ejemplo Tres: ATArticle – Schemata

Ejercicio Dos: ATBirthday – Calendar, Kupu

menttes

Ejemplo Uno: ArtistSite

menttes

Creando la clase Artist

menttes

Descripción, icono y docstring

menttes

Atributos para el campo Title

menttes

Tamaños de la foto

menttes

Vocabulario de instrumentos

menttes

¿Que es ArchGenXML?

● Es un generador de código para productos Plone, basados en Archetypes.

● Analiza modelos UML en el XMI-FORMATO (.xmi.zargo.zuml), creados con ArgoUML,

menttes

¿Porqué usar ArchGenXML? (parte 1)

• Quieres ahorrarte tiempo

• Eres un programador bago

• No te gusta re inventar la rueda

• No te gusta copiar y pegar código• Haces uso de referencias e interfaces

menttes

¿Porqué usar ArchGenXML? (parte 2)

• Tienes proyectos grandes con muchos content types diferentes

• Quieres o necesitas una correcta y bien documentada interfase para tu producto

• Quieres mantener tu proyecto en el futuro sin tener un dolor de cabeza

menttes

De UML a Archetypes usando ArchGenXML

menttes

Corriendo el script

Comando:

ArchGenXML.py -o ProductName ProductName.zargo

menttes

Agregando un nuevo Artist

1) Copiar la carpeta ArtistSite en el directorio Products 2) Reiniciar Zope3) Instalar ArtistSite usando QuickInstaller4) Agregar un nuevo Artist

menttes

Edit Artist form

menttes

View Artist

menttes

Moviendo el modelo al producto

1) Dentro de la carpeta ArtistSite crear una sub-carpeta llamada model

2) Copiar el archivo ArtistSite.zargo dentro de la carpeta model

menttes

Vocabulario dinámico

menttes

Agregar ATVM como dependencia

1) En la raíz del producto agregar el archivo AppConfig.py

2) Editar AppConfig.py y agregar la linea:DEPENDENCIES = ['ATVocabularyManager']

3) Reiniciar Zope4) Reinstalar ArtistSite

menttes

Vocabulary Library

Ir a Plone Setup y elegir Vocabulary Library

menttes

Agregamos un termino al vocabulario

menttes

Vocabulario dinámico - Artist

menttes

Contenedor

Usaremos el rombo solido para hacer una estricta contención, instancias del tipo Artist pueden ser

agregadas solo en instancias del tipo 'Artists'

menttes

Usando <<large>> stereotype

menttes

Le damos a este un nombre amigable

menttes

Agregamos el contenedor Artists

menttes

Ejemplo Dos: GiveSuggestion

menttes

Atributos para el campo name

menttes

Atributos para el campo suggestion

menttes

Atributos para el campo area

menttes

Corriendo el script

Comando:

ArchGenXML.py -o GiveSuggestion GiveSuggestion.zargo

menttes

Agregando una nueva Suggestion

1) Copiar la carpeta GiveSuggestion en el directorio Products 2) Reiniciar Zope3) Instalar GiveSuggestion usando QuickInstaller4) Agregar una nueva Suggestion

menttes

Edit Suggestion form

menttes

Workflow

Lo que haremos ahora es agregarle workflow a nuestro content type Suggestion.

Definiremos los estados Submitted, Approved, Complete y Rejected con sus respectivas

transacciones.

menttes

Agregando el diagrama de estado

1) Dentro de nuestro clase Suggestion, clickeamos en Crear -> Diagrama de estado

menttes

Agregando un estado inicial

2) Agregamos un estado inicial, solo debemos clickear en el circulo de color negro solida, luego le ponemos el nombre Creating

menttes

Agregando un estado simple

3) A continuación agregamos un estado simple, este luce como una caja redonda con una linea horizontal en el medio. Llamar a esta Submitted

menttes

Otro estado simple

4) A la derecha de Submitted agregamos otro estado simple, lo llamaremos a este Approved

menttes

Agregando estados finales

5) A la derecha de Approved agregamos un estado final (circulo negro con contorno blanco) al cual llamaremos Complete

6) Abajo de Approved agregamos un estado final al cual llamaremos Rejected

menttes

Nombrando las transiciones

7) Lo que hacemos a continuación es nombrar las transiciones, la trancision que va al estado Submitted se llamara Submit, la transición que va al estado Approved se llamara Approve, la transición que va al estado Rejected se llamara Reject y por ultimo la transición que va al estado Completed se llamara Complete

menttes

Permisos de los usuarios

8) Ahora vamos a definir lo que cada rol puede ver, los usuarios Anonimos podran Crear (un estado inicial) y requerir un Submit (una transición de estado), pero no podrán Aprobar una suggestion. Los Managers y Reviewer podrán approve/reject/complete la suggestions. Pero los usuarios anonimos podrán ver el pedido durante todo el proceso.

menttes

Seteando permisos, estado Submitted

menttes

Seteando permisos, estado Approved

menttes

Seteando permisos, estado Complete

menttes

Seteando permisos, estado Rejected

menttes

Quien puede modificar los estados

9) Definiremos guardas (guards), para saber que estado es el que puede setear cada usuario en el content type. Para esto nos pararemos en cada una de las transacciones (menos en la inicial Submit) y agregaremos una guard:

guard_roles:Reviewer;Manager

menttes

Guard - Approve

menttes

Guard - Complete

menttes

Guard - Reject

menttes

Corriendo el script

Comando:

ArchGenXML.py -o GiveSuggestion GiveSuggestion.zargo

menttes

Agregando una nueva Suggestion1) Copiar la carpeta GiveSuggestion en el directorio Products 2) Reiniciar Zope3) Instalar GiveSuggestion usando QuickInstaller4) Agregar una nueva Suggestion

menttes

Anónimos Suggestion

Lo que haremos ahora es permitirle a los usuarios anónimos agregar suggestions a nuestro sitio. Pero no en cualquier lugar sino mas bien en una carpeta que

crearemos para que se agreguen dentro de esta.

menttes

Carpeta Suggestion

1) En nuestra instancia Plone agregamos una carpeta en la raíz llamada Suggestions. Y dentro de esta creamos otra carpeta llamada Archive.

menttes

Carpeta Suggestion - Security

2) En nuestro ZMI:a) Navegamos hasta la carpeta suggestions/archive

y clickeamos en el tab Security, buscamos el permiso Add portal content, Desclikeamos el box Aquire a la izquierda y clickeamos los boxes Anonymous y Authenticated a la derecha.

menttes

Carpeta Suggestion - Security

b) Buscamos ahora el permiso Modify portal content. Asegurarse de que Aquire esta

desclickeado y clickear Anonymous y Authenticated.

menttes

Carpeta Suggestion - Security

c) En la parte de mas abajo de la pagina clickeamos en el boton Save Changes para guardar los cambios.

Si abrimos el Sitio Plone con otro navegador o nos deslogeamos del sitio que estamos utilizando, podremos ver que los usuarios anónimos pueden ahora agregar suggestions dentro de la carpeta Archive. Y poner el contenido en estado Submited.

Pero tenemos un problema, los usuarios anónimos pueden editar dentro de Archive y eso no lo queremos.

menttes

Negar edición a los Anónimos

El objetivo es hacer que los usuarios anónimos no puedan editar suggestions, para esto agregaremos

dos script dentro de nuestro producto GiveSuggestion que lo que harán es modificar de manera automática

el estado de las suggestion al ser creadas a Submited, ya que en ese estado hemos definido que los únicos que pueden modificar los objetos son los Managers y

Reviewers.Es importante tener en cuenta que estos scripts se

pueden borrar si regeneramos el producto con ArchGenXML por lo tanto debemos mantener una

copia del producto en algun lado.

menttes

Creamos suggestion_post.cpy

En Products\GiveSuggestion\skins\GiveSuggestion

## Script (Python) "suggestion_post"##title=Post GiveSuggestion after validation##bind container=container##bind context=context##bind namespace=##bind script=script##bind state=state##bind subpath=traverse_subpath##parameters=##

from Products.CMFCore.utils import getToolByName

workflow = getToolByName(context, 'portal_workflow')workflow.doActionFor(context, 'Submit')

return state.set(status = 'success', portal_status_messsage = 'Thank you.')

menttes

Creamos suggestion_post.cpy.metadata

En Products\GiveSuggestion\skins\GiveSuggestion

[default]title = Submit a suggestion

[validators]validators =

[actions]action.success = redirect_to:string:../action.failure = traverse_to:string:content_edit

menttes

Editamos Install.py

En Products\GiveSuggestion\Extensions\Install.py

buscamos la linea:

print >>out,'no workflow install'

y debajo de esta ponemos:

controller = getToolByName(self, 'portal_form_controller')addFormControllerAction(self, out, controller, template = 'validate_integrity', status = 'success', contentType = 'Suggestion', button = '', actionType = 'traverse_to', action = 'string:suggestion_post')

menttes

Editamos Install.py

En la parte inferior del archivo agregamos el código:

def addFormControllerAction(self, out, controller, template, status, contentType, button, actionType, action): """Add the given action to the portalFormController""" controller.addFormAction(template, status, contentType, button, actionType, action) print >> out, "Added action %s to %s" % (action, template)

Listo, si probamos ahora agregar una suggestion como usuarios anónimos, no podremos editarlo.

menttes

Ejercicio Uno: ATAGAEXDocument

menttes

Objetivo

El objetivo es crear un nuevo content type Document que herede todos los campos de ATDocument y a su

ves añadir un par de campos adicionales

menttes

Un vistazo

menttes

Atributos nuevos en ATAGAEXDocument

menttes

Moviendo los nuevos campos debajo de title

Para mover los nuevos campos debajo del campo title debemos utilizar la función moveField, en:

Products\ATAGAEXDocument\content\AGAEXDocument.py

luego de la definición de nuestro schema, ponemos

AGAEXDocument_schema.moveField('autor', after='title')AGAEXDocument_schema.moveField('conocimiento', after='autor')AGAEXDocument_schema.moveField('publico', after='conocimiento')AGAEXDocument_schema.moveField('email', after='publico')'

menttes

Atributos movidos en ATAGAEXDocument

menttes

Ejemplo 4: ATArticle - Schemata

menttes

Atributos para el campo body

menttes

Atributos para el campo firstname

menttes

Atributos para el campo lastname

menttes

Corriendo el script

Comando:ArchGenXML.py -o ATArticle ATArticle.zargo

menttes

Agregando un nuevo Article

1) Copiar la carpeta ATArticle en el directorio Products 2) Reiniciar Zope3) Instalar ATArticle usando QuickInstaller4) Agregar un nuevo Article

menttes

Edit Article form – Schemata default

menttes

Edit Article form – Schemata article

menttes

Edit Article form – Schemata author

menttes

View Article

menttes

Borrando el schemata default

Para borrar el schemata default primero debemos mover los atributos id y title a nuestro schemata article, en:

Products\ATArticle\content\Article.py

luego de la definición de nuestro schema, ponemos

Article_schema['id'].schemata = 'article'Article_schema['title'].schemata = 'article'

menttes

Article sin schemata default

menttes

Ocultando title en Article

Lo que haremos a continuación es borrar el atributo title de nuestro content type Article, en:

Products\ATArticle\content\Article.py

luego de la definición de nuestro schema, ponemos

Article_schema['title'].required = 0Article_schema['title'].widget.visible = {'edit': 'hidden', 'view': 'invisible'}

menttes

Article sin el atributo title

menttes

Que paso con el id de nuestro ATArticle?

Al haber ocultado el atributo title de nuestro content type, Plone utiliza un id por defecto que lo obtiene de manera automática de acuerdo a la fecha del día en que se crea el objeto.

menttes

Pisando title en Article

Lo que haremos sera modificar el atributo title cambiándole el nombre a Author, en:

Products\ATArticle\content\Article.py

luego de la definición de nuestro schema, ponemos

Article_schema['title'].widget.label = 'Author'

#Article_schema['title'].required = 0#Article_schema['title'].widget.visible = {'edit': 'hidden', 'view': 'invisible'}

menttes

Atributo title renombrado

menttes

Ejercicio Dos: ATBirthday

menttes

¿Qué es Archetypes?

Archetypes es un framework diseñado para facilitar la construcción de aplicaciones para Plone

menttes

Objetivo Principal

Proporcionar un método común para construir content type,

basado en la definición de esquemas

menttes

Arquitectura Archetypes

SchemaField

WidgetSchema  Field

Widget…

menttes

¿Qué es un esquema Archetypes ?

El corazón de archetypes es su esquema (secuencia de campos).

El esquema trabaja como una definición de lo que su objeto contendrá y como presentar la información

contenida.

menttes

Esquema y Esquema Base

Para crear un esquema se pasan los camposque se desean dentro del objeto esquema

como una tupla.

Ej.:

Schema((StringField('body', 

          widget = TextAreaWidget(label='Body')                   ),

# otros campos aquí))

menttes

Esquema Base + Esquema

schema = Schema((StringField('body'),

))

class Ejemplo(BaseContent)schema = BaseSchema + schema

menttes

Fields

Todos los campos son instanciados de la misma manera, creando un campo y pasándole a este un

parámetro requerido: name

Ej.:

from Products.Archetypes.public import IntegerField# un simple campo para edadage = IntegerField('age')

menttes

Widgets

Una widget contiene la información acerca de cómo será representado visualmente el objeto

    Ej.:from Products.Archetypes.public import IntegerFieldfrom Products.Archetypes.public import IntegerWidget

# un simple campo para la edadage = IntegerField('age',                                 widget=IntegerWidget(label="Your age")                        ) 

menttes

Ejemplo de Archetypes: Artist

schema = Schema((StringField('name'),ImageField('photo'),LinesField('instrument'),

        ))

class Artist(BaseContent)schema = BaseSchema + schemaregisterType(Artist,PROJECTNAME)

menttes

Widgets

schema = Schema((StringField('name',

widget=StringWidget( label='Artist name', size=20),),ImageField('photo',

widget=ImageWidget(label='Headshot'),),LinesField('instrument',            widget=MultiSelectionWidget(label='Instruments'),

multiValue=1,),

))

menttes

Ejemplo: Artist paso a pasoProducts|\­ Artist   

     |        \­ __init__.py        |        \­ Artist.py        |        \­ config.py        |        \­ Extension                   |                    \­ __init__.py                        |     

    \­ Install.py

menttes

Paso 1) Directorio Artist

Lo primero que debemos hacer es ir dentro de nuestro directorio de productos Plone y crear una

carpeta con el nombre “Artist”

Ejemplo: /var/www/zope/plone-2.1.1/Product/Artist

(Aunque podemos crearla en cualquier lado y luego tirarla dentro de “Product”)

menttes

Paso 2) Artist.py

1  from Products.Archetypes.public import *2  from Products.Artist.config import PROJECTNAME34  class Artist(BaseContent):5  “””A Simple Content Type“””6  schema = BaseSchema + Schema((7 StringField('name'),8 ImageField('photo'),9 LinesField('instrument'),10             ))1112 registerType(Artist,PROJECTNAME)

menttes

Paso 3) Atributos

schema = BaseSchema + Schema((StringField('name',

widget=StringWidget(label='Artist name', size=20),),ImageField('photo',

widget=ImageWidget(label='Headshot'),),LinesField('instrument',            widget=MultiSelectionWidget(label='Instruments'),

multiValue=1,),

))

menttes

Bien a esta altura ya hemos definido el esquema que tendra nuestro nuevo content type Artist

Ahora veamos como convertir un esquema Archetypes en un producto Zope

menttes

Paso 4) __init__.py1     from Products.Archetypes.public import process_types, listTypes2     from Products.CMFCore import utils3     from Products.MyName.config import PROJECTNAME, ADD_CONTENT_PERMISSION4 5     def initialize(context):6        ## Import Types here to register them7        import Name89        content_types, constructors, ftis = process_types(listTypes(PROJECTNAME),10                    PROJECTNAME)11 12      utils.ContentInit(13     PROJECTNAME + ' Content',14            content_types = content_types,15     permission = ADD_CONTENT_PERMISSION,16           extra_constructors = constructors,17     fti = ftis,18       ).initialize(context)

menttes

Paso 5) config.py

1 PROJECTNAME = 'Artist'

2 ADD_CONTENT_PERMISSION = 'Artist: Add Content'

menttes

Bien ya tenemos nuestro producto Plone listo con nuestro content type definido mediante esquemas.Ahora veamos como hacer el producto que hemos

creado instalable.

menttes

Paso 6) Install.pyBien, primero debemos crear una nueva carpeta

Extensions dentro de nuestra carpeta Artist. Ahora si, dentro de esta agregamos Install.py:

1   from Products.Artist.config import PROJECTNAME2   from Products.Archetypes.public import listTypes3   from Products.Archetypes.Extensions.utils import installTypes4   from StringIO import StringIO5   def install(self):6  out = StringIO()7 installTypes(self, out,8 listTypes(PROJECTNAME),9  PROJECTNAME) 10 print >> out, "Successfully installed %s." % PROJECTNAME11 return out.getvalue() 

menttes

Listo! Hemos terminado.Ahora vamos a probarlo, para esto reiniciemos

nuestra instancia Zope, dentro de Plone vamos al ZMI, luego a portal_quickinstaller e instalamos

nuestro nuevo producto.En la front-page vamos a nuestra barra de

contenidos 'drop-down list' y cargamos un nuevo content type Artist!

menttes

Material leido para ArchGenXML/ArgoUML

http://plone.org/documentation/tutorial/archgenxml-getting-started/tutorial-all-pages

http://plone.org/products/archgenxml/documentation/how-to/setting-up-argouml-to-provide-tagged-values-and-stereotypes-in-a-dropdown-menu

http://plone.org/products/archgenxml/issues/30

http://plone.org/documentation/tutorial/picking-archetypes-widgets/tutorial-all-pages

http://plone.org/documentation/tutorial/archgenxml-getting-started/archgenxmlquickref

http://plone.org/products/archgenxml/documentation/how-to/subclassing-atcontenttypes

http://plone.org/documentation/tutorial/anonymously-adding-custom-content-types-with-argouml-and-archgenxml/tutorial-all-pages

http://oodt.jpl.nasa.gov/wiki/display/edrn/UML+to+Portal+in+a+Few+Easy+Steps

http://www.jazkarta.com/presentations/ArchGenXML-ArgoUML.pdf

http://plone.org/documentation/how-to/make-view-page-use-schemata-declarations/?searchterm=BaseSchema

http://plone.org/products/archetypes/documentation/how-to/title-less-type

corporate training menttes

Muchas gracias

Sebastian Ferreyra

info@menttes.com