Personal tools
You are here: Home Documentazione Ricette Generare contenuti automatici per gli utenti
Document Actions

Generare contenuti automatici per gli utenti

come generare contenuti per gli utenti in modo elegante ed efficace, senza modificare gli script di Plone e CMF.

Plone è un sistema di gestione contenuti flessibile ed efficace, ma, come risulta chiaro da molte pagine qui su Labs, noi lo continuiamo ad adottare e proporre per le sue doti "nascoste".

Eccone un esempio..

In determinate situazione si presenta l'esigenza di creare contenuti in automatico per gli utenti del portale: immaginiamo di voler generare un'area in cui utenti che soddisfano specifici criteri possano disporre di un proprio spazio personale.

Come fare? L'idea consiste nell'agganciare l'evento standard di login utente per lanciare un nostro script che, dopo aver effettuato i controlli necessari, generi in un'apposita area la cartella per lo specifico utente e gli assegni i ruoli desiderati. Questo ci consente di operare in modo da non intralciare le normali attività svolte da Plone al login dell'utente e senza dover modificare gli script di default.

Per farlo avremo bisogno di costruire un nostro prodotto, ad esempio usando paster.

Script per la generazione dell'area utente

NB: L'ambiente di riferimento è quello standard di Plone versione 3.1

Dopo aver generato nel pacchetto del prodotto un modulo events.py, potremo definire il nostro script:

from zope import component
from AccessControl import SecurityManagement
from AccessControl import SpecialUsers

def _manage_areaexchange_creation(event):
    # dato che lo script non ha un contesto, usiamo il site manager Z3 
    # per ottenere l'oggetto portale
    portal = component.getSiteManager().aq_parent
    
    # la cartella my_area deve essere generata dal manager del portale
    myareas_folder = portal.get('my-area')
    if not myareas_folder:
        return
    
    # l'area viene generata solo per utenti del gruppo 'my_area_people'
    membergroup_ids = event.principal.getGroupIds()
    if 'my_area_people' not in membergroup_ids:
        return
    
    member_id = event.principal.getId()
    if not myareas_folder.get(member_id):
        obj_id = myareas_folder.invokeFactory('Folder', id=member_id)
        myarea = myareas_folder.get(obj_id)
        myarea.edit(title=event.principal.getName())
        
        # l'utente deve avere ruoli 'Viewer' e 'Contributor'
        myarea.manage_setLocalRoles(member_id, ['Reader','Contributor'])


def createPersonalAreaExchange(event):
    """ogni utente nel gruppo "my_area_people" dispone di un'area in
    cui generare i suoi contenuti.
    """
    
    # il cambio di contesto permette ad utenti senza privilegi
    # di operare in modalità super-utente
    sm = SecurityManagement.getSecurityManager()
    SecurityManagement.newSecurityManager(None,
                                          SpecialUsers.system)        
    try:
        _manage_areaexchange_creation(event)
    except:
        pass
    
    SecurityManagement.setSecurityManager(sm)

Nel caso in cui un utente appartenga al gruppo 'my_area_people', lo script genera nell'area 'my-area' una cartella con id coincidente con quello dell'utente e gli assegna i ruoli necessari.

Poichè lo script non dispone di un contesto su cui operare, per poter agganciare il portale usiamo il site manager Zope 3 del sito Plone.

In sincrono con l'evento lanceremo lo script createPersonalAreaExchange in cui cambiamo il contesto di sicurezza predefinito in modo da permettere all'utente loggato di operare da super-utente. In caso contrario Zope non permetterebbe la creazione dell'area a chi non dispone dei necessari privilegi.

Agganciamo lo script ad un evento

Ora che abbiamo la nostra logica, dobbiamo fare in modo che venga eseguita nel momento 'giusto'. Quello scelto nel nostro caso è l'istante in cui l'utente effettua il login. Per poter agganciare lo script all'evento è sufficiente che esista un tale evento in Zope, e che noi sappiamo come viene 'chiamato' da Zope, in modo da poterlo specificare nel file configure.zcml del pacchetto:

<configure
  xmlns="http://namespaces.zope.org/zope"
  xmlns:five="http://namespaces.zope.org/five">

  <five:registerPackage package="." initialize=".initialize" />

  <subscriber for="Products.PluggableAuthService.interfaces.events.IUserLoggedInEvent"
               handler=".events.createPersonalAreaExchange" />

</configure>

Fatto ciò, non resta che creare la cartella di primo livello con id my-area, associare un utente al gruppo 'my_area_people' e verificare che al suo login lo script entra in azione.

by Maurizio Delmonte last modified 2008-10-02 09:56

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: