Generare contenuti automatici per gli utenti
medio
Plone è un sistema di gestione contenuti flessibile ed efficace, ma, come risulta chiaro da molte pagine qui su Labs, noi continuiamo ad adottarlo e a proporlo per le sue doti "nascoste".
Eccone un esempio:
In determinate situazioni 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 di cui 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.