Strumenti personali
Tu sei qui: Portale Scopri Documentazione Guide Usare paster e zopeskel per la generazione automatica di content type
Azioni sul documento

Usare paster e zopeskel per la generazione automatica di content type

Nota: questa è la vista stampabile contenente tutte le pagine della guida in una sola pagina. Se si preferisce c'è disponibile la versione suddivisa in più pagine.

ZopeSkel e Paster forniscono un sistema di comandi interattivi e template per velocizzare lo sviluppo di prodotti Plone. Vediamo come creare un content type custom per Plone3.

Introduzione

Gli strumenti che ci serviranno.

Ingredienti:

Per iniziare a sviluppare i nostri content, assicurarsi di avere a disposizione:

Python2.4 (2.4.4/2.4.5)

Easy_install (EZ_Setup)
Paster (PasteScript)
ZopeSkel

Un buildout plone3 (consigliato)

Se si dispone già di tutto il necessario è possibile saltare alla sezione Creazione di un template archetype.

Informazioni nutrizionali:

Python2.4

Le versioni di python consigliate per tutte le operazioni e python sono python 2.4.4 o python 2.4.5
Se la versione di python di sistema è diversa dalla 2.4.4/2.4.5, è possibile installare python2.4, tramite pacchetti o sorgenti, e utilizzarlo a fianco di quello di sistema, se necessario richiamandolo attraverso il path completo.

Easy install

Easy install è uno script python che permette di installare e aggiornare pacchetti python dai repository configurati,
in modo analogo all'apt-get delle distribuzioni Debian-like o al CPAN del Perl. 

Una volta installato, easy_install si occupa di cercare nei repository (come Cheeseshop/PyPy)  scaricare e installare i pacchetti desiderati nel path del python in uso,  utilizzando una sintassi del tipo easy_install nomepacchetto.

Paster

Paster è un comando che permette di creare nuovi pacchetti dotati delle caratteristiche degli egg di python. Il sistema di gestione degli egg è più sofisticato del sistema di Products tradizionale di Zope e Plone, e prevede tra l'altro una struttura annidata di namespacei, la distribuzione tramite repository, la gestione delle dipendenze.

ZopeSkel

ZopeSkel è un sistema per creare velocemente pacchetti customizzabili per Zope e Plone.
Usando paster ed i templates di  ZopeSkel è possibile creare in modo standard uno "scheletro", di un tema ad esempio o di un content type, da customizzare secondo le proprie necessità.

Sebbene i prodotti creati con ZopeSkel possano essere utilizzati, con qualche accorgimento, anche sulla serie 2.5
ed un'installazione "vecchio stile", l'utilizzo di ZopeSkel dà il meglio di sè con un'istanza Plone3 creata via buildout.

Preparazione del sistema

Installare ZopeSkel per la prima volta e preparare il buildout di sviluppo.

 

Installazione di ZopeSkel:

wget peak.telecommunity.com/dist/ez_setup.py
python2.4 ez_setup.py
easy_install-2.4 -U ZopeSkel 

I primi due comandi scaricano e installano easy_install.
L'ultimo comando installa ZopeSkel e le sue dipendenze, inclusi gli script di paster

Upgrade:

Per ottenere gli aggiornamenti di ZopeSkel:

easy_install --upgrade zopeskel

Preparazione dell'istanza:

E' consigliabile lavorare all'interno di un buildout plone3, in modo da non dover configurare manualmente le registrazioni in un secondo tempo.  Per creare un nuovo buildout;

paster create -t plone3_buildout myplone3instance
cd myplone3instance
python2.4 bootstrap.py
./bin/buildout
Lo sviluppo dei prodotti avverrà sempre nella directory src, es myplone3instance/src.

Altre soluzioni per la preparazione del sistema:

Creazione di un template archetype

Creazione del template principale

Creazione di un template archetype

Se abbiamo creato un'istanza plone tramite buildout, ci spostiamo dalla radice della nostra istanza alla directory di sviluppo /src per iniziare la creazione di un nuovo archetype.

cd myplone3instance/src
paster create -t archetype 

Si avvia un processo interattivo dove paster chiede di inserire le informazioni sul progetto.

Scegliamo anzitutto un nome composto dal namespace  (ploneit) e dal nome del prodotto (simpleproject) ed il titolo "amichevole" del progetto (Ploneit Simple Project). Ci viene poi richiesto di inserire il namespace ed il nome separatamente ed altre informazioni.

Namespace?

La struttura dei progetti creati con paster è "eggificata", cioè utilizza le convenzioni degli egg dei repository python. La presenza di un namespace in aggiunta al nome del prodotto è una delle caratteristiche dei python eggs e permette di definire un identificativo unico per i propri prodotti. In questi esempi abbiamo scelto il namespace ploneit. Per una scelta di retrocompatibilità avremmo potuto usare Products.

Attenzione alla richiesta di creazione di un prodotto zope2: il default è False, ma noi probabilmente vogliamo mettere True.

Selected and implied templates:
 ZopeSkel#basic_namespace  A project with a namespace package
 ZopeSkel#plone            A Plone project
 ZopeSkel#archetype        A Plone project that uses Archetypes

Enter project name: ploneit.simpleproject
Variables:
  egg:      ploneit.visitcard
  package:  ploneitvisitcard
  project:  ploneit.visitcard
Enter title (The title of the project) ['Plone Example']: Ploneit Simple Project
Enter namespace_package (Namespace package) ['plone']: ploneit
Enter package (The package contained namespace package) ['example']: simpleproject
Enter zope2product (Are you creating a Zope 2 Product?) [False]: True
Enter version (Version) ['0.1']: 
Enter description (One-line description of the package) ['']: A simple test project
Enter long_description (Multi-line description (in reST)) ['']: 
A simple test project featuring custom content types
Enter author (Author name) ['Plone Foundation']: Lili
Enter author_email ['plone-developers@lists.sourceforge.net']: eleonora@reflab.com
Enter keywords (Space-separated keywords/tags) ['']: 
Enter url (URL of homepage) ['http://svn.plone.org/svn/plone/plone.example']: 
Enter license_name (License name) ['GPL']: 
Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]: De

Ci ritroviamo con una directory chiamata ploneit.simpleproject che contiene lo scheletro del nostro nuovo prodotto.

ploneit.simpleproject/
|-- README.txt
|-- docs/
|-- ploneit/
|   |-- __init__.py
|   `-- simpleproject/
|       |-- __init__.py
|       |-- browser/
|       |-- config.py
|       |-- configure.zcml
|       |-- content/
|       |-- interfaces.py
|       |-- portlets/
|       |-- profiles/
|       |-- tests/
|       `-- tests.py
|-- ploneit.simpleproject.egg-info/
|-- setup.cfg
`-- setup.py

Creazione di un content type

Aggiungere content e schemata al progetto

Aggiunta di un nuovo content type

Dopo avere creato lo scheletro del nuovo progetto, ci spostiamo nella cartella appena creata:

cd myplone3instance/src/ploneit.simpleproject

Da qui possiamo richiamare ulteriori comandi (paster local commands), disponibili nel contesto del template appena creato. In questo caso ci troviamo all'interno di un template archetype e possiamo aggiungere un content type:

paster addcontent contenttype
Enter contenttype_name (Content type name ) ['Example Type']: simplecontent 
Enter contenttype_description ['Description of the Example Type']: Ploneit simple content type
Enter folderish (True/False: Content type is Folderish ) [False]: 
Enter global_allow (True/False: Globally addable ) [True]: 
Enter allow_discussion (True/False: Allow discussion ) [False]: 

Generazione degli schemata

Passiamo alla creazione dei campi personalizzati con atschema:

paster addcontent atschema

Qui possiamo definire i nomi e le descrizioni dei campi, i tipi di field e di widget, il dominio i18n e altri parametri (es: default, required).

Enter welcome (
Welcome to the handy AT Schema maker, we hope you like it! 
Crtain things are implied: i.e. Field Type should be String, 
not StringField.  We do the work for you!) ['True']: 

Enter content_class_filename (
What is the module (file)name of your content class? (.py is implied)
) ['exampletype']: simplecontent

Enter field_type (
What kind of field should I make for you?
) ['String']:    

Enter field_name (
What would you like to name this field?
) ['field']: simple_field

Enter widget_type (
What kind of widget do you want to use?
) ['String']:    

Enter field_label (
What should be the label of this field (title)?
) ['New Field']: Simple Field

Enter field_desc (
What should be the description of this field (help text)?
) ['Field description']: A simple custom string field

Enter i18n_domain (
What is the product name/i18n domain?
) ['myProduct']: simpleproduct

Enter required (
Is this field required?
) ['False']: True

Enter default (
If you'd like a default type it here, otherwise leave it blank
) ['']: 

.. che all'interno di ploneit.simpleproject/ploneit/simpleproject/content/simplecontent.py apparirà come:

    atapi.StringField(
        name='simple_field',
        widget=atapi.StringWidget(
            label="Simple Field",
            label_msgid='simplecontent_label_simple_field',
            description="A simple custom string field",
            description_msgid='simplecontent_help_simple_field",
            i18n_domain='simplecontent',
        ),
        required="True",
    ),

Ripetere per ogni field/widget da inserire.

Comandi locali di paster

Paster viene definito un comando "a due livelli", dove il secondo livello (es, paster help, paster create, etc) è pluggable e dipende dall'egg e dall'entry point  in cui ci si trova.

Nel nostro caso abbiamo a disposizione anzitutto i comandi generici di paster, poi quelli specifici del template e utilizzabili a partire da determinate posizioni all'interno del progetto (local commands).

cd myplone3instance/src/ploneit.simpleproject
paster --help

ZopeSkel local commands:
 addcontent   Adds plone content types to your project
paster addcontent -l

Available templates:
 atschema:     A handy AT schema builder
 contenttype:  A content type skeleton
 portlet:      A Plone 3 portlet
 view:         A browser view skeleton
 zcmlmeta:     A ZCML meta directive skeleton

Integrazione in un buildout

Integrazione del progetto in una istanza plone3 creata con un buildout

Portarsi nella radice del buildout e modificare il file buildout.cfg come segue:

sezione [buildout]:

 
# Reference any eggs you are developing here, one per line
# e.g.: develop = src/my.package
develop = 
  src/ploneit.simpleproject

sezione [instance]:

# If you want Zope to know about any additional eggs, list them here.
# This should include any development eggs you listed in develop-eggs above,
# e.g. eggs = ${buildout:eggs} ${plone:eggs} my.package
eggs =
    ${buildout:eggs}
    ${plone:eggs}
    ploneit.simpleproject

zcml = 
    ploneit.simpleproject

Aggiungere un riferimento analogo per ogni progetto sviluppato in src che si desidera registrare.

Far girare il buildout con la nuova configurazione

  ./bin/buildout -o (-o = offline, no product updates) 

Riavviare l'istanza

./bin/instance fg

Riassunto: pochi semplici passi

L'intero procedimento in pochi passi

 

Preparazione:

  wget peak.telecommunity.com/dist/ez_setup.py
  python2.4 ez_setup.py
  easy_install-2.4 -U ZopeSkel 

Creazione di un buildout:

paster create -t plone3_buildout myplone3instance
cd myplone3instance
python2.4 bootstrap.py
./bin/buildout

Creazione del progetto e del content:

  cd myplone3instance/src
  paster create -t archetype
  cd myplone3instance/src/ploneit.simpleproject
  paster addcontent contenttype
  paster addcontent atschema

Registrazione in buildout.cfg

develop = 
  src/ploneit.simpleproject
eggs =
    ${buildout:eggs}
    ${plone:eggs}
    ploneit.simpleproject
zcml = 
    ploneit.simpleproject

Aggiornamento del buildout

  ./bin/buildout -o 

Riferimenti

Fonti, collegamenti e tutorial originali