combinación ganadora: plone como cms, tu framework preferido como frontend

Post on 18-Dec-2014

1.339 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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 pre­existente

   

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="mirror­db"              echo="True"/>

   <!­­ associate the database connection to mirror db structures ­­>   <db:bind engine="mirror­db"           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=UTF­8

# 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 = 'front­page'; content_id |     id     |     title­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­          8 | front­page | 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

rallende@menttes.com

http://twitter.com/robertoallende 

http://robertoallende.com

top related