Icone delle cartelle differenti a seconda del contesto
Note: Return to tutorial view.
Icone delle cartelle differenti a seconda del contesto
Ciò che si vuole ottenere è che, nel portlet della navigazione, le cartelle siano mostrate con un'icona differente in base ai diritti di accesso dei navigatori anonimi per quei contenuti.
Concretamente, se per una data cartella i navigatori anonimi non hanno il permesso di visualizzazione (View), gli utenti autenticati dovrebbero vedere un'icona rossa per la cartella in questione, invece che una gialla (naturalmente gli utenti non autenticati non vedranno affatto la cartella).
- Adattare portlet_navigation
In una copia personalizzata di portal_skins/plone_portlets/portlet_navigation, sostituire la linea:
<img tal:replace="structure python:path('here/%s' % sibling.getIcon(1))"
con:
<img tal:replace="structure python:path(here.portal_url.scripts.folder_icon(sibling))"
- Customizzare l'icona
Creare una copia personale di portal_skins/portal_images/folder_icon.gif, rinominarla come red_folder_icon.gif, caricare una versione dell'icona con i colori alterati.
- Implementare la logica in uno Script/External Method
Nella propria cartella portal_skins/custom nello ZMI, o in un'altra cartella di skin layer, aggiungere uno "Script (Python)" col nome "folder_icon" con il seguente contenuto, e impostare nella Parameter List: 'obj=None':
canMaybeView = context.anonymousHasRight(obj, 'View')
or context.anonymousHasRight(obj, 'Access contents information')
or context.anonymousHasRight(obj, 'Search ZCatalog')
if canMaybeView:
return 'here/' + obj.getIcon(1)
else:
return 'here/red_' + obj.getIcon(1)
Il confronto dei diritti effettivi deve essere fatto usando un External Method, per evitare limitazioni di diritti per utenti che non hanno ruoli di Manager. Creare un file CheckRights.py nel file system, nella directory Extensions sotto la directory dell'installazione di Zope, con il contenuto seguente:
def anonymousHasRight(folder, right='View'):
"""
For a given Plone folder, determine whether Anonymous has the right
given by parameter 'right' (String). This recurses to parents if
'Acquire' is checked.
Returns 1 if Anonymous has the right, 0 otherwise.
"""
ps = folder.permission_settings()
for p in ps:
if (p['name'] == right):
acquired = not not p['acquire']
break
if acquired:
# recurse upwardly:
parent = folder.aq_parent
return anonymousHasRight(parent, right)
else:
for p in folder.rolesOfPermission(right):
if p['name'] == "Anonymous":
selected = not not p['selected']
return selected
Questo è tutto! Non è molto elegante, ma dovrebbe funzionare. Suggerimenti riguardo a possibili miglioramenti sono i benvenuti.
Credits
Questo documento è stato realizzato da:
- Alice Narduzzo
Fonti e contributi:
Questo how-to è una libera traduzione del testo originale Context-dependent navigation folder icons.