21. Programando en Plone

plone.api

La herramienta mas importante actualmente para desarrolladores Plone es el complemento plone.api , el cual cubre el 20% de las tareas que cualquier desarrollador Plone que normalmente hace en 80% de su tiempo. Si no estas seguro de como manejar alguna tarea, verifica primero si plone.api tiene una solución para ti.

El api esta divido en 5 secciones. Este es un ejemplo de cada uno:

plone.api aun no es parte del núcleo de Plone, Por lo tanto, no veras ningún uso de plone.api dentro de Plone. Pero estamos seguros que sera parte de Plone.

En el código existente, a veces encontraras métodos que no significan nada para usted. Usted tiene que usar la fuente para averiguar que hacen.

Algunos de estos siguientes métodos serán reemplazados por plone.api en el futuro:

  • Products.CMFCore.utils.getToolByName -> api.portal.get_tool
  • zope.component.getMultiAdapter -> api.content.get_view

Herramientas del portal

Algunas partes de Plone son módulos muy complejos entre si (ej. el blanco mecanismo de versionado de Products.CMFEditions). Algunos de ellos tienen una api que usted aprenderá a usar tarde o temprano.

Aquí tienes unos ejemplos:

portal_catalog

unrestrictedSearchResults() regresa los resultados de búsqueda sin verificar si el usuario actual tiene permiso de acceso a los objetos.

uniqueValuesFor() regresa todas las entradas en un índice

portal_setup

runAllExportSteps() genera un archivo comprimido en formato Tar conteniendo los artefactos de todos los pasos de exportación.

portal_quickinstaller

isProductInstalled() verifica si un producto esta instalado.

Usualmente la mejor forma para aprender acerca de la herramienta de un api es mirando en el archivo interfaces.py en el respectivo paquete y leer la documentación incluida en formato docstrings.

Depurando

Aquí hay algunas herramientas y técnicas que usamos frecuentemente cuando desarrollamos y depuramos. Usamos algunas de ellas en varias situaciones durante el entrenamiento.

Rastreos y el registro

El log (y la consola cuando ejecutamos en modo foreground) recolecta todos los mensajes de log que Plone imprime. Cuando ocurre una excepción Plone lanza un rastreo. La mayoría del tiempo el rastreo es todo lo que necesitas para averiguar que esta sucediendo. También agregar tu propia información de rastreo al log es muy simple.

pdb

El depurador de Python pdb, es la herramienta simple mas importante para nosotros cuando programemos. ¡Solo agrega import pdb; pdb.set_trace() en tu código y empieza a depurar!

ipdb

Mejorar pdb con el poder de IPython, por ejemplo, la implementación del tabulador, resaltado de sintaxis, mejores rastreos y la introspección. También funciona muy bien con el complemento Products.PDBDebugMode.

Products.PDBDebugMode

Un complemento que tiene dos características esenciales para su uso.

Post-mortem debugging: le lanza en un pdb cuando ocurra una excepción. de esta forma puedes averiguar que es lo que esta mal.

pdb-view: simplemente agregando /pdb a una dirección URL, le lanza a una sesión pdb con el contexto actual como self.context. De allí puedes hacer casi todo.

Modo Depuración

Cuando se inicia Plone usando el comando ./bin/instance debug -O Plone usted terminara en una sesión de comando del depurador Interactivo.

plone.app.debugtoolbar

Un complemento que permite inspeccionar todo muy cercanamente. Incluso tiene una consola interactiva y un probador para expresiones TALES.

plone.reload

Un complemento que permite recargar el código que has cambiado sin reiniciar el sitio. Esto es también es usado por el complemento plone.app.debugtoolbar.

Products.PrintingMailHost

Un complemento que previene a Plone enviar mensajes. Los mensajes son registrados como eventos en el log del servicio.

Products.Ienablesettrace

Complemento que permite usar pdb y ipdb en scripts python skin. Eso es muy útil.

verbose-security = on

Una opción para la receta plone.recipe.zope2instance que hace a los logs de las razones detalladas sobre por que un usuario no puede ser autorizado a ver algo.

./bin/buildout annotate

Una opción que cuando se ejecute buildout realiza un log de los paquetes traídos y sus versiones.

Sentry

Sentry es una aplicación de log de errores que puede usar usted mismo. Agrega rastreos de muchas fuentes y (aquí viene la característica esencial para su uso) incluso los valores de las variables en el Stack trace. Lo usamos en todos nuestro sitios en producción.

zopepy

Buildout puede crear un shell script de Python para ti que tiene los paquetes de su sitio Plone en su PYTHONPATH. Puede agrega la parte Buildout a la suya con la siguiente configuración:

[zopepy]
recipe = zc.recipe.egg
eggs = ${instance:eggs}
interpreter = zopepy