[Checkins] SVN: zc.notification/trunk/src/zc/notification/ Adapt to IAnnotations instead of using the IPrincipalAnnotationUtility directly.

Jacob Holm jh at improva.dk
Tue Mar 6 16:07:35 EST 2007


Log message for revision 73022:
  Adapt to IAnnotations instead of using the IPrincipalAnnotationUtility directly.
  
  

Changed:
  U   zc.notification/trunk/src/zc/notification/browser/views.py
  U   zc.notification/trunk/src/zc/notification/email/README.txt
  U   zc.notification/trunk/src/zc/notification/email/tests.py
  U   zc.notification/trunk/src/zc/notification/notification.py
  U   zc.notification/trunk/src/zc/notification/tests.py

-=-
Modified: zc.notification/trunk/src/zc/notification/browser/views.py
===================================================================
--- zc.notification/trunk/src/zc/notification/browser/views.py	2007-03-06 20:46:26 UTC (rev 73021)
+++ zc.notification/trunk/src/zc/notification/browser/views.py	2007-03-06 21:07:34 UTC (rev 73022)
@@ -3,8 +3,6 @@
 import zope.schema
 import zope.formlib.form
 
-from zope.app.principalannotation.interfaces import IPrincipalAnnotationUtility
-
 import zc.notification.interfaces
 
 from zc.notification.i18n import _

Modified: zc.notification/trunk/src/zc/notification/email/README.txt
===================================================================
--- zc.notification/trunk/src/zc/notification/email/README.txt	2007-03-06 20:46:26 UTC (rev 73021)
+++ zc.notification/trunk/src/zc/notification/email/README.txt	2007-03-06 21:07:34 UTC (rev 73022)
@@ -106,9 +106,11 @@
 
 To use the notifier, we'll need the annotations for the target user::
 
-  >>> annotations = zope.component.getUtility(
-  ...     zope.app.principalannotation.interfaces.IPrincipalAnnotationUtility)
-  >>> user1 = annotations.getAnnotationsById("user1")
+  >>> from zope.annotation.interfaces import IAnnotations
+  >>> auth = zope.component.getUtility(
+  ...     zope.app.security.interfaces.IAuthentication)
+  >>> principal = auth.getPrincipal("user1")
+  >>> user1 = IAnnotations(principal)
 
 As with all notifiers, we can just use the `send()` method::
 

Modified: zc.notification/trunk/src/zc/notification/email/tests.py
===================================================================
--- zc.notification/trunk/src/zc/notification/email/tests.py	2007-03-06 20:46:26 UTC (rev 73021)
+++ zc.notification/trunk/src/zc/notification/email/tests.py	2007-03-06 21:07:34 UTC (rev 73022)
@@ -30,29 +30,18 @@
 import zc.notification.tests
 
 
-class Authentication(object):
 
-    zope.interface.implements(
-        zope.app.security.interfaces.IAuthentication)
-
-    def getPrincipal(self, id):
-        return Principal(id)
-
-
-class Principal(object):
-
-    zope.interface.implements(
-        zope.app.security.interfaces.IPrincipal)
-
-    def __init__(self, id):
-        self.id = id
-
-
 def setUp(test):
     zope.app.testing.placelesssetup.setUp(test)
-    zope.component.provideUtility(Authentication())
-    zope.component.provideUtility(
-        zc.notification.tests.PrincipalAnnotationUtility())
+    zope.component.provideUtility(zc.notification.tests.Authentication())
+    zope.component.provideAdapter(
+        zc.notification.tests.Annotations,
+        (zope.app.security.interfaces.IPrincipal,),
+        zope.annotation.interfaces.IAnnotations)
+    zope.component.provideAdapter(
+        zc.notification.tests.Annotations,
+        (zope.app.security.interfaces.IPrincipal, None),
+        zope.annotation.interfaces.IAnnotations)
 
 def test_suite():
     return unittest.TestSuite((

Modified: zc.notification/trunk/src/zc/notification/notification.py
===================================================================
--- zc.notification/trunk/src/zc/notification/notification.py	2007-03-06 20:46:26 UTC (rev 73021)
+++ zc.notification/trunk/src/zc/notification/notification.py	2007-03-06 21:07:34 UTC (rev 73022)
@@ -30,7 +30,7 @@
 import zope.app.container.interfaces
 import zope.app.container.contained
 
-from zope.app.principalannotation.interfaces import IPrincipalAnnotationUtility
+from zope.annotation.interfaces import IAnnotations
 
 import zc.notification.interfaces
 
@@ -165,9 +165,12 @@
         self._registrations = BTrees.OOBTree.OOBTree()
 
     def get_annotations(self, principal_id, context=None):
-        utility = zope.component.getUtility(IPrincipalAnnotationUtility,
-                                            context=context)
-        return utility.getAnnotationsById(principal_id)
+        principals = zope.component.getUtility(
+            zope.app.security.interfaces.IAuthentication,
+            context=context)
+        principal = principals.getPrincipal(principal_id)
+        return zope.component.getMultiAdapter((principal, context),
+                                              IAnnotations)
 
     def setNotifierMethod(self, principal_id, method, context=None):
         annotations = self.get_annotations(principal_id, context)

Modified: zc.notification/trunk/src/zc/notification/tests.py
===================================================================
--- zc.notification/trunk/src/zc/notification/tests.py	2007-03-06 20:46:26 UTC (rev 73021)
+++ zc.notification/trunk/src/zc/notification/tests.py	2007-03-06 21:07:34 UTC (rev 73022)
@@ -23,23 +23,56 @@
 import zope.component
 import zope.interface
 
-import zope.app.principalannotation.interfaces
 import zope.app.testing.placelesssetup
+import zope.app.security.interfaces
+import zope.annotation.interfaces
 
 import zc.notification.interfaces
 
-class PrincipalAnnotationUtility(object):
 
+class Principal(object):
+
     zope.interface.implements(
-        zope.app.principalannotation.interfaces.IPrincipalAnnotationUtility)
+        zope.app.security.interfaces.IPrincipal)
 
+    def __init__(self, id):
+        self.id = id
+
+class Authentication(object):
+
+    zope.interface.implements(
+        zope.app.security.interfaces.IAuthentication)
+
     def __init__(self):
         self._data = {}
 
-    def getAnnotationsById(self, id):
-        return self._data.setdefault(id, {})
+    def getPrincipal(self, principal_id):
+        try:
+            principal = self._data[principal_id]
+        except KeyError:
+            principal = Principal(principal_id)
+            self._data[principal_id] = principal
+        return principal
 
+class Annotations(dict):
 
+    zope.interface.implements(
+        zope.annotation.interfaces.IAnnotations)
+
+    def __new__(class_, principal, context=None):
+        try:
+            annotations = principal.annotations
+        except AttributeError:
+            annotations = dict.__new__(class_)
+            principal.annotations = annotations
+        return annotations
+
+    def __init__(self, principal, context=None):
+        pass
+
+
+
+
 class PrintNotifier(object):
 
     zope.interface.implements(
@@ -55,8 +88,16 @@
 
 def setUp(test):
     zope.app.testing.placelesssetup.setUp(test)
-    util = PrincipalAnnotationUtility()
+    util = Authentication()
     zope.component.provideUtility(util)
+    zope.component.provideAdapter(
+        Annotations,
+        (zope.app.security.interfaces.IPrincipal,),
+        zope.annotation.interfaces.IAnnotations)
+    zope.component.provideAdapter(
+        Annotations,
+        (zope.app.security.interfaces.IPrincipal, None),
+        zope.annotation.interfaces.IAnnotations)
     zope.component.provideUtility(PrintNotifier("email"), name="email")
     zope.component.provideUtility(PrintNotifier())
 



More information about the Checkins mailing list