26. Usar contenido generado

¿Cómo hacer que los ponentes potenciales envíen sus charlas? Dejamos que se registren en el sitio y 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 de las charlas.

  • Otorgar roles locales.

  • Crear un flujo de trabajo para las charlas.

Auto-registro

Restringir tipos de contenidos

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

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 todas las conversaciones, incluso los de otros usuarios en el estado privado. Ya que no queremos que esto vamos a crear un flujo de trabajo modificado para las charlas. El nuevo flujo de trabajo sólo les permitirá ver y editar las conversaciones que han creado ellos mismos y no los de otros usuarios.

  • Valla a la ZMI > portal_workflow

  • Ver como las charlas 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 Flujo de trabajo de Charla.

  • 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 tabla para el rol * Colaborador * y quitar los permisos para Access contents information y View. Tenga en cuenta que el Propietario (es decir, el 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 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 personalizable setuphandler.py 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 script setuphandler tiene una dependencia en typeinfo porque sólo permitirá la creación de charlas. Para este tipo ya tiene que existir.

Crear un nuevo archivo setuphandlers.py

 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:

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 la setuphandler 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())