Combinación ganadora: Plone como CMS, tu framework preferido como frontend

1,549 views

Published on

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.

Published in: Technology
1 Comment
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total views
1,549
On SlideShare
0
From Embeds
0
Number of Embeds
18
Actions
Shares
0
Downloads
32
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

Combinación ganadora: Plone como CMS, tu framework preferido como frontend

  1. 1. Combinación ganadora:  Plone y tu framework favorito    
  2. 2. Charla basada en un trabajo de Carlos de la Guardia http://us.pycon.org/2009/conference/schedule/event/85/    
  3. 3. Ustedes ?    
  4. 4. menttes    
  5. 5.    
  6. 6. Por qué ?    
  7. 7. Plone es el mejor CMS NO desarrollado en PHP
  8. 8. 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...
  9. 9. Python
  10. 10. pero...    
  11. 11.   Plone es complejo  
  12. 12. Plone puede ser lento    
  13. 13. Caching no siempre es la respuesta al tráfico    
  14. 14. 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...    
  15. 15. Frankenplone    
  16. 16. Y no deberia ser siempre asi.  Es posible trabajar con tus  herramientas favoritas.    
  17. 17.   Content Mirror  
  18. 18. 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.  
  19. 19. Simple    
  20. 20. 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    
  21. 21.     ..y podemos servir contenido Plone rápido!
  22. 22. 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.    
  23. 23.    
  24. 24. 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    
  25. 25. 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>    
  26. 26. Configurar los tipos de contenidos  propios Por cada tipo de contenido del sitio: <ore:mirror content=  "Products.ATContentTypes.content.document.ATDocument" />    
  27. 27. 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      
  28. 28. Listo.    
  29. 29. 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)    
  30. 30. 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  
  31. 31. Plyne, por menttes from pylons import config from sqlalchemy import Column, MetaData, Table, types from sqlalchemy.orm import mapper from 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    
  32. 32. Plango, por Andy McKay from django.db import models from 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)    
  33. 33. 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    
  34. 34. Y mas... ● Turbogears ● Werkzeug ● PHP ● Java     
  35. 35. 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   
  36. 36. Nosotros estudiamos la AC de Zope  para que vos no tengas que hacerlo.    
  37. 37. 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    
  38. 38. front end para GAE  import os import wsgiref.handlers from google.appengine.ext import webapp from google.appengine.ext.webapp import template from google.appengine.ext import db from google.appengine.ext.db import polymodel from 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()    
  39. 39. Plone content in GAE    
  40. 40. Todos los frontends están  disponibles en: http://contentmirror.googlecode.com/     
  41. 41. Caso de éxito Biblioteca del Congress en Chile    
  42. 42. Crear multiple sitios en una instancia    
  43. 43. Seleccionar contenido    
  44. 44. Definir layout y estilo    
  45. 45. Deploy usando repoze.bfg     
  46. 46.     Y que Plone sea parte del universo Python
  47. 47.     http://www.plonesymposium.com.br
  48. 48. Muchas gracias! Roberto Allende Sobre un trabajo de Carlos de la Guardia rallende@menttes.com http://twitter.com/robertoallende  http://robertoallende.com    

×