26. Usar contenido generado

¿Cómo hacer que los potenciales ponentes envíen sus charlas? Dejamos que se registren en el sitio y se le otorgan derecho a crear tipos de contenidos Talk. Para ello volvemos a cambiar el sitio a través de la Web.

En este capítulo vamos a:

  • Permitir auto registro de usuario.

  • Restringir tipos de contenidos en la carpeta talks de las charlas.

  • Otorgar roles locales.

  • Crear un flujo de trabajo para los tipos de contenidos Talk.

Auto-registro

Restringir tipos de contenidos

  • En la carpeta talks seleccione Restricciones… en el menú Añadir nuevo.... Solo permita agregar tipos de contenidos Talks.

Otorgar roles locales

  • Valla a la pestaña Compartir y otorgar el rol Puede agregar al grupo Usuarios conectados. Ahora cualquier usuario puede agregar contenido en esta carpeta (y solamente en esta carpeta).

Ahora todos los Usuarios conectados pueden crear y enviar charlas en esta carpeta con el permiso del flujo de trabajo por defecto.

Un flujo de trabajo personalizado para las charlas

Todavía tenemos que solucionar un problema: los usuarios autenticados pueden ver todos los tipos de contenidos talks, incluso los de otros usuarios en el estado privado. Ya que no queremos que esto vamos a crear un flujo de trabajo modificado para los tipos de contenidos talks. El nuevo flujo de trabajo sólo les permitirá ver y editar los tipos de contenidos talks que han creado ellos mismos y no los de otros usuarios.

  • Valla a la herramienta ZMI > portal_workflow

  • Ver como los tipos de contenidos talks tiene el mismo flujo de trabajo como la mayoría del contenido (Por defecto)

  • Valla a la pestaña Contents, marque la casilla próxima a simple_publication_workflow, haga clic en Copy y Paste.

  • Renombrar el nuevo flujo de trabajo desde copy_of_simple_publication_workflow a talks_workflow.

  • Edite el flujo de trabajo haciendo clic en: Change the Title to Talks Workflow.

  • Haga clic en la pestaña States y haga clic en private y edite este estado. En la próximo vista seleccione en la pestaña Permissions.

  • Encuentra en la columna de la tabla para el rol Colaborador y quitar los permisos para Access contents information y View. Tenga en cuenta que el rol Propietario (es decir, el rol Creador) todavía tiene algunos permisos.

  • Hacer lo mismo para el estado pending.

  • Valla a la herramienta portal_workflow y establecer el nuevo flujo de trabajo talks_workflow para los tipos de contenidos talks. Haga clic Change y entonces Update security settings.

Nota

El complemento plone.app.workflowmanager provee una más agradable de interfaz de usuario para esto. El problema es que necesita una pantalla grande para él y que puede ser muy confuso también.

Hecho.

Mover los cambios el sistema de archivo.

No queremos hacer estos pasos para cada nueva conferencia manualmente para que nos movemos los cambios en nuestro paquete.

Flujo de trabajo

  • Exporte el paso GenericSetup Workflow Tool en la siguiente dirección URL http://localhost:8080/Plone/portal_setup/manage_exportSteps.

  • Lance el archivo workflows.xml dentro del directorio profiles/default.

  • Lance el archivo workflows/talks_workflow/definition.xml en profiles/default/workflows/talks_workflow/definition.xml. Los otros son sólo definiciones de los flujos de trabajo por defecto y sólo queremos cosas en nuestro paquete que cambia Plone.

Auto-registro

Esto tiene que suceder en Python en una archivo setuphandler.py personalizable, ya que aún no existe un entorno exportable para esto.

Registrar un paso de importación en el archivo configure.zcml. Será ejecutará automáticamente al volver a instalar el complemento.

1
2
3
4
5
6
7
<genericsetup:importStep
  name="ploneconf.site"
  title="ploneconf.site special import handlers"
  description=""
  handler="ploneconf.site.setuphandlers.setupVarious">
    <depends name="typeinfo"/>
</genericsetup:importStep>

Tenga en cuenta que el módulo setuphandler tiene una dependencia en typeinfo porque sólo permitirá la creación de tipos de contenidos talks. Para este tipo ya tiene que existir.

Crear un nuevo archivo setuphandlers.py, agregando el siguiente código Python:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- coding: UTF-8 -*-
from plone.app.controlpanel.security import ISecuritySchema
from plone import api

import logging

PROFILE_ID = 'profile-ploneconf.site:default'
logger = logging.getLogger('ploneconf.site')


def setupVarious(context):

    # Ordinarily, GenericSetup handlers check for the existence of XML files.
    # Here, we are not parsing an XML file, but we use this text file as a
    # flag to check that we actually meant for this import step to be run.
    # The file is found in profiles/default.

    if context.readDataFile('ploneconf.site_various.txt') is None:
        return

    site = api.portal.get()
    set_up_security(site)


def set_up_security(site):
    secSchema = ISecuritySchema(site)
    secSchema.set_enable_self_reg(True)

Agregue el archivo marcador profile/default/ploneconf.site_various.txt usado en la linea 18, usando el código anterior, con el siguiente contenido:

The ploneconf.site_various step is run if this file is present in the profile

Otorgar roles locales

Ya que se aplica sólo a una determinada carpeta en el sitio nosotros normalmente no escribe código para ello.

Pero podemos añadir fácilmente un método para el módulo setuphandler el cual cree la carpeta y se establece un cierto ajuste por ello.

Aquí hay un ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# -*- coding: UTF-8 -*-
from plone.app.controlpanel.security import ISecuritySchema
from plone import api
from Products.CMFPlone.interfaces.constrains import ISelectableConstrainTypes
from plone.app.dexterity.behaviors import constrains

import logging

PROFILE_ID = 'profile-ploneconf.site:default'
logger = logging.getLogger('ploneconf.site')


def setupVarious(context):

    # Ordinarily, GenericSetup handlers check for the existence of XML files.
    # Here, we are not parsing an XML file, but we use this text file as a
    # flag to check that we actually meant for this import step to be run.
    # The file is found in profiles/default.

    if context.readDataFile('ploneconf.site_various.txt') is None:
        return

    site = api.portal.get()
    set_up_security(site)
    set_up_content(site)


def set_up_security(site):
    secSchema = ISecuritySchema(site)
    secSchema.set_enable_self_reg(True)


def set_up_content(site):
    """Create and configure some initial content"""
    if 'talks' in site:
        return
    talks = api.content.create(
        container=site,
        type='Folder',
        id='talks',
        title='Talks')
    api.content.transition(talks, 'publish')
    api.group.grant_roles(
        groupname='AuthenticatedUsers',
        roles=['Contributor'],
        obj=talks)
    # Enable constraining
    behavior = ISelectableConstrainTypes(talks)
    behavior.setConstrainTypesMode(constrains.ENABLED)
    behavior.setLocallyAllowedTypes(['talk'])
    behavior.setImmediatelyAddableTypes(['talk'])
    logger.info("Created and configured %s" % talks.absolute_url())