zope.principalannotation είναι μια ενότητα Python που υλοποιεί σχολιασμούς για διευθυντές zope.security & nbsp?. Για να καταστεί σαφές, ο κύριος εδώ είναι το αντικείμενο που παρέχει zope.security.interfaces.IPrincipal διασύνδεση και σχολιασμοί είναι το αντικείμενο που παρέχει Zope. annotation.interfaces.IAnnotations.
Το πρόβλημα είναι ότι οι διευθυντές είναι δυναμική, μη επίμονη αντικείμενα που δημιουργούνται on the fly για κάθε συμμετοχή ασφαλείας (αίτηση ή κάτι τέτοιο), έτσι κοινές τεχνικές σχολιασμού, όπως AttributeAnnotations δεν μπορεί να εφαρμοστεί σε αυτούς.
Αυτό το πακέτο παρέχει μια επίμονη αποθήκευση του κύριου σχολιασμούς, αποθήκευση σχολιασμούς από τους κυριότερους ταυτότητα καθώς και έναν προσαρμογέα από IPrincipal να IAnnotations.
PrincipalAnnotationUtility
Ο πυρήνας αυτού του πακέτου είναι η κατηγορία PrincipalAnnotationUtility που αποθηκεύει σημειώσεις για εντολείς και επιτρέπει να τους πάρει εύκολα.
Παρέχει τη διασύνδεση IPrincipalAnnotationUtility:
>>> Από zope.principalannotation.interfaces εισαγωγή IPrincipalAnnotationUtility
>>> Από zope.principalannotation.utility PrincipalAnnotationUtility εισαγωγής
>>> Από zope.interface.verify verifyObject εισαγωγής
>>> Util = PrincipalAnnotationUtility ()
>>> VerifyObject (IPrincipalAnnotationUtility, util)
Αληθής
Παρέχει τρεις μεθόδους: getAnnotations, getAnnotationsById και hasAnnotations. Ας δημιουργήσουμε μια κύρια δοκιμή και ελέγξτε έξω αυτές τις μεθόδους:
>>> Από zope.security.testing Κύριος εισαγωγής
>>> Nadako = Κύριος («nadako»)
>>> Nadako.id
«Nadako»
Μπορούμε να ελέγξετε αν ο κύριος μας έχει οποιαδήποτε σχόλια. Φυσικά, αυτή τη στιγμή δεν έχει καμία:
>>> Util.hasAnnotations (nadako)
Ψευδής
Μπορούμε να πάρουμε IAnnotations αντικείμενο με κύριο αντικείμενο το ίδιο:
>>> Util.getAnnotations (nadako)
Ή, χρησιμοποιώντας κύρια id:
>>> Util.getAnnotationsById (nadako.id)
Ας πάρουμε τα IAnnotations αντιρρήσεις για τον εντολέα μας και να παίξετε με αυτό:
>>> Annots = util.getAnnotations (nadako)
>>> Από zope.interface.verify verifyObject εισαγωγής
>>> Από IAnnotations zope.annotation.interfaces εισαγωγής
>>> VerifyObject (IAnnotations, annots)
Αληθής
Ας ελέγξουμε το IAnnotation σύμβαση:
>>> Bool (annots)
Ψευδής
>>> Annots [«not.here»]
Traceback (πιο πρόσφατη κλήση τελευταία):
...
KeyError: «not.here»
>>> Annots.get («not.here») είναι Κανένας
Αληθής
>>> Annots.get («not.here», 42)
42
Σημειώστε, ότι το αντικείμενο IAnnotations παίρνει αποθηκεύονται στη χρησιμότητα μόνο όταν θέτουμε ένα κλειδί για αυτό. Αυτή είναι μια απλή βελτιστοποίηση που μας επιτρέπει να μην αποθηκεύουν όλα τα δεδομένα, όταν το μόνο που κάνουμε είναι απλά ο έλεγχος για presense του σχολιασμού. Η μέθοδος hasAnnotations θα επιστρέψει True μετά αποθήκευση ενός κλειδιού στα σχόλια:
>>> Util.hasAnnotations (nadako)
Ψευδής
>>> Annots [«its.here '] =' κάποιες πληροφορίες»
>>> Util.hasAnnotations (nadako)
Αληθής
Μπορούμε επίσης να διαγράψετε το υπάρχον κλειδί:
>>> Del annots [«its.here»]
Αλλά δεν μπορούμε να διαγράψετε το κλειδί που είναι (πλέον) existant:
>>> Del annots [«its.here»]
Traceback (πιο πρόσφατη κλήση τελευταία):
...
KeyError: «its.here»
Επιχειρήσεις κοινής ωφέλειας Πολλαπλές σχολιασμό
Φανταστείτε ότι η αίτησή σας έχει μια ρίζα αντικείμενο του site με το μητρώο του συστατικού (γνωστός και ως διευθυντής εργοταξίου) και ότι το αντικείμενο έχει ένα υπο-αντικείμενο του site με δική του γραμματεία συνιστώσα της, και ότι το μητρώο συστατικό έχει μητρώου συστατικό της ρίζας ως βάση του.
Στην περίπτωση αυτή, θέλουμε οι IAnnotations αντίρρηση να είναι διαθέσιμες για να ανακτήσετε σχολιασμούς από βοηθητικά προγράμματα υψηλότερου επιπέδου.
Ας εγγραφείτε χρησιμότητα μας στη ρίζα του site και να δημιουργήσει μια υπο-περιοχή με το δικό του IPrincipalAnnotationUtility:
>>> Ρίζα [«util '] = util
>>> Rootsm = root.getSiteManager ()
>>> Rootsm.registerUtility (util, IPrincipalAnnotationUtility)
>>> Από zope.site.folder φακέλου εισαγωγής
>>> Από zope.site.site LocalSiteManager εισαγωγής
>>> Δευτερεύουσα τοποθεσία = Φάκελος ()
>>> Ρίζα [«υπο-θέση '] = υπο-θέση
>>> Subsm = LocalSiteManager (υπο-θέση)
>>> Subsm .__ bases__ = (rootsm,)
>>> Subsite.setSiteManager (subsm)
>>> Util2 = PrincipalAnnotationUtility ()
>>> Υπο-θέση [«util2 '] = util2
>>> Subsm.registerUtility (util2, IPrincipalAnnotationUtility)
Τώρα, ας δημιουργήσουμε ένα κλειδί στα IAnnotations, που παρέχονται από το βοηθητικό πρόγραμμα ρίζα:
>>> Annots = util.getAnnotations (nadako)
>>> Annots [«root.number '] = 42
Η χρησιμότητα υπο-θέση θα πρέπει να πάρετε το σχόλιο επιτυχώς:
>>> Annots2 = util2.getAnnotations (nadako)
>>> Bool (annots2)
Αληθής
>>> Annots2 [«root.number»]
42
Αν έχουμε το κλειδί, τόσο στους σχολιασμούς υψηλότερου επιπέδου και αυτά χαμηλότερου επιπέδου, το χαμηλότερο επίπεδο θα έχουν προτεραιότητα, αλλά υψηλότερου επιπέδου δεν θα διαγραφούν ή overriden:
>>> Annots [«another.number '] = 1
>>> Annots2 [«another.number '] = 42
>>> Annots [«another.number»]
1
>>> Annots2 [«another.number»]
42
Αν θα διαγράψετε το κλειδί από χαμηλότερο επίπεδο, δεν θα πρέπει να διαγραφούν από ένα υψηλότερο επίπεδο χρησιμότητας:
>>> Del annots2 [«another.number»]
>>> Annots [«another.number»]
1
>>> Annots2 [«another.number»]
1
IPrincipal -> προσαρμογέας IAnnotations
Φυσικά, το πιο ωραίο χαρακτηριστικό είναι ότι μπορούμε απλά να προσαρμόσει κύριο αντικείμενο μας να IAnnotations και να πάρει αυτά τα σχόλια χρησιμοποιώντας τυποποιημένο τρόπο τεκμηριωμένο σε πακέτο zope.annotation.
& Nbsp? >>> Annots = IAnnotations (nadako)
& Nbsp? >>> Annots
& Nbsp?
& Nbsp? >>> Annots [«root.number»]
& Nbsp? 42
Από προεπιλογή, ο προσαρμογέας IAnnotation χρησιμοποιεί χρησιμότητα της τρέχουσας ιστοσελίδας:
>>> IAnnotations (nadako) είναι util.getAnnotations (nadako)
Αληθής
>>> Από zope.site.hooks setSite εισαγωγής
>>> SetSite (υπο-θέση)
>>> IAnnotations (nadako) είναι util2.getAnnotations (nadako)
Αληθής
Ωστόσο θα μπορούν να χρησιμοποιήσουν ένα δυαδικό multi-προσαρμογέα IAnnotations να καθορίσετε κάποιο αντικείμενο το πλαίσιο από το οποίο να πάρει τη χρησιμότητα σχόλια:
>>> Από zope.component getMultiAdapter εισαγωγής
>>> Annots = getMultiAdapter ((nadako, ρίζα), IAnnotations)
>>> Annots είναι util.getAnnotations (nadako)
Αληθής
>>> Annots = getMultiAdapter ((nadako, υπο-θέση), IAnnotations)
>>> Annots είναι util2.getAnnotations (nadako)
Αληθινή
Τι είναι καινούργιο σε αυτή την έκδοση:.
- Διορθώθηκε ταξινομητές Trove
Τι είναι καινούργιο στην έκδοση 3.6.1:
- Διορθώθηκε αποτυχία της δοκιμής σε φωλιασμένη τις ρυθμίσεις του τοπικού διευθυντής εργοταξίου .
- Αφαιρέθηκε της εξάρτησης από zope.container.
Απαιτήσεις :
- Python
Τα σχόλια δεν βρέθηκε