Workflows en Plone

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    1 Favorite

    Workflows en Plone - Presentation Transcript

    1. Administración de procesos en Plone. Eduardo Espinosa Avila. Febrero 2009.
    2. Los workflows son mapas de procesos de negocio. Se componen de tareas y sus relaciones, criterios para indicar inicio y término de los procesos y la información sobre la tarea individual. Un workflow es un conjunto de interacciones que deben realizarse para completar una actividad o tarea. Por ejemplo, solicitudes de admisión en una escuela, o solicitudes de viaje de alguna institución. Estas tareas involucran a varias personas, y son diferentes dependiendo de la institución.   Gráficamente se puede representar como una máquina de estados con transiciones etiquetadas. Workflows
    3. Un ejemplo de un workflow sencillo, representado como máquina de estados. Workflows
    4. El mismo workflow , especificando los permisos sobre las transiciones.
      • En general, para diseñar un workflow , se realizan tres actividades:
      •  
        • Definir los estados del workflow .
        • Definir las transiciones.
        • Definir permisos (especificar quién puede realizar las transiciones).
      Workflows
      • En http://www.wfmc.org/ y http://www.e-workflow.org/ se definen los estándares puede verse que actualmente hay gran auge por realizar investigación y desarrollo relacionado con workflows , también se muestran diversos casos de éxito, agrupados en los siguientes rubros:
      •  
        • Académico.
        • Financiero.
        • Gubernamental.
        • Salud.
        • Industrias.
        • Tecnología.
        • Transporte.
        • Otros .
      Workflows
    5. Una de las fortalezas de Plone es su componente de workflows . El manejo de workflows es uno de los temas base de content management , que es la separación de la lógica, el contenido y la presentación. El producto para workflows más usado en Plone es DCWorkflow el cual es un producto opensource lanzado por la Zope Corporation. DCWorkflow provee ciertas características y limitaciones claves que deben tomarse en cuenta para comprender su uso. Existen otros sistemas de workflows , orientados a diferentes conceptos como son tareas, algunos de ellos están disponibles para Plone, p.ej. OpenFlow y AlphaFlow . Sin embargo DCWorkflow es bastante simple, de gran alcance y proporciona la funcionalidad que la mayoría de usuarios necesitan. Workflows en Plone
      • El concepto DCWorkflow .
      • DCWorkflow asume ciertas cosas sobre el proceso ( workflow ):
        • Existe un objeto en el sistema que representa la tarea que debe completarse.
        • Todos los objetos de un mismo tipo tienen asociado el mismo workflow .
        • Las tareas son asignadas a roles, no a usuarios.
      • DCWorkflow facilita implementar workflows que se adaptan a esta descripción; de no ser así, existen otras alternativas como AlphaFlow , un motor de workflows para Plone más complejo y potente.
      Workflows en Plone
      • Creando Workflows en Plone.
      • Para crear definiciones de workflows en Plone con el producto DCWorkflow , se debe hacer los siguiente:
        • Definir los estados del workflow .
        • Definir las transiciones.
        • Definir los permisos. (Especificar quién puede hacer qué sobre el contenido).
        • Definir worklists y scripts .
      • Se pueden utilizar expresiones TALES ( Template Attribute Language Expression Syntax ) para acceder a atributos de objetos.
      Workflows en Plone
      • Creando Workflows en Plone 2.1.
      • Plone 2.x tiene incluidos dos workflows : Default workflow ( plone_workflow ) y Folder workflow ( folder_workflow ); si se desean añadir otros workflows al sitio, existen tres métodos principales:
        • Utilizando la interfaz de administración de Zope ( ZMI ).
        • Usando el producto ArchGenXML . Es una herramienta que genera productos para Zope basados en Archetypes , a partir de modelos UML basados en XMI ( XML Metadata Interchange , .xmi, .zargo, .zuml).
        • Vía código de Python (puede ser generado con ArchGenXML ).
      • Se mostrarán algunos puntos de la creación con Python.
      Workflows en Plone 2.1
    6. Creando Workflows en Plone 2.1 con código de Python. Comenzamos importando algunas definiciones útiles: from Products.CMFCore.utils import getToolByName from Products.CMFCore.WorkflowTool import addWorkflowFactory from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition from Products.ExternalMethod.ExternalMethod import ExternalMethod El nombre del producto: from Products.MiProducto.config import PROJECTNAME as productname Workflows en Plone 2.1
    7. Creando Workflows en Plone 2.1 con código de Python. Creamos una función de definición del workflow : def setup_mi_workflow(self, workflow): """ Definición de mi_workflow """ workflow.setProperties(title='mi_workflow') # Estados for s in [‘estado_1’, ‘estado_2’]: workflow.states.addState(s) # Transiciones for t in [‘pasar_a_2’, ‘regresar_a_1’]: workflow.transitions.addTransition(t) # Variables útiles for v in ['action', 'review_history', 'actor', 'comments', 'time', 'wf_title']: workflow.variables.addVariable(v) # Permisos administrados for p in ('Access contents information', 'Modify portal content', 'View'): workflow.addManagedPermission(p) Workflows en Plone 2.1
    8. Creando Workflows en Plone 2.1 con código de Python. Definimos las propiedades de los estados: ## Estado inicial workflow.states.setInitialState(‘estado_1') ## Propiedades del estado stateDef = workflow.states[‘estado_1'] stateDef.setProperties(title=""" Estado 1""", transitions=(‘pasar_a_2',)) stateDef.setPermission('Access contents information', 1, ['Owner']) stateDef.setPermission('Modify portal content', 1, ['Owner']) stateDef.setPermission('View', 1, ['Manager', 'Owner']) Workflows en Plone 2.1
    9. Creando Workflows en Plone 2.1 con código de Python. Definimos las propiedades de las transiciones: ## Propiedades de la transición transitionDef = workflow.transitions[‘pasar_a_2'] transitionDef.setProperties(title=""“Pasar al estado 2""", new_state_id=""“estado_2""", trigger_type=1, script_name="""""", after_script_name="""""", actbox_name=""“Pasar a 2""", actbox_url="""%(content_url)s/content_show_form""", actbox_category="""workflow""", props={'guard_roles': 'Owner'}, ) Workflows en Plone 2.1
    10. Creando Workflows en Plone 2.1 con código de Python. Definimos las propiedades de las variables: ## Variable de estado workflow.variables.setStateVar('review_state') ## Propiedades de la variable variableDef = workflow.variables['review_history'] variableDef.setProperties(description=""“Historial del workflow""", default_value="""""", default_expr="""state_change/getHistory""", for_catalog=0, for_status=0, update_always=0, props={'guard_permissions': 'Request review; Review portal content'}) Workflows en Plone 2.1
    11. Creando Workflows en Plone 2.1 con código de Python. Creamos una función para instalar el workflow : def create_mi_workflow(self, id): """Crea mi_solicitud""" ob = DCWorkflowDefinition(id) setup_mi_workflow(self, ob) return ob # Llamamos al Workflow Factory para crear el objeto dentro del sitio addWorkflowFactory(create_mi_workflow, id=‘mi_workflow', title=‘Mi workflow') Finalmente, dentro del script de instalación del producto, se debe llamar a la función de creación del workflow . Workflows en Plone 2.1
      • Creando Workflows en Plone 3.
      • Plone 3 tiene incluidos un conjunto de nuevos workflows :
        • Simple Publication Workflow.
        • Intranet/Extranet workflow .
        • Community workflow .
        • One state workflow.
        • Community Workflow for Folders
        • Intranet Workflow for Folders
      • Cada uno orientado a cumplir requerimientos específicos.
      Workflows en Plone 3
      • Creando Workflows en Plone 3.
      • Si se desean añadir otros workflows al sitio, existen cuatro métodos principales :
        • Utilizando la interfaz de administración de Zope ( ZMI ).
        • Con el producto collective.workflowed .
        • Usando el producto ArchGenXML .
        • Si se cuenta con un workflow definido en alguna versión de Plone 2.x, lo más conveniente, es realizar la exportación de este a un archivo .zexp desde el ZMI de esa versión de Plone, después importar ese archivo al sitio existente en Plone 3.
      • Posteriormente, se exporta el paso de workflow tool de la configuración del sitio, para obtener la definición en formato XML y se coloca dentro de la carpeta profiles/default .
      Workflows en Plone 3
    12. Creando Workflows en Plone 3. Ahora se muestra el contenido de profiles/default/workflows.xml , el cual se utiliza para definir nuevos workflows dentro del sitio y de asociarlos a tipos de contenido específicos: <?xml version=&quot;1.0&quot;?> <object name=&quot;portal_workflow&quot; meta_type=&quot;Plone Workflow Tool&quot;> <property name=&quot;title&quot;>Contains workflow definitions for your portal</property> <object name=“mi_workflow&quot; meta_type=&quot;Workflow&quot;/> <bindings> <type type_id=“mi_contenido&quot;> <bound-workflow workflow_id=“mi_workflow&quot;/> </type> </bindings> </object> Workflows en Plone 3
    13. Creando Workflows en Plone 3. Ahora se muestra el contenido de profiles/default/workflows.xml , el cual se utiliza para definir nuevos workflows dentro del sitio y de asociarlos a tipos de contenido específicos: <?xml version=&quot;1.0&quot;?> <object name=&quot;portal_workflow&quot; meta_type=&quot;Plone Workflow Tool&quot;> <property name=&quot;title&quot;>Contains workflow definitions for your portal</property> <object name=“mi_workflow&quot; meta_type=&quot;Workflow&quot;/> <bindings> <type type_id=“mi_contenido&quot;> <bound-workflow workflow_id=“mi_workflow&quot;/> </type> </bindings> </object> Workflows en Plone 3 Trabajamos con objetos tipo Workflow
    14. Creando Workflows en Plone 3. Ahora se muestra el contenido de profiles/default/workflows.xml , el cual se utiliza para definir nuevos workflows dentro del sitio y de asociarlos a tipos de contenido específicos: <?xml version=&quot;1.0&quot;?> <object name=&quot;portal_workflow&quot; meta_type=&quot;Plone Workflow Tool&quot;> <property name=&quot;title&quot;>Contains workflow definitions for your portal</property> <object name=“mi_workflow&quot; meta_type=&quot;Workflow&quot;/> <bindings> <type type_id=“mi_contenido&quot;> <bound-workflow workflow_id=“mi_workflow&quot;/> </type> </bindings> </object> Workflows en Plone 3 Trabajamos con objetos tipo Workflow Declaramos un nuevo Workflow en el sitio
    15. Creando Workflows en Plone 3. Ahora se muestra el contenido de profiles/default/workflows.xml , el cual se utiliza para definir nuevos workflows dentro del sitio y de asociarlos a tipos de contenido específicos: <?xml version=&quot;1.0&quot;?> <object name=&quot;portal_workflow&quot; meta_type=&quot;Plone Workflow Tool&quot;> <property name=&quot;title&quot;>Contains workflow definitions for your portal</property> <object name=“mi_workflow&quot; meta_type=&quot;Workflow&quot;/> <bindings> <type type_id=“mi_contenido&quot;> <bound-workflow workflow_id=“mi_workflow&quot;/> </type> </bindings> </object> Workflows en Plone 3 Trabajamos con objetos tipo Workflow Declaramos un nuevo Workflow en el sitio Asociamos el Workflow a un tipo de contenido
    16. Creando Workflows en Plone 3. A continuación dentro de profiles/default/workflows/mi_workflow , creamos el archivo de definición definition.xml , se muestran algunas partes de este archivo : <?xml version=&quot;1.0&quot;?> <dc-workflow workflow_id=“mi_workflow&quot; title=“Mi Workflow&quot; description=&quot; - Descripción de mi workflow. &quot; state_variable=&quot;review_state&quot; initial_state=“estado_1&quot;> <!-- Permisos utilizados por el workflow --> <permission>Access contents information</permission> <permission>Modify portal content</permission> <permission>View</permission> Workflows en Plone 3
    17. Creando Workflows en Plone 3. A continuación dentro de profiles/default/workflows/mi_workflow , creamos el archivo de definición definition.xml , se muestran algunas partes de este archivo : <?xml version=&quot;1.0&quot;?> <dc-workflow workflow_id=“mi_workflow&quot; title=“Mi Workflow&quot; description=&quot; - Descripción de mi workflow. &quot; state_variable=&quot;review_state&quot; initial_state=“estado_1&quot;> <!-- Permisos utilizados por el workflow --> <permission>Access contents information</permission> <permission>Modify portal content</permission> <permission>View</permission> Workflows en Plone 3 Atributos del Workflow , tipo DCWorkflow , Id, título, descripción, variable que almacena el estado actual y estado inicial
    18. Creando Workflows en Plone 3. A continuación dentro de profiles/default/workflows/mi_workflow , creamos el archivo de definición definition.xml , se muestran algunas partes de este archivo : <?xml version=&quot;1.0&quot;?> <dc-workflow workflow_id=“mi_workflow&quot; title=“Mi Workflow&quot; description=&quot; - Descripción de mi workflow. &quot; state_variable=&quot;review_state&quot; initial_state=“estado_1&quot;> <!-- Permisos utilizados por el workflow --> <permission>Access contents information</permission> <permission>Modify portal content</permission> <permission>View</permission> Workflows en Plone 3 Atributos del Workflow : tipo DCWorkflow , Id, título, descripción, variable que almacena el estado actual y estado inicial Permisos utilizados por el Workflow
    19. Creando Workflows en Plone 3. <!-- Los diversos estados con su respectivo mapeo de permisos --> <state state_id=“estado_1&quot; title=“Estado 1”> <description> Estado inicial. </description> <exit-transition transition_id=“pasar_a_2”/> <permission-map name=“Access contents information” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> </permission-map> <permission-map name=“Modify portal content” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> </permission-map> <permission-map name=“View” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> <permission-role>Editor</permission-role> <permission-role>Reader</permission-role> </permission-map> </state> Workflows en Plone 3
    20. Creando Workflows en Plone 3. <!-- Los diversos estados con su respectivo mapeo de permisos --> <state state_id=“estado_1&quot; title=“Estado 1”> <description> Estado inicial. </description> <exit-transition transition_id=“pasar_a_2”/> <permission-map name=“Access contents information” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> </permission-map> <permission-map name=“Modify portal content” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> </permission-map> <permission-map name=“View” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> <permission-role>Editor</permission-role> <permission-role>Reader</permission-role> </permission-map> </state> Workflows en Plone 3 Título y descripción del estado
    21. Creando Workflows en Plone 3. <!-- Los diversos estados con su respectivo mapeo de permisos --> <state state_id=“estado_1&quot; title=“Estado 1”> <description> Estado inicial. </description> <exit-transition transition_id=“pasar_a_2”/> <permission-map name=“Access contents information” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> </permission-map> <permission-map name=“Modify portal content” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> </permission-map> <permission-map name=“View” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> <permission-role>Editor</permission-role> <permission-role>Reader</permission-role> </permission-map> </state> Workflows en Plone 3 Título y descripción del estado Transiciones posibles
    22. Creando Workflows en Plone 3. <!-- Los diversos estados con su respectivo mapeo de permisos --> <state state_id=“estado_1&quot; title=“Estado 1”> <description> Estado inicial. </description> <exit-transition transition_id=“pasar_a_2”/> <permission-map name=“Access contents information” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> </permission-map> <permission-map name=“Modify portal content” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> </permission-map> <permission-map name=“View” acquired=“False”> <permission-role>Manager</permission-role> <permission-role>Owner</permission-role> <permission-role>Editor</permission-role> <permission-role>Reader</permission-role> </permission-map> </state> Workflows en Plone 3 Título y descripción del estado Transiciones posibles Roles asociados al permiso actual
    23. Creando Workflows en Plone 3. <!-- Transiciones entre estados, incluyendo condiciones de seguridad --> <transition transition_id=“pasar_a_2&quot; title=“Pasar a estado 2&quot; new_state=“estado_2&quot; trigger=&quot;USER&quot; before_script=&quot;&quot; after_script=&quot;&quot;> <description>Pasar del estado 1 al estado 2. </description> <action url=&quot;%(content_url)s/content_status_modify?workflow_action=publish&quot; category=&quot;workflow&quot;>Pasar a 2</action> <guard> <guard-permission>Modify portal content</guard-permission> <guard-role>Owner</guard-role> </guard> </transition> Workflows en Plone 3
    24. Creando Workflows en Plone 3. <!-- Transiciones entre estados, incluyendo condiciones de seguridad --> <transition transition_id=“pasar_a_2&quot; title=“Pasar a estado 2&quot; new_state=“estado_2&quot; trigger=&quot;USER&quot; before_script=&quot;&quot; after_script=&quot;&quot;> <description>Pasar del estado 1 al estado 2. </description> <action url=&quot;%(content_url)s/content_status_modify?workflow_action=publish&quot; category=&quot;workflow&quot;>Pasar a 2</action> <guard> <guard-permission>Modify portal content</guard-permission> <guard-role>Owner</guard-role> </guard> </transition> Workflows en Plone 3 Atributos de la transición: Id, título, estado nuevo, tipo de disparo, scripts que puede ejecutar y descripción
    25. Creando Workflows en Plone 3. <!-- Transiciones entre estados, incluyendo condiciones de seguridad --> <transition transition_id=“pasar_a_2&quot; title=“Pasar a estado 2&quot; new_state=“estado_2&quot; trigger=&quot;USER&quot; before_script=&quot;&quot; after_script=&quot;&quot;> <description>Pasar del estado 1 al estado 2. </description> <action url=&quot;%(content_url)s/content_status_modify?workflow_action=publish&quot; category=&quot;workflow&quot;>Pasar a 2</action> <guard> <guard-permission>Modify portal content</guard-permission> <guard-role>Owner</guard-role> </guard> </transition> Workflows en Plone 3 Atributos de la transición: Id, título, estado nuevo, tipo de disparo, scripts que puede ejecutar y descripción Texto que aparece en el menú “ estado ” y la URL que se mostrará
    26. Creando Workflows en Plone 3. <!-- Transiciones entre estados, incluyendo condiciones de seguridad --> <transition transition_id=“pasar_a_2&quot; title=“Pasar a estado 2&quot; new_state=“estado_2&quot; trigger=&quot;USER&quot; before_script=&quot;&quot; after_script=&quot;&quot;> <description>Pasar del estado 1 al estado 2. </description> <action url=&quot;%(content_url)s/content_status_modify?workflow_action=publish&quot; category=&quot;workflow&quot;>Pasar a 2</action> <guard> <guard-permission>Modify portal content</guard-permission> <guard-role>Owner</guard-role> </guard> </transition> Workflows en Plone 3 Atributos de la transición: Id, título, estado nuevo, tipo de disparo, scripts que puede llamar y descripción Texto que aparece en el menú “ estado ” y la URL que se mostrará Permisos necesarios para ejecutar la transición
    27. Creando Workflows en Plone 3. <!-- Propiedades de la variable --> <variable variable_id=&quot;review_history&quot; for_catalog=&quot;False&quot; for_status=&quot;False&quot; update_always=&quot;False&quot;> <description>Provides access to workflow history </description> <default> <expression>state_change/getHistory</expression> </default> <guard> <guard-permission>Request review</guard-permission> <guard-permission>Review portal content</guard-permission> </guard> </variable> Workflows en Plone 3
    28. Creando Workflows en Plone 3. <!-- Propiedades de la variable --> <variable variable_id=&quot;review_history&quot; for_catalog=&quot;False&quot; for_status=&quot;False&quot; update_always=&quot;False&quot;> <description>Provides access to workflow history </description> <default> <expression>state_change/getHistory</expression> </default> <guard> <guard-permission>Request review</guard-permission> <guard-permission>Review portal content</guard-permission> </guard> </variable> Workflows en Plone 3 Atributos de la variable: Id, se actualiza siempre y descripción
    29. Creando Workflows en Plone 3. <!-- Propiedades de la variable --> <variable variable_id=&quot;review_history&quot; for_catalog=&quot;False&quot; for_status=&quot;False&quot; update_always=&quot;False&quot;> <description>Provides access to workflow history </description> <default> <expression>state_change/getHistory</expression> </default> <guard> <guard-permission>Request review</guard-permission> <guard-permission>Review portal content</guard-permission> </guard> </variable> Workflows en Plone 3 Atributos de la variable: Id, se actualiza siempre y descripción Expresión TALES con la que obtiene su valor
    30. Creando Workflows en Plone 3. <!-- Propiedades de la variable --> <variable variable_id=&quot;review_history&quot; for_catalog=&quot;False&quot; for_status=&quot;False&quot; update_always=&quot;False&quot;> <description>Provides access to workflow history </description> <default> <expression>state_change/getHistory</expression> </default> <guard> <guard-permission>Request review</guard-permission> <guard-permission>Review portal content</guard-permission> </guard> </variable> Workflows en Plone 3 Atributos de la variable: Id, se actualiza siempre y descripción Expresión TALES con la que obtiene su valor Permisos necesarios para acceder al valor
    31. Creando Workflows en Plone 3. Primero, definimos algunas propiedades del workflow , ID, nombre del estado inicial y nombre de la variable que almacena el estado actual (debe ser siempre review_state ). A continuación, enumeramos los permisos que se usarán. Posteriormente, definimos los diversos estados y transiciones. Para cada estado, establecemos un conjunto de posibles transiciones de salida ( exit transitions ) que estarán disponibles en el menú Estado , al igual que el mapeo de permisos en el estado particular. Las transiciones tienen un ID, un título ( title ), el estado al cual llega ( new_state ) y un tipo de disparo ( trigger ), ya sea levantado por el usuario ( USER ) o automático ( AUTOMATIC ). La etiqueta <action /> , contiene el nombre que se mostrará en el menú Estado , y la URL que se llamará si el usuario elige esta transición. Finalmente, establecemos los permisos “guardia”, si el usuario actual no tiene alguno de ellos, la transición no estará disponible. El código omitido define otros estados, transiciones y mapeos de permisos, además de algunas variables de workflow estándar (utilizadas para el historial del mismo). Workflows en Plone 3
    32. E jemplo: Workflow de solicitud del Instituto de Matemáticas. Workflows
    33. E jemplo: Workflow de solicitud del Instituto de Matemáticas, mostrando los permisos. Workflows
      • Andy McKay. The Definitive Guide to Plone . Apress, 2004. http://plone.org/documentation/manual/definitive-guide
      • Martin Aspeli. Professional Plone Development , Packt Publishing, Birmingham UK, September 2007.
      • Carlos de la Guardia. Editor grafico de workflows .
      • http://plone.org/products/collective-workflowed
      • Documentación de DCWorkflow . www.zope.org/Members/hathawsh/DCWorkflow_docs/default/DCWorkflow_doc.pdf
        • DCWorkflow Dump . Herramienta que devuelve el código Python de un workflow .
        • http://plone.org/products/dcworkflowdump
        • DCWorkflow Graph . Visor gráfico de workflows .
        • http://plone.org/products/products-dcworkflowgraph
      • Especificación de TALES expressions . http://wiki.zope.org/ZPT/TALES
      • Róman Joost. Diploma thesis. Feasibility Study on a Graphical Workflow Editor based on the Workflow Management System “AlphaFlow” , 2006. http://thesis.romanofski.de/index.html
      Referencias

    + laloealaloea, 9 months ago

    custom

    574 views, 1 favs, 0 embeds more stats

    Administración de Procesos con Plone

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 574
      • 574 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 1
    • Downloads 17
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories