merge default doc-dc
authorDamien Correia
Tue, 29 May 2018 11:13:16 +0200
branchdoc-dc
changeset 260 1ed791a40890
parent 259 931959214ed9 (current diff)
parent 186 c08b45bbed38 (diff)
child 261 a11273a42e18
merge default
--- a/src/pyams_utils/adapter.py	Fri May 25 17:06:43 2018 +0200
+++ b/src/pyams_utils/adapter.py	Tue May 29 11:13:16 2018 +0200
@@ -132,7 +132,7 @@
 
 
 def get_annotation_adapter(context, key, factory=None, markers=None, notify=True,
-                           locate=True, parent=None, name=None):
+                           locate=True, parent=None, name=None, callback=None, **kwargs):
     """Get an adapter via object's annotations, creating it if not existent
     
     :param object context: context object which should be adapted
@@ -145,20 +145,26 @@
     :param object=None parent: parent to which new object is attached
     :param str=None name: if locate is not False, this is the name with which the new object is attached
         to it's parent.
+    :param callback: if not None, callback function which will be called after
     """
     annotations = IAnnotations(context, None)
     if annotations is None:
         return None
     adapter = annotations.get(key)
     if adapter is None:
-        if factory is None:
+        if 'default' in kwargs:
+            return kwargs['default']
+        elif factory is None:
             return None
-        adapter = annotations[key] = factory()
-        if markers:
-            for marker in markers:
-                alsoProvides(adapter, marker)
-        if notify:
-            get_current_registry().notify(ObjectCreatedEvent(adapter))
-        if locate:
-            zope_locate(adapter, context if parent is None else parent, name)
+        else:
+            adapter = annotations[key] = factory()
+            if markers:
+                for marker in markers:
+                    alsoProvides(adapter, marker)
+            if notify:
+                get_current_registry().notify(ObjectCreatedEvent(adapter))
+            if locate:
+                zope_locate(adapter, context if parent is None else parent, name)
+            if callback:
+                callback(adapter)
     return adapter
--- a/src/pyams_utils/site.py	Fri May 25 17:06:43 2018 +0200
+++ b/src/pyams_utils/site.py	Tue May 29 11:13:16 2018 +0200
@@ -26,7 +26,7 @@
 
 # import packages
 from persistent.dict import PersistentDict
-from pyams_utils.adapter import adapter_config, ContextAdapter
+from pyams_utils.adapter import adapter_config, ContextAdapter, get_annotation_adapter
 from pyams_utils.registry import get_utilities_for, query_utility
 from pyramid.exceptions import NotFound
 from pyramid.path import DottedNameResolver
@@ -130,10 +130,8 @@
     if application is not None:
         try:
             hooks.setSite(application)
-            annotations = IAnnotations(application)
-            generations = annotations.get(SITE_GENERATIONS_KEY)
-            if generations is None:
-                generations = annotations[SITE_GENERATIONS_KEY] = PersistentDict()
+            generations = get_annotation_adapter(application, SITE_GENERATIONS_KEY, PersistentDict,
+                                                 notify=False, locate=False)
             for name, utility in sorted(get_utilities_for(ISiteGenerations),
                                         key=lambda x: x[1].order):
                 if not name: