Personal tools
Estendere l'invio mail dalle regole di contenuto Plone

Una content rule per dominarle tutte!

Jul 16, 2013

Estendere l'invio mail dalle regole di contenuto Plone

Con le regole di contenuto di Plone possiamo inviare e-mail, ma con poche righe di Python è possibile estendere questa funzionalità con sostituzioni aggiuntive!

Le regole di contenuto di Plone sono uno strumento molto potente e amato del CMS. In passato erano penalizzate da un'interfaccia non troppo intuitiva ma, finalmente, ci sono stati grossi passi avanti relativamente all'usabilità in Plone 4.3.

La logica è semplice: l'amministratore del sito definisce le condizioni e le azioni da intraprendere selezionandole da un insieme di scelte (entrambi gli insiemi facilmente estendibili tramite prodotti aggiuntivi).
Le regole vengono poi attivate in tutto il sito, oppure solo in esplicite sotto-sezioni di questo.

Una delle azioni di base più utilizzate è l'invio di e-mail: è estremamente comune voler segnalare con un messaggio che qualcosa è successo nel sito, e Plone permette di farlo senza problemi e con un testo personalizzato.

Ed è proprio la personalizzazione del messaggio della mail l'argomento di questo articolo.

Personalizzazione delle variabili del testo

Che cosa si può inserire nel testo del messaggio? Ovviamente il testo conterrà una parte statica, magari un'introduzione all'evento che ha scatenato l'invio, ma è molto comune la necessità di avere variabili dinamiche.

Un esempio che spiega in modo chiaro questa necessità: nel vostro sito viene configurata una regola per notificare la creazione di un nuovo contenuto nel sito. Credete possa bastare un messaggio del genere?

Un nuovo contenuto è stato inserito nel sito.

Se ci limitassimo a questo sembrerebbe quasi un insulto (in pratica c'è una conclusione non scritta che dice: "...e vattelo a cercare!").
Per fortuna Plone è più educato e può generare messaggi così composti:

Il nuovo contenuto "Benvenuto in Plone" è stato creato dall'utente Mario Rossi.

Puoi visitare il contenuto a questo collegamento:
http://tuosito.com/front-page

...e per ottenere questo, l'azione di invio mail sarà così definita

Il nuovo contenuto "${title}" è stato creato dall'utente ${user_fullname}.

Puoi visitare il contenuto a questo collegamento:
${url}

Tabella delle sostituzione e-mail delle regole PloneFacile, no? Il tutto viene riassunto in una comoda tabella che mostra tutte le variabili utilizzabili in una regola di invio mail.

La cosa davvero ben fatta di questo meccanismo (una modifica introdotta con Plone 4) è questa: il sistema di sostituzioni di queste variabili non è "scritto nella roccia" ma è facilmente estendibile. Questo perché Plone si basa su un piccolo modulo il cui unico scopo è eseguire queste sostituzioni: sto parlando di plone.stringinterp.

Che cosa è cambiato e che cosa è migliorato con questo modulo? Un utente con delle minime nozioni di sviluppo può estendere automaticamente la lista di sostituzioni qui a fianco.

Come funziona

Il primo passo è la creazione di un named adapter per l'interfaccia plone.stringinterp.interfaces.IStringSubstitution. Il nome scelto dell'adapter è importantissimo perché diventerà il nome della variabile da utilizzare per le sostituzioni (ad esempio "foo"):

<adapter
     for="*"
     provides="plone.stringinterp.interfaces.IStringSubstitution"
     factory=".my_module.FooSubstitution"
     name="foo"
     />

...e poi la classe Python contenente la logica:

class FooSubstitution(BaseSubstitution):
    implements(IStringSubstitution)
   
    category = _(u'All Content')
    description = _(u'Totally useless text substitution!')

    def safe_call(self):
        return "Foo!!!"

Già ora potete riempire i vostri messaggi con una o più stringhe "${foo}"! Come avete potuto vivere senza?

Nel codice sopra dobbiamo notare:

  • la categoria (category) identifica il tipo di sostituzione della tabella sopra riportata. Va scelta quella più opportuna, come ad indicare la famiglia di sostituzione applicata
  • la descrizione (description) va a riempire la colonna "Sostituzione" della tabella sopra, quindi deve fornire un aiuto all'utente per capire lo scopo della variabile
  • il metodo safe_call, che deve contenere la logica della sostituzione.

Un esempio concreto

Di recente ci è stato chiesto esattamente quanto qui discusso: l'invio mail da regole Plone doveva essere esteso.
Si richiedeva che il messaggio comprendesse anche il testo del documento creato. Come vedete dalla tabella sopra, questa informazione non fa parte del set base di variabili disponibili (se vi state chiedendo il perché, tenete presente la logica nascosta dietro alla funzionalità: non tutti i contenuti hanno un campo testo principale e il concetto di testo può variare parecchio).

Come sopra introdotto ci è bastato sviluppare un prodotto aggiuntivo (liberamente accessibile): collective.stringinterp.text, che fornisce l'adapter richiesto come nell'esempio sopra:

Utilizzarlo è semplice, basta aggiungerlo al vostro buildout.

Limiti dell'invio mail di Plone

Una caratteristica a volte criticata del sistema di invio e-mail delle regole è la particolarità del campo "Destinatari messaggio": può essere un indirizzo e-mail o una lista di questi, ma è pur sempre una lista statica.

Esistono però una serie di prodotti che reimplementano l'invio e-mail in modo che i destinatari del messaggio siano variabili:

Sembrerebbe che con tutte queste libertà di configurazione e prodotti non ci sia limite alle possibili cose che si possano fare con l'invio mail di Plone...

...ora però vengono alcuni problemi, che il tempo mitigherà!

Come dicevo poco sopra, l'uso di plone.stringinterp è stato introdotto solo con Plone 4 mentre i prodotti qui elencati sono tutti nati con versioni precedenti di Plone o vogliono mantenere la compatibilità anche con Plone 3. Alcuni di questi prodotti non fanno ancora uso di plone.stringinterp ma si basano su una lista statica di possibili sostituzioni (e quindi non personalizzabile).

Al momento l'unico caso degno di nota è collective.contentrules.mailtorole, che dalla versione 1.6 ha iniziato a farne uso.

Con un moto di vergogna, lo ammetto: sebbene collective.contentrules.mailfromfield sia un nostro prodotto, ancora non dà il buon esempio e non usa plone.stringinterp!

Possibili sviluppi e migliorie

Concludo con una paio di modifiche che andrebbero probabilmente valutate nel meccanismo dell'azione di invio e-mail ufficiale di Plone.

Come avrete capito da soli, la tabella che riassume tutte le sostituzioni è davvero utile ad un utente che si cimenta alla compilazione della regola.
Al momento però non può essere facilmente utilizzata nei prodotti aggiuntivi descritti sopra: la tabella fa purtroppo parte del template dell'azione di invio mail di Plone e non è in una vista a sé stante, quindi facilmente richiamabile da altre azioni.
Rendere questa tabella un componente più indipendente permetterebbe di poterne beneficiare anche in altri prodotti che supportino plone.stringinterp.

Infine: analizzando il codice di collective.contentrules.mailtogroup mi sono imbattuto in una funzionlità spesso richiesta: l'invio delle e-mail in formato HTML (una cosa che per qualche motivo a me ignoto continua ad affascinare gli utenti).
Questa potrebbe essere un'altra funzionalità (opzionale) dell'azione di invio e-mail Plone, permettendo maggiori formattazioni e strutturamento dell'informazione.

L'immagine in testata è di Saudalf the Grey.

Filed under: , , ,
comments powered by Disqus