combinación ganadora: plone como cms, tu framework preferido como frontend
DESCRIPTION
Plone es un excelente sistema de gestión de contenidos. Recientemente ha sido elegido como el mejor CMS no-PHP en un popular concurso anual. A pesar de esto, muchos desarrolladores web de Python encuentran complejo a Zope, el framework con el que esta desarrollado el CMS. Ahora, ¿qué tal si pudieras usar Plone solo como un gestor de contenidos y tu framework favorito, cualquiera sea, para implementar un front-end de forma transparente, obteniendo una configuración basada sobre una aplicación probada y de bajo mantenimiento, como backend siendo libre para escribir tu propia aplicación, usando el poder y flexibilidad de tu framework web? En esta charla, se mostrarán ejemplos realizados con un par de productos de terceros de Plone y front-ends en varios frameworks.TRANSCRIPT
Combinación ganadora: Plone y tu framework favorito
Charla basadaen un trabajo
de Carlos de la Guardia
http://us.pycon.org/2009/conference/schedule/event/85/
Ustedes ?
menttes
Por qué ?
Plone es el mejor CMSNO desarrollado en PHP
Plone tiene muchas prestaciones● Fácil de usar e instalar ● Cumple con estandares, incluyendo
accesibilidad● Mejor registro de seguridad entre los CMSs
mas populares● Disponible en mas de 40 lenguajes● Motor de workflow y reglas● Versionado: historial y revertir cambios ● y por supuesto...
Python
pero...
Plone es complejo
Plone puede ser lento
Caching no siempre es la respuesta al tráfico
Plone NO es un framework web de propósito general
● Aunque a veces ovidamos eso...● Nuestros clientes no piden funcionalidades:
“queremos Plone, solo necesitamos sacar tal funcionalidad y agregar otras tantas”
● O simplemente creemos que no tenemos otra opción.
● y al final nos queda...
Frankenplone
Y no deberia ser siempre asi.
Es posible trabajar con tus herramientas favoritas.
Content MirrorKapil Thangavelu
Content Mirror serializa el contenido de Plone en una bdd
relacional
● Todos los tipos de contenidos que vienen out of the box en Plone y los campos archetypes.
● Tipos de contenidos archetypes, agregados en productos de terceros.
● Mantiene jerarquía de contenido.
● Mirroring completamente automatizado, no requiere configuración mas allá de la instalación.
● Soporte para Plone 2.5, 3.0, 3.1, 3.2 y 3.3.
Simple
Ahora podemos:
● Usar Plone solo para administrar contenido● Usar cualquier framework para trabajar con el
contenido.● Quitar Plone del deployment● Dejar de pensar como hacer algo en términos
de plone y comenzar a pensar qué queremos realizar.
● Simplificar, simplificar
..y podemos servir contenido Plone rápido!
Cómo funciona ?
● Se integra dentro del manejador de eventos de Plone y subscribe eventos al ciclo de vida de contenido (object added, edited, deleted).
● Transforma schemas de contenido Plone en tablas relacionales usando SQLAlchemy
● Para todos los objetos se genera un schema, incluyendo archivos y relaciones.
● Se genera una tabla para cada tipo de contenido Plone.
Instalación
● Bajar: http://code.google.com/p/contentmirror/downloads/list
● Instalar● Configurar bdd● Configurar tipos de contenidos propios● Generar tablas● Exportar contenido preexistente
Configurar la bdd con ZCML<configure xmlns="http://namespaces.zope.org/zope" xmlns:db="http://namespaces.objectrealms.net/rdb" xmlns:ore="http://namespaces.objectrealms.net/mirror"> <! setup a database connection > <db:engine url="postgres://localhost/plone" name="mirrordb" echo="True"/>
<! associate the database connection to mirror db structures > <db:bind engine="mirrordb" metadata="ore.contentmirror.schema.metadata" />
</configure>
Configurar los tipos de contenidos propios
Por cada tipo de contenido del sitio:
<ore:mirror content= "Products.ATContentTypes.content.document.ATDocument" />
Generar tablas y subir el contenido
$ dropdb plone$ createdb plone encoding=UTF8
# generate table definitions and create tables$ bin/instance run parts/productdistros/ContentMirror/ddl.py $ postgres > mirror.sql$ psql plone < /home/andy/plone/zinstance/mirror.sql
# optionally, load existing content$ bin/instance run parts/productdistros/ContentMirror/bulk.py Plone
Listo.
Los cambios se envían de forma síncrona a la bdd
plone# select content_id, id, title from content where id = 'frontpage'; content_id | id | title++ 8 | frontpage | Content Mirror sent this(1 row)
Qué tipos de sitios ?
● Pocos gestores de contenidos, muchos usuarios
● Sitios freezados● Sitios con separación clara contenido y
presentación: – Revistas – Períodicos– Gobierno– ONG
Plyne, por menttes
from pylons import configfrom sqlalchemy import Column, MetaData, Table, typesfrom sqlalchemy.orm import mapperfrom sqlalchemy.orm import scoped_session, sessionmaker
meta = MetaData(engine)model_classes = {}
for tn in engine.table_names(): class_name = str(tn).capitalize() new_class = type( class_name , object.__bases__, dict (object.__dict__)) new_table = Table( tn, meta, autoload=True) mapper(new_class, new_table)
model_classes[ class_name ] = new_class
Plango, por Andy McKay
from django.db import modelsfrom django.contrib.contenttypes.models import ContentType
from utils import normalize_name
class Content(models.Model): class Meta: db_table = u'content' content_id = models.IntegerField(primary_key=True, editable=False) id = models.CharField(max_length=256, editable=False) uid = models.CharField(unique=True, max_length=36, editable=False) portal_type = models.CharField(max_length=64, editable=False) status = models.CharField(max_length=64, editable=False, null=False) type = models.CharField(max_length=64, editable=False) container = models.ForeignKey('self', related_name="parent", editable=False)
Repoze.BFG, por Carlos de la Guardia
class WebSite(UserDict): implements(IWebSite,ILocation) __acl__ = [ (Allow, Everyone, 'view') ]
def __init__(self, website_id): UserDict.__init__(self) self.__name__ = None self.__parent__ = None self.website_id = website_id session = Session() website = session.query( PloneContent ).with_polymorphic( PloneWebSite ).filter( PloneContent.id==website_id ).first() self.title = website.title
Y mas...
● Turbogears● Werkzeug● PHP● Java
Content Mirror es fácil de extender● Por ejemplo
– Reportes a partir del contenido– Auditar cambios– Exportar a formatos como JSON– Otros medios de persistencia
● Content mirror Usa la Arquitectura de Componentes de Zope
● Otra cosa que sea bdd relacional
Nosotros estudiamos la AC de Zope para que vos no tengas que hacerlo.
Front end para Google App Engine
● Aprovechar la infraestructura de Google● Usar su autenticación● Dejar que ellos solucionen la escalabilidad
● Casi un juguete, pero muestra que se puede hacer con ContentMirror y Plone
front end para GAE import osimport wsgiref.handlers
from google.appengine.ext import webappfrom google.appengine.ext.webapp import templatefrom google.appengine.ext import dbfrom google.appengine.ext.db import polymodelfrom google.appengine.api import users
class PloneContent(polymodel.PolyModel): id = db.StringProperty() uid = db.StringProperty() portal_type = db.StringProperty() status = db.StringProperty() type = db.StringProperty()
Plone content in GAE
Todos los frontends están disponibles en:
http://contentmirror.googlecode.com/
Caso de éxito
Biblioteca del Congress en Chile
Crear multiple sitios en una instancia
Seleccionar contenido
Definir layout y estilo
Deploy usando repoze.bfg
Y que Plone sea parte del universo Python
http://www.plonesymposium.com.br
Muchas gracias!
Roberto AllendeSobre un trabajo de Carlos de la Guardia
http://twitter.com/robertoallende
http://robertoallende.com