Bookmark and Share
Document Actions

Costruire Facilmente un Prodotto per Plone

Up one level
Vedremo come iniziare a creare un semplice prodotto per Plone.

Nelle precedenti sezioni abbiamo promesso di iniziare a creare un proprio prodotto Plone, e cosi faremo!

Come abbiamo sottolineato il nostro prodotto vivrà sul sistema operativo, cosi lascerà aperto un terminale e sistemerà il nostro sviluppo ambientale ad ospitare il nostro codice. Tutti questi esempi sono in Linux, cosi noi assumeremo alcune familiarità basi con le operazioni del sistema operativo in Linux.

Come abbiamo esaminato nel capitolo 2, utilizziamo comandi Paster per costruire e configurare il nostro sistema. Paster è una potente libreria Python che proviene dal progetto Python Paste di Ian Bicking (http://Pythonpaste.org). Questo ci lascia definire modelli e poi riutilizzarli al fine di costruire i nostri prodotti.

Prima di iniziare il duro lavoro, avremo bisogno di qualche conoscenza in più: come lasciare che Zope riconosca in modo sicuro il nostro prodotto. Zope 2 stabilisce che i prodotti sono posizionati nella cartella Prodotti, senza controllare quali pacchetti mettiate o quali dependencies abbiano i pacchetti. Lanciare solamente il server Zope dopo averci messo un pacchetto, e guardate cosa accade.

Fortunatamente, ora Python ha un meccanismo efficace per costruire e distribuire i pacchetti Python, stando attento alle versioni e anche alle dependencies, grazie ai distutils e ai setuptools di Peak. Versioni, autori, dependencies, e tutto ciò che è utile a classificare un pacchetto sono contenuti nel pacchetto stesso in una struttura conosciuta come Python egg. Setuptools fornisce uno script shell chiamato EasyInstall, che è in grado di trovare un egg nei depositi egg del web ed eseguire il download e installarlo sul vostro computer con tutte le dependencies necessarie.

 

 

NOTA Python.org offre il più popolare dei depositi online di pacchetti, PyPI (Python Package Index). Potete sfogliare l’indice online all’indirizzo http://pypi.Python.org/pypi , cercandolo tra i testi liberi o sfogliando l’indirizzo http://pypi.Python.org/pypi?action=browse. Con PyPI, gli sviluppatori possono presentare i loro pacchetti automaticamente al deposito azionando un semplice comando nel terminale; PyPI si assicurerà di nascondere tutte le versioni precedenti e di dare la giusta visibilità a quella nuova. Al momento, sempre più pacchetti di Zope e Plone sono pubblicati su PyPI, questo perché la sezione Prodotti di Plone.org è stata recentemente inserita in PyPI in automatico, quindi gli sviluppatori possono aggiornare un singolo sito e mantenerne un altro da aggiornare.

 

 

Zope 2 non è consapevole di Python eggs. Questo perché, per approfittare di tutto ciò, Zope e Plone utilizzano una tecnologia buildout per definire e costruire una dimostrazione di lavoro Zope. Di conseguenza, abbiamo bisogno di fornire un Python egg che avvolga il nostro prodotto, e Paster ci aiuta a scrivere il codice per l’egg fornendo dei codici boilerplate. Tutti i modelli di cui abbiamo bisogno sono forniti da ZopeSkel, una collezione di skeletons per aprire velocemente i progetti Zope.

 

 

NOTA A questo punto, abbiamo bisogno di esporre alcune ipotesi a proposito del vostro sviluppo ambientale: tutti gli esempi in questo capitolo sono stati sviluppati su una macchina UNIX, usando Python 2.4.4, la versione raccomandata per Plone 3 (vedete http://Plone.org/documentation/faq/Plone-versions). Per favore usate questa versione di Python per i prossimi esercizi.

Inoltre, Plone fa uso di Python Imaging Library (PIL—www.Pythonware.com/products/pil) per gestire i file immagine. Nel momento in cui scriviamo, PIL non è disponibile come egg per l’installazione automatica, quindi avrete bisogno di installarlo manualmente sul vostro computer, usando la stessa versione di Python che userete per Plone.

Per ogni problema specifico in cui potreste imbattervi, date un’occhiata alla sezione “Installazione” su Plone.org (http://Plone.org/documentation/phc_topic_area?topic=Installation).

 

 

 

Quindi, cominciamo. Eseguite il download ez_setup.py e lanciatelo:

 

$ wget peak.telecommunity.com/dist/ez_setup.py

$ Python ez_setup.py

 

Utilizzando easy_install, si installa Zopeskel e tutte le sue dependencies:

 

$ easy_install-UZopeSkel

 

Quando avete terminato, dovreste aver acquisito nuovi comandi disponibili nella vostra struttura:

paster. Potete verificarlo con i seguenti comandi:

 

$ pastercreate--list-templates

 

Dovrebbe apparire un elenco con tutti i modelli consentiti:

(e.s., Plone3_portlet, che potete utilizzare per creare un nuovo prodotto portlet, e archetype che crea un progetto generico Plone).

 

Se non avete ancora visualizzato una dimostrazione operativa per creare il vostro prodotto, dovete solo eseguire le seguenti linee in un terminale:

 

$ cd~

$ pastercreate -t Plone3_Buildout Plonebook

 

E rispondere a tutte le domande che lo script vi chiederà con i loro valori di default. In seguito inserite:

 

$ cd Plonebook

$ Python bootstrap.py

 

Vedrete le vostre nuove dimostrazioni buildout quasi pronte per essere eseguite. Siate sicuri di avere la connessione internet attiva e eseguite i seguenti codici:

 

$ ./bin/buildout -v

 

Alla fine di questo processo, dovreste avere una nuova dimostrazione Zope pronta per l’esecuzione correttamente configurata con l’ultimo pacchetto Plone.

Presumiamo che stiate utilizzando un buildout Plone nominato plonebook posizionata nella directory della vostra homepage per eseguirci il nuovo pacchetto. Andate nella cartella src e create un nuovo progetto Archetype:

 

$ cd ~/Plonebook/src

$ paster create –t archetype Plonebook.regional_news

 

Rispondete alle domande per creare un pacchetto regional_news nello spazio dei nomi del plonebook.

­

Ora Date un’occhiata a cosa contiene la vostra cartella src - dovreste trovare una cartella plonebook.regional_news. Esplorate cosa contiene.

Il modello Paster ci ha preparato un nuovo tipo di funzionalità nascosta, per riempirlo con un file README.txt e un file setup.py per modificarlo eventualmente.

Il codice attuale di estensione è situato nella cartella plonebook/regional_news la quale contiene i seguenti file e cartelle:

 

· __init__.py: questo file rende la cartella un pacchetto Python e contiene le funzioni di formattazione, è lanciato da Zope all’avvio per registrare il prodotto nella framework.

· browser: questa cartella contiene le visualizzazioni del browser Zope 3 definite dal prodotto.

· config.py: questo file contiene la comune configurazione fedele al prodotto.

· configure.zcml: questo file contiene configurazioni Zope per questo prodotto.

· content: questa cartella contiene moduli Python che definiscono i tipi di contenuto.

· •฀ interfaces.py: Questo file contiene l’interfaccia di Zope 3 per questo prodotto.

· ฀ •฀ portlets: Questa cartella contiene portlets definiti in questo prodotto.

· ฀ •฀ profiles: Questa cartella contiene GenericSetup profiles (guardate la sezione del capitolo “Configurazione di Plone”).

· ฀ •฀ README.txt: Questo è un file di testo in cui potete aggiungere informazioni generiche a proposito del prodotto.

· ฀ •฀ tests: Questa cartella contiene moduli di test per il prodotto.

· ฀ •฀ tests.py: Questo file contiene un’infrastruttura di test di base per il prodotto.

 

Come vedete, questo pacchetto non ha nessuna funzione. In più, Zope ancora non lo riconosce, perché non è un normale pacchetto Python nella cartella Zope Products, ma un egg generico di Python nella cartella buildout src. Lasciamo parlare il buildout a proposito di ciò, aggiungendo queste linee al file buildout.cfg:

 

[buildout]

...

eggs=

...

Plonebook.regional_news

develop=

src/Plonebook.regional_news

...

[instance]

...

zcml=

Plonebook.regional_news

 

L’ultima riga comunica a Zope che vogliamo che il pacchetto sia caricato all’avvio, e che abbiamo bisogno di esso a meno che altri pacchetti lo includano.

Come al solito, dopo questa modifica, eseguite lo script buildout:

 

$ cd~/Plonebook

$ ./bin/buildout-v

 

Se tutto procede per il meglio, dovremmo avviare la nostra dimostrazione di Zope e trovare plonebook.regional_news nella sezione Prodotti del pannello di controllo di Zope. Controllatelo avviando il servizio:

 

$ ./bin/instancefg

 

e poi inserite l’indirizzo http://localhost:8080/Control_Panel/Products/manage.

Ovviamente, installando il prodotto nella dimostrazione di Plone in questo momento non sarà prodotta alcuna estensione al Plone stesso. Abbiamo solamente un boilerplate molto avanzato!

 

 

Date un’occhiata a quanto ci sia ancora utile Paster: grazie al suo concetto di comandi locali, aggiungiamo al pacchetto uno schema per creare tipi di contenuto. Avviate le seguenti linee nel vostro terminale:

$ cd~ /Plonebook/src/Plonebook.regional_news

$ paster addcontent -1

 

Ciò genererà una lista di ulteriori modelli disponibili che sono utili in questo contesto di progetto. Li utilizzeremo presto per creare il nostro primo contenuto tipo, Notizie Regionali, e il suo piano basato sulle notizie Plone. Eseguite le seguenti linee nel vostro terminale:

 

$ paster addcontent contenttype

 

Poi rispondete alle domande che lo script vi chiederà, usando RegionalNews come il nome del contenuto tipo e i default per tutto il resto. Alla fine di questo processo, dovreste notare alcuni aggiornamenti nel vostro pacchetto regional_news: config.py ha un nuovo permesso aggiunto specifico, interface.py elenca un’interfaccia IRegionalNews e più interessante, la cartella content ha un nuovo modulo Python, regionalnews.py riempito con tutto ciò che è richiesto per registrare i nostri nuovi contenuti tipo in Plone.

Qui c’è una parte interessante di regionalnews.py:

RegionalNewsSchema = schemata.ATContentTypeSchema.copy() + atapi.Schema((

#-*-Your Archetypes field definitions here...-*-

))

...

schemata.finalizeATCTSchema(RegionalNewsSchema, moveDiscussion=False)

 

class RegionalNews(base.ATCTContent):

" " " Description of the Example Type" " "

Implements (IRegionalNews)

 

portal_type= "RegionalNews"

schema = RegionalNewsSchema

...

atapi.registerType (RegionalNews, PROJECTNAME)

Nota che la classe RegionalNews eredita dalla classe ATContentTypes ATCTContent.

Si sostiene che essa implementa l’interfaccia IRegionalNews, e il suo schema è basato su ATContentTypeSchema. Infine la classe è registrata su un contenuto tipo Archetypes come il framework Archetypes necessita.

 

Ora prova ad utilizzare il nostro prodotto. Avvia il servizio Zope nel terminale.

 

$ cd ~/Plonebook/

$ ./bin/instance fg

 

 

Ora il servizio Zope rimarrà attaccato al processo terminale, e, dopo una lunga serie di linee di registrazione, potreste vedere un piacevole messaggio “Zope pronto a gestire richieste”. Non chiudete questa finestra; aprite un browser, indicando http://localhost:8080/manage.

Dopo aver eseguito l’accesso, dovrebbe apparire uno ZMI. Create un nuovo sito Plone, selezionando il giusto elemento “Sito Plone” nel campo di selezione Add. Date un nome al sito plone, cliccate il pulsante di conferma per aggiungerlo, e aspettate solo pochi secondi. Alla fine di questo processo, dovreste trovare un nuovo oggetto, chiamato plone, nella lista del root ZMI. Inserite l’indirizzo http://localhost:8080/Plone e dovreste vedere la pagina di benvenuto di Plone.

Non appena entrate in Plone con il vostro utente admin, cliccate il link di Configurazione del Sito nella parte alta della pagina, e poi andate sul pannello Prodotti Aggiuntivi. Selezionate l’elemento Notizie Regionali 1.0 e cliccate il pulsante Installa. Dopo, cliccate sul logo Plone per ritornare alla pagina di benvenuto, e selezionate il vostro tipo di contenuto Notizie Regionali dal menù “Aggiungi un nuovo elemento” sulla barra verde. Il nostro tipo di contenuto è il più semplice possibile, senza alcun attributo particolare, ma nonostante ciò in Plone questo esiste e ha tutti i metadati standard, indicizza le caratteristiche, il piano workflow di default, e così via (vedete Figura 9-1).

 

 

 

 

Figura 9-1. Il nostro semplice oggetto Notizie Regionali

 

Esaminando quello che abbiamo fatto, abbiamo effettivamente lanciato una coppia di comandi Paster — pastercreate –t archetype Plonebook.regional_news e paster addcontent contenttype — e questo è tutto!

 

 

NOTA Il framework Archetypes ha rappresentato un grande passo in avanti semplificando i modelli di sviluppo Plone. Ma non è stato accompagnato con modelli Paster. Paster è assolutamente più giovane rispetto a Archetypes. Gli sviluppatori di Archetypes dovettero far partire il loro progetto a mano e inserire correttamente alcuni dettagli richiesti nelle registrazioni Archetypes prima di diventare operativi.

Philipp Auersperg e Jens Klein erano due sviluppatori che non erano contenti con tutti i precedenti copia e incolla. Inoltre loro erano grandi fans UML e sognavano uno strumento in grado di tradurre i diagrammi UML class in progetto Archetypes. Svilupparono un nuovo progetto open source: un nuovo codice generatore chiamato ArchGenXML (http://Plone.org/products/archgenxml), il quale ottenne un ampio successo e fu largamente usato per lo sviluppo di progetti Plone. Ciò è dovuto dalla flessibilità e dalla facilità dell’utilizzo, e perché lasciava mantenere allo sviluppatore un modo standard di costruire prodotti.

Mentre ArchGenXML è uno strumento potente e attendibile, una descrizione dettagliata è al di fuori dello scopo di questo libro. Se voi siete interessati ad utilizzarlo, ha un ottimo manuale di sviluppo su http://Plone.org/documentation/manual/archgenxml2 , a alcuni buoni tutorials su http://Plone.org/products/archgenxml/documentation.

 

 

Nella prossima sezione approfondiremo Archetypes e cosa dovreste sapere sul suo framework per essere in grado di personalizzare il contenuto tipo Notizie Regionali.

 

 

by Dario Pollino last modified 2011-06-21 20:03
Contributors: Maurizio Delmonte, Davide Moro, Alice Narduzzo, Fabrizio Reale, Enrico Barra, Andrea Cannizzaro, Andrea D'Este, Maurizio Lupo, Giuseppe Masili, Dario Pollino, Matteo Sorba.