zope.principalannotation este un modul Python care implementează adnotări pentru directori zope.security. & Nbsp; Pentru a face clar, principalul aici este obiectul care oferă interfață zope.security.interfaces.IPrincipal și adnotări este obiectul furnizarea de Zope. annotation.interfaces.IAnnotations.
Problema este că directorii sunt obiecte dinamice, non-persistente create pe zbor pentru fiecare participare securitate (cerere sau ceva), deci tehnici de adnotare comun, cum ar fi AttributeAnnotations nu pot fi aplicate pentru a le.
Acest pachet oferă o stocare persistent de adnotări principale, stocarea adnotări pe ID-ul principal, precum și un adaptor de la IPrincipal la IAnnotations.
PrincipalAnnotationUtility
Nucleul acestui pachet este clasa PrincipalAnnotationUtility care stochează adnotări pentru directori și permite să le obține cu ușurință.
Acesta oferă interfața IPrincipalAnnotationUtility:
>>> Din zope.principalannotation.interfaces import IPrincipalAnnotationUtility
>>> Din zope.principalannotation.utility PrincipalAnnotationUtility import
>>> Din verifyObject import zope.interface.verify
>>> Util = PrincipalAnnotationUtility ()
>>> VerifyObject (IPrincipalAnnotationUtility, util)
Adevărat
Acesta oferă trei metode: getAnnotations, getAnnotationsById și hasAnnotations. Să crea o testare principal și verifica aceste metode:
>>> Din zope.security.testing Principal import
>>> Nadako = Principal ("nadako")
>>> Nadako.id
"Nadako"
Putem verifica dacă principalul nostru are orice adnotări. Desigur, în prezent nu are nici:
>>> util.hasAnnotations (nadako)
Fals
Putem obține IAnnotations obiect folosind obiect principal în sine:
>>> util.getAnnotations (nadako)
Sau folosind id principal:
>>> Util.getAnnotationsById (nadako.id)
Să obține IAnnotations opoziție pentru principalul nostru și să se joace cu ea:
>>> Annots = util.getAnnotations (nadako)
>>> Din verifyObject import zope.interface.verify
>>> Din IAnnotations zope.annotation.interfaces de import
>>> VerifyObject (IAnnotations, annots)
Adevărat
Să verificăm contractului IAnnotation:
>>> bool (annots)
Fals
>>> annots ['not.here']
Traceback (cel mai recent apel ultima):
...
KeyError: "not.here"
>>> Annots.get ("not.here") este None
Adevărat
>>> Annots.get ("not.here", 42)
42
Rețineți, că obiectul IAnnotations este stocat în utilitarul doar atunci când ne-am stabilit o cheie pentru ea. Aceasta este o optimizare simplu care ne permite să nu stoca orice date atunci când tot ceea ce facem este pur și simplu verificarea presense de adnotare. Metoda hasAnnotations va reveni Adevărat după stocarea o cheie în adnotările:
>>> util.hasAnnotations (nadako)
Fals
>>> annots ['its.here'] = 'unele informații "
>>> util.hasAnnotations (nadako)
Adevărat
Putem șterge, de asemenea, cheia existent:
>>> Del annots ['its.here']
Dar nu putem șterge cheia care este existant (nu mai mult):
>>> Del annots ['its.here']
Traceback (cel mai recent apel ultima):
...
KeyError: "its.here"
Utilitati de adnotare multiple
Imaginați-vă că aplicația are un obiect site-ul rădăcină cu registrul său component (aka șeful de șantier) și că obiectul are un obiect sub-site-ul cu propria registru componente, și că registru componente are rădăcina în registru componenta ca baza sa.
În acest caz, vrem ca IAnnotations obiecții să fie disponibile pentru a prelua adnotări de utilitati de nivel superior.
Să se înregistreze utilitate nostru în site-ul rădăcină și de a crea un sub-site-ul cu propria IPrincipalAnnotationUtility:
>>> Rădăcină ['util'] = util
>>> Rootsm = root.getSiteManager ()
>>> Rootsm.registerUtility (util, IPrincipalAnnotationUtility)
>>> Din Folder import zope.site.folder
>>> Din LocalSiteManager import zope.site.site
>>> Subsite = Folder ()
>>> Rădăcină ['subsite'] = subsite
>>> Subsm = LocalSiteManager (subsite)
>>> Subsm .__ bases__ = (rootsm,)
>>> Subsite.setSiteManager (subsm)
>>> Util2 = PrincipalAnnotationUtility ()
>>> Subsite ['util2'] = util2
>>> Subsm.registerUtility (util2, IPrincipalAnnotationUtility)
Acum, haideți să creeze o cheie în IAnnotations, cu condiția de utilitate rădăcină:
>>> Annots = util.getAnnotations (nadako)
>>> annots ['root.number'] = 42
Utilitarul subsite ar trebui sa adnotarea cu succes:
>>> Annots2 = util2.getAnnotations (nadako)
>>> Bool (annots2)
Adevărat
>>> Annots2 ['root.number']
42
Dacă avem cheia, atât în adnotări de nivel superior și cele de nivel inferior, nivel inferior va avea prioritate, dar de nivel superior nu vor fi șterse sau overriden:
>>> annots ['another.number'] = 1
>>> Annots2 ['another.number'] = 42
>>> annots ['another.number']
1
>>> Annots2 ['another.number']
42
Dacă vom șterge cheia de la nivel inferior, aceasta nu va fi ștearsă de la un nivel superior de utilitate:
>>> Del annots2 ['another.number']
>>> annots ['another.number']
1
>>> Annots2 ['another.number']
1
IPrincipal -> IAnnotations adaptor
Desigur, caracteristica cea mai bună este că putem adapta pur și simplu obiectul nostru principal a IAnnotations și a obține cele adnotări utilizând modalitate standard documentat în pachet zope.annotation.
& Nbsp; >>> annots = IAnnotations (nadako)
& Nbsp; >>> annots
& Nbsp;
& Nbsp; >>> annots ['root.number']
& Nbsp; 42
În mod implicit, adaptorul IAnnotation utilizează utilitate site-ul curent de:
>>> IAnnotations (nadako) este util.getAnnotations (nadako)
Adevărat
>>> Din zope.site.hooks setSite import
>>> SetSite (subsite)
>>> IAnnotations (nadako) este util2.getAnnotations (nadako)
Adevărat
Howerver, putem folosi un binar multi-adaptor pentru IAnnotations pentru a specifica un obiect context pentru a obține utilitarul adnotări:
>>> Din getMultiAdapter import zope.component
>>> Annots = getMultiAdapter ((nadako, rădăcină), IAnnotations)
>>> Annots este util.getAnnotations (nadako)
Adevărat
>>> Annots = getMultiAdapter ((nadako, subsite), IAnnotations)
>>> Annots este util2.getAnnotations (nadako)
Adevărat
Ce este nou în această versiune:.
- clasificatoare comoara corectate
Ce este nou în versiunea 3.6.1:
- Fixed un eșec încercare în Setup Manager site-ul local de cuibărit .
- Eliminat dependența de zope.container.
Cerințe :
- Python
Comentariile nu a fost găsit