Creación de un producto de configuración

En esta articulo busca explicar como crear paquetes de configuración general de un sitio representando las reglas generales de manejo de sitios para Plone 3, Plone 4 y Plone 5.

Introducción

Se detallan los pasos para crear un producto de configuración y se describe cada uno de los directorios y archivos importantes generados.

Un producto de configuración (“policy product”) incluye toda la configuración general del sitio. Representa las reglas generales de manejo de sitios Plone de una organización y puede incluir:

  • Configuraciones del sitio y propiedades de navegación.
  • Productos propios y de terceros que deben instalarse automáticamente con el sitio Web.
  • Configuraciones de los Viewlets utilizados en el sitio Web.
  • Estructura inicial de contenido del sitio Web.
  • Pasos adicionales a la instalación del producto, como creación de cuentas de usuarios y contenido personalizado.
  • Configuraciones de los Portlets utilizados en el sitio Web.
  • Flujo de trabajos generales de la organización.

Muchos programadores prefieren crear un simple producto de configuración (también conocido como un producto de despliegue “deployment product”) que orquesta varias dependencias del proyecto.

Generación con paster

El primer paso para la creación del producto se hace utilizando el esqueleto de paquete para Plone proporcionado por paster:

Truco

Debe tener instalado el paquete ZopeSkel para poder usar el comando paster.

Nota

Debe estar dentro el directorio src/ de su instalación el cual será el directorio que contendrá los paquetes en desarrollo.

Advertencia

Evite usar textos con caracteres especiales en al momento de responder a las preguntar que le realice el programa paster, ya que esta el momento no soporta caracteres especiales y acentuaciones.

Posteriormente puede hacer las correcciones ortográficas debidas en la metadata del paquete Egg si así lo a merita o requiere.

$ paster create -t plone cliente1.policy
Selected and implied templates:
  templer.core#basic_namespace  A basic Python project with a namespace package
  ZopeSkel#plone                A project for Plone add-ons

Variables:
  egg:      cliente1.policy
  package:  cliente1policy
  project:  cliente1.policy
Expert Mode? (What question mode would you like? (easy/expert/all)?) ['easy']:

A continuación, paster realiza algunas preguntas para personalizar la generación del paquete. La primera es si desea contestar todas las preguntas (all) o solo algunas (easy). Usted debe contestar all.

Después le pregunta los nombres del paquete Namespace (primera parte del nombre pasado al template) y el nombre del paquete (segunda parte). Como los valores por omisión son los mismos que le paso como parámetros en el comando anterior, basta presiona la tecla Enter en las siguientes dos preguntas.

Namespace Package Name (Name of outer namespace package) ['cliente1']:
Package Name (Name of the inner namespace package) ['policy']:

Truco

  1. el espacio de nombres se usa para poder agrupar varios paquetes bajo un mismo nombre.
  2. el nombre del paquete en sí.

La versión del paquete se utiliza en el Configuración del sitio ‣ Complementos para mostrar al usuario la versión instalada del producto.

Version (Version number for project) ['1.0']: 0.1

Después, se pide una corta descripción del paquete; este y los datos que siguen son para los metadatos del proyecto en el PyPI:.

Truco

los metadatos del paquete es para definir un perfil de registro para subir el paquete a un repositorio como el Python Package Index.

Description (One-line description of the project) ['']: Plone site policy for Cliente1 website
Register Profile (Should this package register a GS Profile) [False]: True
Long Description (Multi-line description (in ReST)) ['']: a Plone site policy package for Cliente1 website
Author (Name of author for project) ['']: Leonardo J. Caballero G.
Author Email (Email of author for project) ['']: plone-developers@lists.sourceforge.net
Keywords (List of keywords, space-separated) ['']: plone policy package cliente1 website
Project URL (URL of the homepage for this project) ['http://svn.plone.org/svn/collective/']: https://github.com/plone-ve/cliente1.policy
Project License (Name of license for the project) ['GPL']: GPLv2

Siempre ocupara el valor por defecto, debe ser False para funcionar bien en Zope 2.

Zip-Safe? (Can this project be used as a zipped egg? (true/false)) [False]:

Finalmente, esta ultima pregunta siempre debe ser True para funcionar en Zope 2.

Zope2 Product? (Are you creating a product for Zope2/Plone or an Archetypes Product?) [True]:
Creating template basic_namespace
Creating directory ./cliente1.policy
...
  Copying setup.py_tmpl to ./cliente1.policy/setup.py
------------------------------------------------------------------------------
The project you just created has local commands. These can be used from within
the product.

usage: paster COMMAND

Commands:
  addcontent  Adds plone content types to your project

For more information: paster help COMMAND
------------------------------------------------------------------------------

Posibles errores

IOError: No egg-info directory found

Este error se debe a que el directorio egg-info fue generado para esto acceda al directorio cliente1.policy y ejecute el siguiente comando:

$ cd cliente1.policy
$ python setup.py egg_info
Traceback (most recent call last):
  File "setup.py", line 10, in <module>
    open(os.path.join("docs", "HISTORY.txt")).read(),
IOError: [Errno 2] No such file or directory: 'docs/HISTORY.txt'

La solución a este error es mover el CHANGES.txt dentro del directorio docs/ con el nuevo nombre HISTORY.txt, ejecutando el siguiente comando:

$ mv CHANGES.txt docs/HISTORY.txt

Luego genere la información del egg-info, ejecutando el siguiente comando:

$ python setup.py egg_info
running egg_info
creating src/cliente1.policy.egg-info
writing requirements to src/cliente1.policy.egg-info/requires.txt
writing src/cliente1.policy.egg-info/PKG-INFO
writing namespace_packages to src/cliente1.policy.egg-info/namespace_packages.txt
writing top-level names to src/cliente1.policy.egg-info/top_level.txt
writing dependency_links to src/cliente1.policy.egg-info/dependency_links.txt
writing entry points to src/cliente1.policy.egg-info/entry_points.txt
writing paster_plugins to src/cliente1.policy.egg-info/paster_plugins.txt
writing manifest file 'src/cliente1.policy.egg-info/SOURCES.txt'
reading manifest file 'src/cliente1.policy.egg-info/SOURCES.txt'
writing manifest file 'src/cliente1.policy.egg-info/SOURCES.txt'
Distribution contains no modules or packages for namespace package ‘cliente1’

Este error se debe a que el archivo setup.py no tiene bien definida desde donde comenzara la búsqueda de los directorio del paquete, entonces corrijalo editando el archivo setup.py y agregue las siguientes lineas:

packages=find_packages('src', exclude=['ez_setup']),
package_dir={'': 'src'},
namespace_packages=['cliente1'],

Esqueleto generado

Este comando genera un directorio de distribución donde se encuentra la información y código para distribuir el paquete resultante como Egg. Dentro de ese directorio se encuentra un sub-directorio con el espacio de nombres general (en este ejemplo sería cliente1) y dentro de ese último el verdadero directorio del producto para Zope (en este cliente1, policy).

./cliente1.policy/
|-- cliente1
|   `-- policy
|       |-- configure.zcml
|       |-- __init__.py
|       |-- profiles
|       |   `-- default
|       |       `-- metadata.xml
|       `-- tests.py
|-- CONTRIBUTORS.txt
|-- docs
|   |-- HISTORY.txt
|   |-- INSTALL.txt
|   |-- LICENSE.GPL
|   `-- LICENSE.txt
|-- README.txt
|-- setup.cfg
|-- setup.py
`-- src
    |-- cliente1
    |   |-- __init__.py
    |   `-- policy
    |       `-- __init__.py
    `-- cliente1.policy.egg-info
        |-- dependency_links.txt
        |-- entry_points.txt
        |-- namespace_packages.txt
        |-- not-zip-safe
        |-- paster_plugins.txt
        |-- PKG-INFO
        |-- requires.txt
        |-- SOURCES.txt
        `-- top_level.txt

Dentro del directorio del producto se encuentran los dos archivos imprescindibles para crear un producto para Zope 2, junto con un esqueleto de módulo para tests.py:

  • __init__.py, incluye un método llamado initialize para que Zope reconozca el paquete como Producto.
  • configure.zcml, es el archivo de ZCML, que permite al producto utilizar código basado en Zope 3.
  • tests.py, esqueleto de módulo para tests.

Comando locales del policy

El proyecto que acaba de crear tiene local command. Estos pueden ser usados desde el propio producto. Usando el comando: paster COMMAND.

Los comandos permitidos:

add Permite añadir nuevas plantillas a un paquete existente.

Para más información ejecute el comando: paster help COMMAND.

Su nuevo paquete es compatible con los comandos locales. Para acceder a ellos, cambiando de directorio dentro del Namespace de su nuevo paquete.

A partir de ahí, usted será capaz de ejecutar el la orden de comando paster add --list para ver los comandos locales disponibles para este paquete.

Por hacer

Terminar de explicar estos concepto.

Por hacer

Escribir un ejemplo sobre este punto.

Manipulando dependencias

En Plone la resolución de dependencias de paquetes Egg, es de gran utilidad para garantizar la instalación de todas lo necesario para el funcionamiento de su sitio Plone. Las dependencias de los paquetes Egg se definen en 2 o 3 lugares (contextos) distintos, entonces a continuación se detalla donde y la utilidad contextual de cada uno:

Truco

Al menos debe realizar el paso 1 y el paso 2.

  1. Paso 1: el archivo setup.py.
  2. Paso 2: el archivo metadata.xml.
  3. Paso 3: opcionalmente los archivos ZCML.

El archivo setup.py

El archivo setup.py en este paquete incluye la declarativa install_requires a la cual puede indicar que dependencias de paquetes Egg son requeridas para la instalación de este producto.

Esto hace que se garantice que el todas las librerías Python o productos Zope / Plone necesario para el uso de este paquete estén instalado desde el contexto de instalación a nivel Python con sus respectivos registros PYTHONPATH.

En este caso se define la librería plone.api y el producto Products.PloneFormGen como dependencias de este paquete, la cual se utilizara mas adelante. A continuación se muestra el código fuente de ejemplo:

install_requires=[
    'setuptools',
    # -*- Extra requirements: -*-
    'plone.api',
    'Products.PloneFormGen==1.7.14',
],

Esta modificación al archivo setup.py permite que se instale en el PYTHONPATH la librería plone.api y el producto Products.PloneFormGen.

El archivo metadata.xml

El archivo metadata.xml se usa para hacer referencia a perfiles de instalación de productos y este archivo se ubica profiles/default/. A continuación se muestra el código fuente de ejemplo:

<?xml version="1.0"?>
<metadata>
  <version>1000</version>
  <dependencies>
    <dependency>profile-Products.PloneFormGen:default</dependency>
  </dependencies>
</metadata>

Esta modificación al archivo metadata.xml agregando la directriz <dependencies /> permite que GenericSetup haga referencia a los perfiles de instalación de las dependencias de este paquete.

Nota

Solo se agrega la directriz <dependency /> los producto que poseen perfil de instalación GenericSetup. Por esta razón librería plone.api no se define esta sección.

Los archivos ZCML

El archivo configure.zcml esta en el directorio cliente1.policy/cliente1/policy/, este define configuraciones ZCML, para este caso de configuraciones se usa para incluir el dependencies.zcml para las dependencias. Entonces debe editar el archivo configure.zcml y agregar el siguiente código a continuación:

<!-- -*- extra stuff goes here -*- -->

<include file="dependencies.zcml" />

El archivo dependencies.zcml debe crearse en el directorio cliente1.policy/cliente1/policy/ (al mismo nivel del archivo configure.zcml), para este caso de configuraciones se usa para incluir de paquetes necesarios como dependencias al contexto ZCML. Entonces debe crear el archivo dependencies.zcml y agregar el siguiente código a continuación:

<configure
    xmlns="http://namespaces.zope.org/zope"
    i18n_domain="cliente1.policy">

  <include package="Products.PloneFormGen" />

</configure>

Esta modificación al archivo configure.zcml y agregación del archivo dependencies.zcml la directriz <dependencies /> permite que GenericSetup haga referencia a los perfiles de instalación de las dependencias de este paquete.

Nota

Solo se agrega la directriz <dependency /> los producto que poseen perfil de instalación GenericSetup. Por esta razón librería plone.api no se define esta sección.

Para comprobar el correcto funcionamiento de este procedimiento debe configurar este producto en un entorno de desarrollo o sitio de producción y habilitar el producto en su sitio Web Plone.

Luego de ejecutar buildout y habilitar su producto podrá notar que no solo el producto cliente1.policy sino ademas el producto Products.PloneFormGen, esto se debe a que estas configuraciones definen el mecanismo para resolver las dependencias al contexto Python para el PYTHONPATH y perfiles de instalación GenericSetup.

Manipulando la Instalación

En algunas ocasiones hay pasos que requiere realizar al momento de la instalación de un producto de configuración que no son manejables con Generic Setup. En esos casos, existe un mecanismo para ejecutar código Python en el momento que se instala un perfil.

Para ejecución de código Python a través de los pasos de importación de GenericSetup debe crear varios archivos en 3 o 4 lugares (contextos) distintos, entonces a continuación se detalla donde y la utilidad contextual de cada uno:

Truco

Debe realizar todos los pasos.

  1. Paso 1: el archivo config.py.
  2. Paso 2: el archivo import_steps.xml.
  3. Paso 3: el archivo cliente1.policy_various.txt.
  4. Paso 4: el archivo setuphandlers.py.

El archivo config.py

El archivo config.py se usa para definir constantes del producto.

Se debe crear en el directorio cliente1.policy/cliente1/policy/ un archivo config.py (al mismo nivel del archivo configure.zcml), en la raíz del modulo de paquete, con el siguiente código:

# -*- coding: utf-8 -*-

"""
Contains constants used by setuphandler.py
"""

PROJECTNAME = 'cliente1.policy'

DEPENDENCIES = [
    'plone.api',
    'Products.PloneFormGen',
    ]

Este archivo se estila usar de forma amplia en el producto, incluyendo el archivo setuphandlers.py.

El archivo import_steps.xml

El archivo import_steps.xml se usa para definir los pasos de importar de GenericSetup. Para enlazar este código con los pasos de importación, existe un paso especial en GenericSetup, llamado import_steps.

Para activarlo, debe agregar el siguiente código dentro del archivo import_steps.xml, dentro del directorio profiles/default (al mismo nivel del archivo metadata.xml), con el siguiente código:

<?xml version="1.0"?>
<import-steps>
   <import-step id="cliente1.policy.various"
                version="20080625-01"
                handler="cliente1.policy.setuphandlers.setupVarious"
                title="Cliente1 Policy: miscellaneous import steps">
     <dependency step="plone-content" />
     Various import steps that are not handled by GS import/export
     handlers.
   </import-step>
</import-steps>

Con este archivo defines un directiva <import-step /> en la cual define un atributo llamado handler en el cual define un Nombre de puntos Python haciendo referencia al método setupVarious en el modulo setuphandlers.py del paquete cliente1.policy, el cual se encargar de ejecutar las tareas de importación y/o personalización del sitio Plone.

Lo único que puede variar dependiendo de lo que necesita hacer, es la parte donde se listan los steps de dependencia, marcados por la etiqueta dependency en el XML. En el atributo step de la etiqueta dependency se debe colocar el nombre del paso que necesita que sea ejecutado antes que su código. Se pueden agregar varias etiquetas dependency con distintos pasos para el caso de que su código dependa de varios pasos.

El archivo cliente1.policy_various.txt

Para prevenir la ejecución de este código durante la instalación de otros productos, se agrega un archivo de texto, llamado cliente1.policy_various.txt, dentro del directorio profiles/default con el siguiente contenido:

This file is used as a marker in setuphandlers.py.

Este archivo se usa para verifica su existencia dentro de este método setupVarious en el modulo setuphandlers.py.

El archivo setuphandlers.py

El archivo setuphandlers.py se usa para hacer realizar todas las tareas que no se puede realizar usando directamente directivas GenericSetup.

Se debe crear en el directorio cliente1.policy/cliente1/policy/ un archivo setuphandlers.py (al mismo nivel del archivo configure.zcml), en la raíz del modulo de paquete, con el siguiente código:

# -*- coding: utf-8 -*-

import logging
from plone import api
from cliente1.policy.config import PROJECTNAME

logger = logging.getLogger(PROJECTNAME)

def setupVarious(context):
    """ miscellaneous import steps for setup """
    if context.readDataFile('cliente1.policy_various.txt') is None:
        return

    portal = api.portal.get()
    # aquí va el código particular

método setupVarious

El método setupVarious es donde se coloca el código particular para la instalación, que puede hacer cualquier cosa que se necesite dentro del portal.

Crear enlace

A continuación un ejemplo que muestra como crear tipo de contenido de Enlace, a la vieja usanza:

def createLink(context, title, link):
    """
    Crea y publica un vínculo en el contexto dado.
    """
    id = idnormalizer.normalize(title, 'es')
    if not hasattr(context, id):
        context.invokeFactory('Link', id=id, title=title, remoteUrl=link)

Truco

Este método debe definirse antes el método setupVarious se invoca en el orden que se requiere ejecutar, colocando debajo de la marca “# aquí va el código particular”.

Crear carpetas

A continuación un ejemplo que muestra como crear tipo de contenido de Carpeta, a la vieja usanza:

def createFolder(context, title, allowed_types=['Topic'], exclude_from_nav=False):
    """Crea una carpeta en el contexto especificado por omisión,
    la carpeta contiene colecciones (Topic).
    """
    id = idnormalizer.normalize(title, 'es')
    if not hasattr(context, id):
        context.invokeFactory('Folder', id=id, title=title)
        folder = context[id]
        folder.setConstrainTypesMode(constraintypes.ENABLED)
        folder.setLocallyAllowedTypes(allowed_types)
        folder.setImmediatelyAddableTypes(allowed_types)
        if exclude_from_nav:
            folder.setExcludeFromNav(True)
        folder.reindexObject()
        logger.info("Created the Folder called {0}".format(folder))
    else:
        folder = context[id]
        folder.setLocallyAllowedTypes(allowed_types)
        folder.setImmediatelyAddableTypes(allowed_types)
        # reindexamos para que el catálogo se entere de los cambios
        folder.reindexObject()

Truco

Este método debe definirse antes el método setupVarious se invoca en el orden que se requiere ejecutar, colocando debajo de la marca “# aquí va el código particular”.

Cambiar el flujo de trabajo

A continuación un ejemplo que muestra como cambiar el Flujo de trabajo del objeto utilizando CMFPlacefulWorkflow, a la vieja usanza:

from Products.CMFPlacefulWorkflow.PlacefulWorkflowTool import WorkflowPolicyConfig_id

...

def set_workflow_policy(obj):
    """
    Cambiar el workflow del objeto utilizando CMFPlacefulWorkflow.
    """
    obj.manage_addProduct['CMFPlacefulWorkflow'].manage_addWorkflowPolicyConfig()
    pc = getattr(obj, WorkflowPolicyConfig_id)
    pc.setPolicyIn(policy='one-state')
    logger.info('Workflow changed for element %s' % obj.getId())

Truco

Este método debe definirse antes el método setupVarious se invoca en el orden que se requiere ejecutar, colocando debajo de la marca “# aquí va el código particular”.

Eliminación de contenidos

A continuación un ejemplo que muestra como eliminar contenidos desde la método setupVarious en el modulo setuphandlers.py:

# -*- coding: utf-8 -*-

import logging
from plone import api
from cliente1.policy.config import PROJECTNAME

logger = logging.getLogger(PROJECTNAME)

def remove_defaults_nav(portal):
    '''Remove defaults navegations and contents'''

    items_removable = ['news', 'events', 'Members', 'front-page']
    for item in items_removable:
      if hasattr(portal, item):
        try:
          api.content.delete(obj=portal[item])
          logger.info("Deleted {0} item".format(item))
        except AttributeError:
          logger.info("No {0} item detected. Hmm... strange. Continuing....".format(item))

def setupVarious(context):
    """ miscellaneous import steps for setup """
    if context.readDataFile('cliente1.policy_various.txt') is None:
        return

    portal = api.portal.get()
    # aquí va el código particular
    remove_defaults_nav(portal)

Para comprobar el correcto funcionamiento de este procedimiento debe configurar este producto en un entorno de desarrollo o sitio de producción y habilitar el producto en su sitio Web Plone.

Luego de ejecutar buildout y habilitar su producto (se recomienda en un sitio Web Plone nuevo) podrá notar que no solo el producto cliente1.policy sino ademas veras el resultado de la ejecución de código Python de los pasos de importación de GenericSetup.

Ver también

¿Cómo instalarlo?

Luego de generar el producto de configuración debe agregar este a la configuración buildout para completar la instalación de este producto. Esto se realiza usando la herramienta zc.buildout para esto hay dos enfoques realizar esto, a continuación se describe:

Sitio en desarrollo

Este paquete en entornos desarrollo debe ofrece un archivo buildout.cfg adecuado, como buena practica en desarrollo de software, y su sentido es ofrecer un mecanismo de pruebas de integración este producto en un sitio Plone aislado, sin afectar las configuraciones de producción de su proyecto.

Para recrear estas configuraciones debe ejecutar los siguientes pasos:

  1. Descargar el archivo bootstrap.py desde el sitio de buildout.org, con el siguiente comando:

    $ wget http://downloads.buildout.org/2/bootstrap.py
    
  2. Cree el archivo buildout.cfg en el mismo directorio donde esta el archivo bootstrap.py. y agregue la siguiente configuración:

    [buildout]
    extends = http://dist.plone.org/release/4.3-latest/versions.cfg
    find-links =
        http://dist.plone.org/release/4.3-latest/
        http://dist.plone.org/thirdparty/
    
    develop = .
    eggs =
    unzip = true
    versions = versions
    
    parts = instance
    
    package-name = cliente1.policy
    
    [versions]
    
    [instance]
    recipe = plone.recipe.zope2instance
    user = admin:admin
    http-address = 8080
    eggs =
        Plone
        plone.app.upgrade
        ${buildout:package-name}
        ${buildout:eggs}
    zcml =
        ${buildout:package-name}
    environment-vars = zope_i18n_compile_mo_files true
    

    Truco

    Esta configuraciones se basa para la versión mas reciente de Plone 4.3. Si necesita una versión distinta a esta por favor consulte el repositorio buildout.plonetest para obtener la configuraciones de pruebas de buildout.

  3. Entonces ejecute los comandos habituales son python bootstrap.py + bin/buildout.

Para comprobar el correcto funcionamiento de este procedimiento debe iniciar la Instancia de Zope y crear un nuevo sitio Plone, así de esta forma se puede comprobar que se instalo y creo todo correctamente.

Sitio en producción

Este paquete en entornos producción (instalación existen o otras configuraciones buildout) debe configurarse por lo generar un archivo buildout.cfg o basado en configuraciones de este tipo, el objeto es agregar este paquete cliente1.policy a la sección eggs del archivo buildout.cfg. Para recrear estas configuraciones debe ejecutar los siguientes pasos:

eggs =
    ...
    cliente1.policy

Nota

Debe tener habilitado la extensión mr.developer para gestionar localmente el producto en desarrollo, y posterior publicación en un sistema de control de versiones.

Quizás dependiendo su configuración en la variable declarativa de auto-checkout de mr.developer tiene que agregar la siguiente linea:

auto-checkout =
    cliente1.policy

Truco

Usted puede usar el comodín * en ves de cada linea con los paquetes en desarrollo, lo cual le indicara a la extensión mr.developer que compruebe local desde el filesystem o remotamente desde un control de versiones todos los paquetes de descritos en la sección sources.

En la su sección declarativa sources del archivo buildout.cfg tiene que agregar la siguiente linea:

[sources]
cliente1.policy = fs cliente1.policy

Truco

la opción fs le indica a la extensión mr.developer que gestione el paquete localmente desde el filesystem o sistema de archivo.

Luego ejecute el script buildout, de la siguiente forma:

$ ./bin/buildout -vN

Con este comando busca el paquete o sus dependencias en el repositorio PyPI, descarga e instala el producto en su instancia Zope para sus sitios Plone allí hospedados.

Nota

Hasta este punto usted NO ha publicado producto de configuración en el repositorio PyPI, o repositorio de control de versiones como SVN o Git mas si este tiene dependencias de instalación se descargaran e instalaran por usted.

Entonces inicie la Instancia de Zope, de la siguiente forma:

$ ./bin/instance fg

Luego de esto ya tiene disponible el producto para ser habilitado en cada sitio Plone dentro de su Instancia de Zope.

Habilitarlo en Plone

Para instalar de este producto de configuraciones existen varias formas de hacerlo, este proceso se hace en la mayoría de los casos manualmente como se describe cada uno a continuación:

Durante la creación del sitio

Acceda al asistente Crear un sitio Plone y haga clic en el botón Crear un nuevo sitio Plone, como se muestra en la grafica:

Crear un Sitio Plone

Crear un Sitio Plone

Luego allí indique el id del sitio, el título corto para el sitio, seleccione el idioma por defecto para el sitio y seleccione cualquier complemento que quiera activar de forma inmediata durante la creación del sitio en la sección Complementos en nuestro caso y marque la casilla llamada cliente1.policy y luego presione el botón Crear un Sitio Plone.

Habilitar el complemento cliente1.policy

Habilitar el complemento cliente1.policy

Posterior la creación del sitio

Si durante la creación del sitio no selecciono en la sección Complementos el producto cliente1.policy, puede realizar accediendo a la herramienta en Configuración del Sitio ‣ Interfaz de Administración de Zope ‣ portal_quickinstaller y marque la casilla llamada cliente1.policy y luego presione el botón Install.

Habilitar el complemento cliente1.policy desde la ZMI

Habilitar el complemento cliente1.policy desde la ZMI

Ejecutar perfil de instalación

En Plone 3 y Plone 4 acceda a la herramienta en Configuración del Sitio ‣ Interfaz de Administración de Zope ‣ portal_setup ‣ Import ‣ Select Profile or Snapshot seleccione la lista desplegable llamada cliente1.policy como se muestra en la siguiente figura:

Administración de configuración y Add-on desde la ZMI

Administración de configuración y Add-on desde la ZMI

Luego desplace al final de la pagina y presione el botón Import all steps

El botón de "Export selected steps" en portal_setup

El botón de “Export selected steps” en portal_setup

Durante la ejecución Buildout

Existe una receta Buildout collective.recipe.plonesite que le permite automatizar la creación del sitio Plone ejecutando el perfiles de instalación que aplica las personalizaciones creadas e instala las dependencias descritas en el producto.

Este procedimiento ofrece aprovechar las ventajas de Buildout para automatizar los procesos Durante la creación del sitio, Posterior la creación del sitio y Ejecutar perfil de instalación, ya que el mismo es muy útil para entornos de pruebas o configuraciones de despliegue en ambientes de producción.

Para esto usted tiene que agregar una nueva sección en la declarativa parts del archivo buildout.cfg como se muestra a continuación:

[buildout]
parts =
    ...
    plonesite

# For options see http://pypi.python.org/pypi/collective.recipe.plonesite
[plonesite]
recipe = collective.recipe.plonesite
site-id = Plone
instance = instance
profiles = cliente1.policy:default

Luego ejecute el script buildout, de la siguiente forma:

$ ./bin/buildout -vN

Con este comando busca el paquete o sus dependencias en el repositorio PyPI, descarga e instala el producto en su instancia Zope para sus sitios Plone allí hospedados.

Entonces inicie la Instancia de Zope, de la siguiente forma:

$ ./bin/instance fg

De esta forma ya tiene disponible el sitio creado con el nombre Plone con su Producto Plone de configuraciones aplicado en su Instancia de Zope configurada de forma standalone (autónoma).

Truco

Para configuraciones en ZEO consulte las opciones de la receta.

Resumen

En este artículo has aprendido a:


Descarga código fuente

Usted puede descargar el código fuente de este ejemplo, para esto ejecute el siguiente comando:

$ git clone https://github.com/plone-ve/cliente1.policy.git cliente1.policy

Referencia

los comentarios son proporcionados por Disqus

Editar este documento

El código fuente de este archivo esta hospedado en GitHub. Todos pueden actualizar y corregir errores en este documento con unos clic - sin necesidad de descargar.

  1. Vaya hacia el articulo Creación de un producto de configuración en GitHub.
  2. Presione el botón Fork. Este creara su propia copia personal de la documentación.
  3. Edite los archivos usando el editor de texto de GitHub desde su navegador Web
  4. Rellene en la caja de texto Commit message al final de la pagina indicando por que usted realizo estos cambios. Presione el botón Propose file change próximo a ese cuando haya finalizado.
  5. Luego diríjase a la página Send a pull request (no será necesario rellenar ningún texto adicional). Sólo tiene que pulsar el botón Send pull request.
  6. Sus cambios serán consultados por un revisor dentro de la pestaña Pull requests del proyecto en Github.

Para mas información básica acerca de como actualizar este manual y referencia a sintaxis Sphinx, por favor consulte la guía Escribiendo y actualizando el manual.