Creare un tema per Plone4 con buildout
Premessa
Questa e’ una libera trasposizione dell’articolo di Noe Nieto disponibile sul suo blog a questo indirizzo: http://www.noenieto.com/blog/theming-plone-4
Mi sono permesso comunque di aggiungere qualche dettaglio.
Introduzione
L’audience è chiunque abbia già avuto a che fare con buildout, Plone, temi per Plone e tutte le tecnologie di circostanza come javascript, html, css, ecc.
Impostare l’ambiente iniziale
Chi abbia una Ubuntu puo’ sfruttare aptitude e installare i pacchetti del caso.
$ sudo aptitude install build-essential python-dev python-pip python-pastescript python-setuptools $ sudo pip install zopeskel
Per altre distro puo’ essere necessario scaricare il file ez_setup.py e dare:
$ sudo python ez_setup.py $ sudo easy_install ZopeSkel
Così come scaricare ed installare PIL (Python Imaging Library)
Personalmente PIL l’ho sempre installato scaricando il tar.gz, scompattandolo e dando il python setup.py build e poi install quando nella tabellina mostrata a fine compilazione ho gli OK che mi servono.
Creare il buildout
Creiamo il buildout dove lavorare:
$ paster create -t plone3_buildout Selected and implied templates: ZopeSkel#plone3_buildout A buildout for Plone 3 installation Enter project name: plone4b3 Variables: egg: plone4b3 package: plone4b3 project: plone4b3 ************************************************************************** ** *** NOTE: You probably don't want to use this template! ** Since Plone 3.1, the preferred way to get a buildout-based setup ** for Plone is to use the standard installer for your operating ** system (the Windows installer, the Mac installer, or the Unified ** Installer for Linux/Unix/BSD). These give you a best-practice, ** widely-used setup with an isolated Python and a well-documented ** buildout. This template is here for older versions of Plone and ** for experts who explicitly want a raw, non-installer-based ** installation. ** (This message is particularly aimed at people following out-of- ** date books/documentation that suggest this is the right way to get ** a Plone-based buildout. This is no longer the case.) ************************************************************************** Expert Mode? (What question mode would you like? (easy/expert/all)?) ['easy']: easy Plone Version (Plone version # to install) ['3.3.4']: 4.0b3 Zope2 Install Path (Path to Zope2 installation; leave blank to fetch one!) ['']: Plone Products Directory (Path to Plone products; leave blank to fetch [Plone 3.0/3.1 only]) ['']: Initial Zope Username (Username for Zope root admin user) ['admin']: Initial User Password (Password for Zope root admin user) ['']: secret HTTP Port (Port that Zope will use for serving HTTP) ['8080']: Debug Mode (Should debug mode be "on" or "off"?) ['off']: Verbose Security? (Should verbose security be "on" or "off"?) ['off']: Creating template plone3_buildout Creating directory ./plone4b3 Copying README.txt to ./plone4b3/README.txt Copying bootstrap.py to ./plone4b3/bootstrap.py Copying buildout.cfg_tmpl to ./plone4b3/buildout.cfg Recursing into products Creating ./plone4b3/products/ Copying README.txt to ./plone4b3/products/README.txt Recursing into src Creating ./plone4b3/src/ Copying README.txt to ./plone4b3/src/README.txt Recursing into var Creating ./plone4b3/var/ Copying README.txt to ./plone4b3/var/README.txt ************************************************************************** ** Generation finished. ** You probably want to run python bootstrap.py and then edit ** buildout.cfg before running bin/buildout -v". ** See README.txt for details. **************************************************************************
In ultimo lanciamo il bootstrap e buildout per scaricare il nostro Plone
tzicatl@tzicatl-lynx:~/plone4b3$ python bootstrap.py Creating directory '/home/tzicatl/plone4b3/bin'. Creating directory '/home/tzicatl/plone4b3/parts'. Creating directory '/home/tzicatl/plone4b3/eggs'. Creating directory '/home/tzicatl/plone4b3/develop-eggs'. Generated script '/home/tzicatl/plone4b3/bin/buildout'. tzicatl@tzicatl-lynx:~/plone4b3$ bin/buildout ..... $
Creare il prodotto Tema ed aggiungerlo al nostro buildout
Creiamo il Tema. Baseremo il nostro progetto tema su questo template di FreeCSSTemplates.org:
$ cd plone4b3/src $ paster create -t plone3_theme Selected and implied templates: ZopeSkel#basic_namespace A basic Python project with a namespace package ZopeSkel#plone A project for Plone products ZopeSkel#plone3_theme A theme for Plone 3 Enter project name: plonetheme.hanging Variables: egg: plonetheme.hanging package: plonethemehanging project: plonetheme.hanging Expert Mode? (What question mode would you like? (easy/expert/all)?) ['easy']: easy Skin Name (Name of the theme (human facing, added to portal_skins)) ['']: FreeCSSTemplates.org Hanging Empty Styles? (Override default public stylesheets with empty ones?) [False]: Include Documentation? (Include in-line documentation in generated code?) [True]: False Version (Version number for project) ['1.0']: Description (One-line description of the project) ['An installable theme for Plone 3']: An Installable theme for Plone 4 Creating template basic_namespace Creating directory ./plonetheme.hanging ....
Ora dobbiamo apportare modifiche al buildout.cfg per poter rendere disponibile il nostro tema come prodotto. Faremo anche qualche modifica extra come segue:
- rimuovere tutti i commenti
- Spostare tutte le dichiarazioni eggs e zcml dalla sezione [instance] alla sezione [buildout][buildout] section
- Aggiungere PIL e plonetheme.hanging alla sezione eggs (chi ha installato PIL manualmente in python non deve aggiungerlo anche qui)
- aggiungere la direttiva ZCML per l’inclusione di plonetheme.hanging in zope
Qualche settaggio di fino…
Prima di lanciare il buildout correggiamo il tiro di qualche punto di codice:
[Per i settaggi al setup.py ci sono considerazioni personali dell'autore e vi rimando all'articolo originale]
- Editare src/plonetheme.hanging/plonetheme/hanging/configure.zcml e commentiamo la linea
- <i18n:registerTranslations directory=”locales” />
- Questo perche’ in questo momento non vogliamo localizzare il nostro prodotto
- Non piacendo i nomi lunghi che genera buildout quando crea le directory nella directory skin, gli diamo un taglio:
- Rinominare quindi le directory, ad esempio: da plonetheme_hanging_custom_images a hangingtheme_images.
- cambiare la riga corrispondente alla registrazione in in skins.zcml e profiles/default/skins.xml (lavorando da src/plonetheme.hanging/plonetheme/hanging).
- Nota 1: Puoi facilmente utilizzare la funzionalita’ Cerca e Sostituisci tra file del tuo Editor
- Note 2: Puoi aggiungere un ulteriore skin layer aggiungendo la relativa directory ed editando opportunamente i file di cui sopra
- Cambiare il tema base da “Plone Default” a “Sunburst Theme” editando profiles/default/skins.xml.
- Apri il file e cerca la seguente riga “<skin-path name=”FreeCSSTemplates.org Hanging” based-on=”Plone Default”>”
- Sostituisci l’attributo based-on da “Plone Default” a “Sunburst Theme”
- Questo step è fondamentale per poter cambiare l’attuale stile di plone4 alle nostre esigenze.
Siamo pronti per lanciare il bootstrap.py (se non l’hai ancora fatto)
$ python bootstrap.py
Quindi lanciare il buildout. Questa operazione potrebbe prendere del tempo a seconda della velocita’ del pc e della banda a disposizione
$bin/buildout
magari
$ bin buildout -vv
Potrebbero visualizzarsi svariati warnings, ma nessun errore significativo.
Avviare l’istanza plone
Se il processo buildout si e’ completato con successo, sarai ing rado di far partire la tua istanza plone, meglio ora in modalita’ foreground:
tzicatl@tzicatl-lynx:~/plone4b3$ bin/instance fg 2010-05-19 18:02:43 INFO ZServer HTTP server started at Wed May 19 18:02:43 2010 Hostname: 0.0.0.0 Port: 8080 2010-05-19 18:02:53 WARNING ZODB.FileStorage Ignoring index for /home/tzicatl/plone4b3/var/filestorage/Data.fs 2010-05-19 18:02:53 WARNING ZODB.blob (10127) Blob dir /home/tzicatl/plone4b3/var/blobstorage/ has insecure mode setting 2010-05-19 18:03:12 INFO Zope Ready to handle requests
Crea il sito ed installa il tema appena creato. Dovresti vedere qualcosa pari al tema base di Plone4 “SunBurst Theme”

Concludendo
Abbiamo imparato (almeno si spera) a preparare un ambiente buildout pronto per Zope, a creare un’istanza plone4 “from scratch” (cioe’ senza nulla di pre-compilato per noi), e ancora a creare e mettere a disposizione di plone un “prodotto tema” che ci accingeremo a completare.
Questo e’ tutto per ora… aspettiamo la seconda parte.
Variabili d’ambiente nel buildout
Me lo scrivo qua in maniera tale da non dover googolare ogni volta.
Hai bisogno di settare variabili d’ambiente prima di far partire una tua istanza, e vuoi che buildout faccia questo per te senza dover fare un export ogni volta?
Aggiungi il (o al) parametro “zope-conf-additional” alla sezione [instance] il codice che segue:
[instance]
...
zope-conf-additional=
<environment>
VARIABILE VALORE
</environment>
ad esempio
zope-conf-additional=
<environment>
FOP_HOME /usr/local/fop-0.94
</environment>
Divertiti.
Psycopg2, Plone e buildout (su Mac)
Scrivo questo breve post per ricordami come ho fatto a installare la versione 2.0.11 di Psycopg2 utile a collegare Plone con banche dati in Postgres, e come monito ai posteri
Tutto nasce da un odioso errore che ho ottenuto al momento di creare un collegamento in ZMI al mio Postgres:
ImportError: psycopg version mismatch (imported 2.0.11 (dt dec ext pq3))
Premetto subito: è un lavoro sporco (con la versione di psycopg2 2.0.11) da fare sulla piattaforma MacOS Leopard con a bordo il python 2.4.
Gli steps riguardano fondamentalmente: l’installazione di Postgres, configurazione e installazione del modulo per python e fixaggio del database adapter da porre nel buildout.
In teoria esistono degli eggs che fanno tutto ciò. Io gli ho provati a volo e non funzionavano affatto (per me) :’( Leggi il seguito di questo post »
I templates e Plone 4
Questo articolo nasce da una rielaborazione del post di Denys Mishunov.
Plone 4 sarà una piccola rivoluzione per la comunità plonistica poichè porta con se diverse migliorie e rielaborazioni significative del codice portante, e quindi dovremo rivedere un po’ la maniera di scrivere templates acquisita in questi anni di esperienza con la versione 2.5 e 3 del nostro CMS preferito.
C’è subito da specificare che il main_template.pt , ovvero il template dei template, ha subito rivisitazioni e quindi se nelle istanze di plone che vogliamo migrare tale file è stato modificato (spero che l’abbiate fatto perchè era l’ultima spiaggia…) allora dovremo stare molto attenti.
Stabilizzare le versioni di ogni pacchetto in un buildout.
La sezione [versions]
... extends = http://dist.plone.org/release/3.3.4/versions.cfg versions = versions ...
Queste due righe fanno si ‘ che vengano bloccati tutti i pacchetti elencati in versions.cfg alla relativa versione indicata a fianco di ciascun pacchetto.
In altre parole, un “$buildout -n” non aggiornera’ questi pacchetti anche se ne e’ stata rilasciata una versione piu’ recente.
Presumibilmente avrete aggiunto altri pacchetti al vostro buildout popolando la sezione eggs con una riga del tipo:
eggs =
...
plone.app.ldap
...
Per “pinnare” la versione del pacchetto ed evitare che venga aggiornata automaticamente dovete aggiugere al vostro buildout.cfg una sezione [versions] in cui eguagliate (o diseguagliate) un prodotto con il numero di versione desiderato. Ad esempio:
[versions] plone.app.ldap = 1.1 python-ldap = 2.2.0
N.B.: La sezione va aggiunta dopo quella [buildout] subito prima dell’inizio della sezione successiva.
Come sapere quali pacchetti non son pinnati?
Date le decine di prodotti e pacchetti che include un buildout standard puo’ essere molto facile lasciarne qualcuno unpinned.
Wichert Akkerman ha gentilmente pensato una riga di codice shell che ci viene in aiuto (linux):
$ bin/buildout -Novvvvv |sed -ne 's/^Picked: //p' | sort | uniq
Da qualche versione di plone ad oggi non si riesce piu’ a lancire il comando buildout con l’opzione -o (offline). Quindi tale comando andrebbe rivisto senza la ‘o’ e pare funzionare comunque correttamente.
$ bin/buildout -Nvvvvv |sed -ne 's/^Picked: //p' | sort | uniq
Tale comando restituisce qualcosa del tipo:
elementtree = 1.2.7-20070827-preview plone.recipe.distros = 1.3 plone.recipe.zope2install = 1.2 plone.recipe.zope2instance = 1.3 python-openid = 2.0.1 setuptools = 0.6c7 zc.recipe.egg = 1.0.0
E’ sufficiente copiare ed incollare questo output nella sezione [versions] creata in precedenza.
fonte: http://maurits.vanrees.org/weblog/archive/2008/01/easily-creating-repeatable-buildoutsAggiungere un criterio ad una collezione per un proprio oggetto
Uno dei primi utilizzi che si vuol fare del nuovo prodottino fiammante creato con Archetypes è renderlo, in alcuni dei suoi campi, ricercabile tramite una “collezione” (o “smart folder” o “ex-cercatore”, qui si sprecano gli alias
).
Per esempio: abbiamo creato un nuovo oggetto chiamato “libro” che possiede i seguenti (pochi) campi:
- Titolo (previsto di default da plone)
- Descrizione (previsto di default da plone)
- Recensione (tipo testo)
- Anno di pubblicazione (tipo integer)
- Casa editrice (String con accesso da un vocabulary di case editrici)
Vogliamo creare due nuove “collezioni” che indicizzino e mostrino a video i nostri libri, uno ordinato per data di pubblicazione e l’altro solo con la casa editrice nostra preferita (o che forse paga di più ^____^). Andiamo nel menu a tendina selezioniamo “Collezione”, gli diamo un nome e andiamo spediti nei “criteri” … amara sopresa! Non vediamo i nostri due campi. Niente paura, bisogna solo istruire a dovere il catalog.
Plone Conference 2010: Bristol… arriviamo!
La Plone Foundation ha annuciato la sede della prossima Plone Conference: Bristol!
Incomincio a cercare le offerte per i voli …
http://plone.org/events/conferences/bristol-2010/plone-conference-2010-bristol-uk
Vito
Plone 3 buildout su SnowLeopard (a 32bit)
E alla fine luce fu
Sono riuscito a creare l’ambiente buildout sul mio MacBook (Intel Core Duo) a 32bit con il nuovo e fiammante SnowLeopard.
Vi anticipo che l’operazione è abbastanza “sporca”, ma quando il gioco si fa duro…
Per partire avete bisogno di avere a bordo l’ultima XCode disponibile.
Gli steps da seguire sono:
- installare MacPorts
- installare Python 2.4.6 via MacPorts
- installare PIL in Python 2.4.6
- patchare asyncore
- installare easy_install e virtualenv
- creare il buildout
LinguaPlone3 rilasciato
Jarn ha appena rilasciato LinguaPlone3 l’add-on di Plone che permette di gestire comodamente contenuti in piu’ lingue.
Ricordo che non e’ un prodotto che traduce per voi Documenti e News, bensi’ fornisce gli strumenti per poter gestire efficacemente le n-traduzioni di ciascun contenuto di portale.
Oltre all’aumento generale di prestazioni questa nuova versione, compatibile solo con Plone3.3 e superiori:
- collega le “referenze” al documento nella lingua attesa qualora questo esista. Caso in cui scrivete in italiano, collegate una pagina con un link o un reference field e poi traducete il documento in inglese. LinguaPlone3 in questo caso cerca il documento destinazione tradotto in inglese preservando la coerenza della lingua (COOL!)
- attraverso il plone.app.blob se traducete un oggetto che ha un campo “language indipentent” e che contiene un file, quest’ultimo non verra’ duplicato, mantenendo la stessa sorgente binaria come blob su fs (doppio cool!)
Un ringraziamento ai ragazzi di Jarn
Tutti a tradurre!!