zope.principalannotation é um módulo Python que implementa anotações para diretores zope.security & nbsp;. Para deixar claro, o principal aqui é o objeto que fornece interface e anotações zope.security.interfaces.IPrincipal é o objeto fornecendo Zope. annotation.interfaces.IAnnotations.
O problema é que os diretores é objetos dinâmicos, não-persistentes criadas on the fly para cada participação segurança (pedido ou algo assim), então técnicas de anotação comum, como AttributeAnnotations não pode ser aplicado a eles.
Este pacote fornece um armazenamento persistente de anotações principais, armazenar anotações por principais ID, bem como um adaptador de IPrincipal para IAnnotations.
PrincipalAnnotationUtility
O núcleo deste pacote é a classe PrincipalAnnotationUtility que armazena anotações para diretores e permite obtê-los facilmente.
Ele fornece a interface IPrincipalAnnotationUtility:
>>> From zope.principalannotation.interfaces importar IPrincipalAnnotationUtility
>>> From zope.principalannotation.utility importação PrincipalAnnotationUtility
>>> From zope.interface.verify verifyObject importação
>>> Util = PrincipalAnnotationUtility ()
>>> VerifyObject (IPrincipalAnnotationUtility, util)
Verdadeiro
Ele fornece três métodos: GetAnnotations, getAnnotationsById e hasAnnotations. Vamos criar uma entidade de testes e verificar esses métodos:
>>> From zope.security.testing principal importação
>>> Nadako = Principal ('nadako')
>>> Nadako.id
'Nadako'
Podemos verificar se o nosso principal possui quaisquer anotações. É claro que não tem actualmente qualquer:
>>> util.hasAnnotations (nadako)
Falso
Podemos obter IAnnotations objeto usando capital próprio objeto:
>>> util.getAnnotations (nadako)
Ou usando id principais:
>>> Util.getAnnotationsById (nadako.id)
Vamos fazer o IAnnotations objeto para o nosso principal e jogar com ele:
>>> Annots = util.getAnnotations (nadako)
>>> From zope.interface.verify verifyObject importação
>>> From IAnnotations zope.annotation.interfaces importação
>>> VerifyObject (IAnnotations, annots)
Verdadeiro
Vamos verificar o contrato IAnnotation:
>>> bool (annots)
Falso
>>> annots ['not.here']
Traceback (most recent call last):
...
KeyError: 'not.here'
>>> Annots.get ('not.here') é None
Verdadeiro
>>> Annots.get ('not.here', 42)
42
Note-se, que o objeto IAnnotations fica armazenado no utilitário apenas quando vamos definir uma chave para ele. Esta é uma otimização simples que nos permite não para armazenar todos os dados quando tudo o que fazemos é simplesmente verificar para presense de anotação. O método hasAnnotations irá retornar True depois de armazenar uma chave nas anotações:
>>> util.hasAnnotations (nadako)
Falso
>>> annots ['its.here'] = 'alguma informação'
>>> util.hasAnnotations (nadako)
Verdadeiro
Nós também podemos excluir a chave existente:
>>> Del annots ['its.here']
Mas não podemos excluir a chave que é (não mais) existant:
>>> Del annots ['its.here']
Traceback (most recent call last):
...
KeyError: 'its.here'
Utilitários de anotação Multiple
Imagine que a sua aplicação tem um objeto de site de raiz com o seu registro componente (aka administrador do site) e esse objeto tem um objeto de sub-site com seu próprio registro de componentes, e que o registro componente tem registro componente da raiz como sua base.
Nesse caso, queremos que os IAnnotations objeto a ser disponível para recuperar as anotações de utilitários de alto nível.
Vamos registrar a nossa utilidade no site raiz e criar um sub-site com seu próprio IPrincipalAnnotationUtility:
>>> Raiz ['util'] = util
>>> Rootsm = root.getSiteManager ()
>>> Rootsm.registerUtility (util, IPrincipalAnnotationUtility)
>>> From pasta de importação zope.site.folder
>>> From zope.site.site LocalSiteManager importação
>>> Subsite = Pasta ()
>>> Raiz ['subsite'] = subsite
>>> Subsm = LocalSiteManager (subsite)
>>> Subsm .__ bases__ = (rootsm,)
>>> Subsite.setSiteManager (subsm)
>>> Util2 = PrincipalAnnotationUtility ()
>>> Subsite ['util2'] = util2
>>> Subsm.registerUtility (util2, IPrincipalAnnotationUtility)
Agora, vamos criar uma chave nos IAnnotations, fornecido pelo utilitário root:
>>> Annots = util.getAnnotations (nadako)
>>> annots ['root.number'] = 42
O utilitário subsite deve começar a anotação com sucesso:
>>> Annots2 = util2.getAnnotations (nadako)
>>> Bool (annots2)
Verdadeiro
>>> Annots2 ['root.number']
42
Se nós temos a chave tanto em anotações de nível superior e os de nível mais baixo, o nível mais baixo terá prioridade, mas de nível superior não serão excluídos ou anulado:
>>> annots ['another.number'] = 1
>>> Annots2 ['another.number'] = 42
>>> annots ['another.number']
1
>>> Annots2 ['another.number']
42
Se nós vamos eliminar a chave de nível inferior, ele não será excluído de um utilitário de nível superior:
>>> Del annots2 ['another.number']
>>> annots ['another.number']
1
>>> Annots2 ['another.number']
1
IPrincipal -> adaptador IAnnotations
É claro que a característica mais interessante é que podemos simplesmente adaptar o nosso principal objectivo para IAnnotations e obter essas anotações usando maneira padrão documentado no pacote zope.annotation.
& Nbsp; >>> annots = IAnnotations (nadako)
& Nbsp; >>> annots
& Nbsp;
& Nbsp; >>> annots ['root.number']
& Nbsp; 42
Por padrão, o adaptador IAnnotation usa a utilidade do site atual:
>>> IAnnotations (nadako) é util.getAnnotations (nadako)
Verdadeiro
>>> From zope.site.hooks SetSite importação
>>> SetSite (subsite)
>>> IAnnotations (nadako) é util2.getAnnotations (nadako)
Verdadeiro
Howerver, podemos usar um binário multi-adaptador para IAnnotations especificar algum objeto de contexto do qual obter o utilitário anotações:
>>> From zope.component getMultiAdapter importação
>>> Annots = getMultiAdapter ((nadako, root), IAnnotations)
>>> Annots é util.getAnnotations (nadako)
Verdadeiro
>>> Annots = getMultiAdapter ((nadako, subsite), IAnnotations)
>>> Annots é util2.getAnnotations (nadako)
Verdadeiro
O que é novo nesta versão:.
- classificadores Trove Corrigidos
O que é novo na versão 3.6.1:
- Corrigido uma falha de teste na configuração do gerenciador de site local nested .
- Removido dependência de zope.container.
Requisitos :
- Python
Comentários não encontrado