Appunti Plone

Tips, Tricks & mini howto

[solved] AttributeError: type object ‘IThemeSpecific’ has no attribute ‘isOrExtends’

leave a comment »

Il Grande Capo Estiqaatsi direbbe:  – eh, grosso problema ora c’è -“.

Il problema si manifesta nel caso in cui disinstallate un prodotto del quale avevate customizzato una sua viewlet…
qualcosa del tipo:

1) installo mio.prodotto
2) customizzo da zmi -> portal_view_customizations una viewlet di mio.prodotto
3) disinstallo il mio.prodotto
(ach! ho dimenticato di cancellare la customizzazione…)

Avete apparentemente “rotto” il portal_view_customization, in quanto anche accedendo al /manage_main di questo tool e cancellando la customizzazion il problema permane.

Cercando online si approda ad una soluzione che, almeno nel mio caso, non funziona, e cioe’ ricostruire la buildout cache dell’egg plone.app.customerize.

Io ho risolto con un semplice intervento a cuore aperto… ci viene incontro la modalita’ instance debug.

E’ buona prassi, qualora si abbia un ambiente zeo, riservarsi un’istanza sempre spenta da accendere alla bisogna. Io le chiamo: instance-deb

$ bin/instance-deb debug
[...]
>>> from zope.app.component.hooks import setSite
>>> from transaction import commit
>>> portal=app.portalePlone
>>> setSite(portal)
>>> sm = portal.getSiteManager()
>>> sm._adapter_registrations.key()

segue lista di tutte le registrazioni al momento attive nel vostro ecosistema plone.

[N.B fin qui non avete eseguito codice che possa arrecare danno al vostro ambiente]

In questa lista e’ presente la registrazione della vostra interfaccia che non esiste piu’ e che quindi va rimossa.
Queste registrazioni non sono “ordinate” quindi ogni volta che avvierete l’applicazione la vostra interfaccia malevola si troverà in una posizione diversa.

Nel mio caso l’interfaccia si trovava registrata al 3° posto tra le chiavi:

>>> sm._adapter_registrations.keys()[2]
((<InterfaceClass zope.interface.Interface>, <class 'mio.prodotto.browser.interfaces.IThemeSpecific'>, <InterfaceClass zope.browser.interfaces.IBrowserView>, <InterfaceClass plone.app.layout.viewlets.interfaces.IPortalFooter>), <InterfaceClass zope.viewlet.interfaces.IViewlet>, u'mia.viewlet')
>>> key = sm._adapter_registrations.keys()[2]

Avevo customizzato in effetti un footer registrato dal prodotto che ho poi disinstallato.

L’intervento consiste nel cancellare questa chiave (e il suo contenuto) e committare nello zodb le modifiche:

[NB. da questo momento in poi modificate lo stato del sistema. Fate un backup dei vostri data.fs/blobstorage prima di proseguire]

>>> del sm._adapter_registrations[key]
>>> commit()
>>> app._p_jar.sync()
>>>

CTRL-D per uscire dalla sessione di debug.

Con l’ultimo comando avete “allertato” eventuali zeoclient collegati allo stesso zodb della modifica.
Se tutto e’ andato per il meglio potrete accedere nuovamente al portal_view_customizations all’interno della ZMI senza alcun problema.

Written by sauzher

1 aprile 2014 at 09:35

Pubblicato su Plone

Tagged with , ,

[diazo] Spostare elementi nel dom del solo “content”

leave a comment »

Situation:
devo muovere uno span con id “numbers” da una parte all’altra del dom del “content”, ovvero da dove viene printato NEL tag “a” contenuto nel “li” #portaltab-events.

Come fare?

<replace css:content="#portaltab-events a">
  <xsl:copy-of select="." />
  <xsl:copy-of select="//*[@id='numbers']" />
  <xsl:apply-templates />
</replace>

DOM prima della modifica a volo:

<ul>
[..]
<li id="portaltab-events">
<a href="#">Eventi</a>
</li>
[..]
</ul>
[.. bla bla ..]
<span id="numbers">5</span>

DOM che ne risulta:

<ul>
[..]
<li id="portaltab-events">
<a href="#">Eventi <span id="numbers">5</span></a>
</li>
[..]
</ul>

Written by vito80ba

10 settembre 2013 at 10:07

Pubblicato su Plone

Tagged with ,

Convertire il grid Sunburst in Bootstrap (via Diazo)

leave a comment »

Brevissimo tip:

negli ultimi progetti ho utilizzato il framework Twitter Bootrap come base per costruire siti web responsivi e avere un po’ di features in più.

Basandosi sullo scheletro generato da Plone4 (e quindi da Sunburst) ci ritroviamo con le celle della “grid” chiamate con classe “cell width1:3” (ad esempio).

Per convertire via Diazo (a volo) tale griglia ho elaborato qualche riga di xslt:

<replace content="//div[contains(@class,'cell')]/@class">
<xsl:attribute name="class">
<xsl:if test='contains(current(),"width-3:4")'>span9</xsl:if>
<xsl:if test='contains(current(),"width-2:3")'>span8</xsl:if>
<xsl:if test='contains(current(),"width-1:2")'>span6</xsl:if>
<xsl:if test='contains(current(),"width-1:3")'>span4</xsl:if>
<xsl:if test='contains(current(),"width-1:4")'>span3</xsl:if>
<xsl:if test='contains(current(),"width-full")'>span12</xsl:if>
</xsl:attribute>
</replace>

Altro non fa che cercare i div con classe “cell” e sostituirli con “spanX”.
Questa è una conversione a “crudo”. In layout complessi potrebbe essere necessario metterci mano, questo è solo uno spunto 😉

Vito

Written by vito80ba

26 luglio 2013 at 08:38

Pubblicato su Plone

Tagged with , ,

Case study: integrare Plone, mysql e phplist

leave a comment »

Qual’è il bello delle tecnologie open-source? Poterle integrare tra di loro avendone il pieno controllo.

Vi racconto brevemente cosa ho fatto per l’Associazione Cercasi Un Fine (una gran bella cosa: fare Politica e non politicanti ^_^) www.cercasiunfine.it

L’Associazione concentra le sue attività su due pilastri: le scuole di politica e la rivista cartacea. Ovvero: gruppi di utenti, stackholders e contenuti scritti a più mani. Come non pensare a Plone?
CercasiUnFine è radicata nel territorio e coinvolge svariate persone anche grazie alla organizzazione di seminari e incontri, durante i quali molti esprimono interesse a ricevere aggiornamenti e la copia cartacea. I valenti collaboratori dell’Associazione, quindi, hanno sempre raccolto indirizzi reali e di posta elettronica arrivando ad avere nella loro newsletter casalinga più di 1100 contatti.

Appare subito evidente la volontà di preservare tali indirizzi email e rendere il sistema di newsletter meno casalingo e più professionale.
Risposta: phpList, webapp blasonata e open per l’invio di newsletter (con tante features interessanti)

Il sito web, inteso anche come figlio della rivista cartacea, ha necessità di una caratterizzazionegrafica molto marcata.
Risposta: Diazo

Gli utenti della newsletter devono anche essere utenti del portale (plone).
Risposta: pas.plugin.SQLAlchemy

L’Associazione ha anche molti utenti che seguono le attività attraverso i social networks.
Risposta: collective.sharerize  add-on per Plone che permette facilmente la configurazione di servizi “gateway” per la condivisione su piattaforme social di contenuti (come ShareThis, Addthis, etc)

Gli “utenti” per CercasiUnFine non sono semplici lettori occasionali, ma vanno intesi come possibili creatori di contenuti anche grazie a suggerimenti/commenti.
Risposta: il nuovo “motore” di commenti plone.app.discussion

Gli indirizzi email della newsletter devono diventare utenti di portale.
Risposta: collective.mass_subscription add-on per la facile importazione di file csv per la creazione massiva di utenti (grazie Tartarughe Rosse!)

La parte più interessante è stata quella della configurazione di pas.plugin.SQLAlchemy grazie al quale sono riuscito a far storare gli utenti di Plone su database MySQL e quindi nelle tabelle utilizzate anche da phpList. Ho quindi poi affinato il tutto con la scrittura di qualche trigger per la generazione di tuple sulle apposite tabelle di phpList per permettere agli utenti di sottoscrivere automaticamente la newsletter principale e quindi (all’inverso) la cancellazione delle utenze in caso di dis-iscrizione dal portale.

Il resto è stato abbastanza lineare e “standard” come la scrittura del tema con Diazo e la configurazione dei permessi per il gruppo di redazione e quello di amministrazione.

Per quanto riguarda il deploy ho scelto un “classico”: Apache > Varnish (balancer e cache) > ZeoClients > ZeoServer

Come sempre anche questo lavoro mi ha dato la possibilità di affinare la mia figura di one-man-band: design, sviluppo e sysadmin. Non ho ancora capito se è un pregio o una condanna 🙂

Il lavoro non è davvero ultimato ma è work-in-progress dato che pian piano stanno venendo fuori tante nuove idee ed iniziative per la presenza online dell’associazione Cercasi un Fine!

 

Written by vito80ba

31 agosto 2012 at 12:15

Pubblicato su case studies, Plone

Tagged with , ,

Come impostare proprietà dell’utente (come lo wysiwyg editor) da bash script

leave a comment »

Ecco un semplice script da lanciare da bash per impostare velocemente delle proprietà utente, come ad esempio il Wysiwyg editor, per tutti gli utenti, in caso di migrazione a plone4.

  • senza external method
  • senza ZMI
  • senza blueprint
  • senza browser view
  • senza particolari permessi (manager o altro)

Create un file nella root del vostro buildout, ad esempio “setDefaultEditor.py” e popolatelo con il seguente codice:

from zope.app.component.hooks import setSite
from transaction import commit

portal=app.MyPlone
setSite(portal)

pm = portal.portal_membership

for memberId in pm.listMemberIds():
   member = pm.getMemberById(memberId)
   editor = member.getProperty('wysiwyg_editor', None)
   if editor == 'TinyMCE':
       print('%s: TinyMCE already selected, leaving alone' % memberId)
   else:
       member.setMemberProperties({'wysiwyg_editor': 'TinyMCE'})
       print('%s: TinyMCE has been set' % memberId)

commit()
app._p_jar.sync()

Dopodichè semplicemente lanciare a shell:

$ bin/instance run setDefaultEditor.py

Questo è tutto. Efficace e veloce.

Leggi il seguito di questo post »

Written by sauzher

2 febbraio 2012 at 09:33

Pubblicato su Plone

libmysqlclient.18.dylib + mysql + plone + macosx

leave a comment »

Su MacOs X una volta installato MySQL e messo su il vostro bel buildout è possibile che Plone fallisca a causa di un errore di questo tipo:

ImportError: dlopen(/Users/.../MySQL_python-1.2.3-py2.6-macosx-10.6-x86_64.egg/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
 Referenced from: /Users/.../MySQL_python-1.2.3-py2.6-macosx-10.6-x86_64.egg/_mysql.so

 

E’ un problema di variabili d’ambiente legate alle librerie MySQL su Mac Os.

Per ovviare basta inserire nel buildout.cfg:

[instance]
..
zope-conf-additional=
  <environment>
  DYLD_LIBRARY_PATH /usr/local/mysql/lib/
  </environment>

 

Naturalmente questo percorso funziona se avete installato il MySQL lasciando intatti i parametri al momento del setup.

Vito

Written by vito80ba

11 gennaio 2012 at 11:01

Pubblicato su Plone

Tagged with , ,

Diazo come standalone server: skin da urlo per Plone 2 e 3

with 2 comments

Arrivo subito al dunque: un committente con un portale Plone 3.3 pienamente funzionante vuole una nuova skin complessa senza toccare la logica del portale (alias “non vuole spendere assai” -.-). Un plonista contemporaneo pensa subito alla soluzione: Diazo!
Diazo funziona alla grande in accoppiata con plone.app.theming però… questo pacchetto è compatibile con Plone 4.1!

Quali potrebbero essere le strade da intraprendere:

  • utilizzare XDV e collective.xdv
  • pro: pienamente compatibile e configurabile l’integrazione plone con xdv (tramite appunto il collective.xdv)
  • contro: xdv non è più supportato e sviluppato, offre meno potenzialità rispetto a Diazo
  • utilizzare e cablare Diazo per Plone 3:
    • pro: si potrebbe cablare l’integrazione plone-diazo con collective.xdv
    • contro: collective.xdv è stato scritto per XDV quindi bisognerebbe forkare il pacchetto e ottimizzarlo per Diazo. Cui prodest?
  • migrare il portale a Plone 4.1
    • pro: utilizzo di plone.app.theming (il successore di collective.xdv) per ottenere perfetta integrazione Diazo-plone
    • contro: vuoi proprio fare una migrazione tra major releases gratis??

    Leggi il seguito di questo post »

    Written by vito80ba

    23 dicembre 2011 at 08:51

    Pubblicato su Plone

    Tagged with , , ,

    Problemi con PIL (su linux o mac) quando installi il Plone?

    leave a comment »

    Nessun problema, finalmente un fork funzionante 😀

    http://pypi.python.org/pypi/Pillow/1.7.5

    La soluzione si chiama Pllow! E’ un egg come gli altri, da inserire nel buildout.cfg, ma risolve un po’ di sbattimento con libjpeg, zlib e compagnia.

    Written by vito80ba

    3 ottobre 2011 at 11:00

    Pubblicato su Plone

    Tagged with

    Supervisor recipe per pound, varnish, zeo cluster e Plone 4.0.5

    leave a comment »

    Questa mattina ho configurato il mio buildout arricchendolo della recipe di supervisore (collective.recipe.supervisor), un ottimo strumento per avere il nostro cluster di produzione sotto controllo.

    Mi sono tuttavia imbattuto in una serie di problemi dovuti probabilmente alla documentazione di questa ricetta non ancora aggiornata su pypi.

    Ecco come ho risolto…

    Leggi il seguito di questo post »

    Written by sauzher

    1 luglio 2011 at 12:57

    Pubblicato su Plone

    LinguaPlone4 e Plone4: che bella novità :)

    with one comment

    Finalmente trovo il tempo di scrivere qualche nuova riga sul blog.

    In questi giorni, dopo un annetto di “astinenza” da siti multilingua, ho dovuto cimentarmi nella realizzazione di un nuovo sito bilingue.
    “Ottima occasione per testare il nuovo Plone4 con LinguaPlone” mi son detto…

    Ebbene, ho scoperto che anche LinguaPlone è arrivato alla release numero quattro e con un bella novità (della quale ero all’oscuro).

    Leggi il seguito di questo post »

    Written by vito80ba

    11 marzo 2011 at 16:42

    Pubblicato su Plone

    Tagged with