[silva.core.references][Sylvain Viollon] Potentially improve per...

[email protected] Mon, 11 Nov 2013 14:48:47 +0100
Newsgroups gmane.comp.web.zope.silva.cvs
Message-ID <[email protected]>
author:    Sylvain Viollon
date:      Mon Nov 11 14:48:43 2013 +0100
revision:  316:2c55eae09d13 in silva.core.references
branch:    2.4
details:   https://hg.infrae.com/silva.core.references?cmd=changeset;node=2c55eae09d13
modified:  src/silva/core/references/reference.py src/silva/core/references/widgets/formulator.py
added:     
removed:   
log:       Potentially improve performances (get_content_id and
	get_content_from_id no longer calls getUtility).


diffstat:

 src/silva/core/references/reference.py          |  47 +++++++++++++++++-------
 src/silva/core/references/widgets/formulator.py |   8 ++--
 2 files changed, 36 insertions(+), 19 deletions(-)

diffs (116 lines):

diff -r 533c064d4c7f -r 2c55eae09d13 src/silva/core/references/reference.py
--- a/src/silva/core/references/reference.py	Mon Nov 11 11:48:17 2013 +0100
+++ b/src/silva/core/references/reference.py	Mon Nov 11 14:48:43 2013 +0100
@@ -11,12 +11,14 @@
 from dolmen.relations.events import RelationModifiedEvent
 from dolmen.relations.values import TaggedRelationValue
 from five import grok
-from zope import component, interface, schema
+from zope import schema
+from zope.component import getUtility
 from zope.event import notify
 from zope.intid.interfaces import IIntIds
 
 from silva.core.interfaces import IContainerManager
 from silva.core.interfaces import IReferable
+from silva.core.services.delayed import Task
 
 from .utils import is_inside_container
 from .utils import relative_path
@@ -25,31 +27,46 @@
 from .interfaces import IReference, IReferenceService
 
 
+class ResolverTask(Task):
+
+    def __init__(self):
+        service = getUtility(IIntIds)
+        self._get_identifier = service.register
+        self._get_content = service.getObject
+
+    def get_content_id(self, content):
+        if content is None:
+            return 0
+        return self._get_identifier(content)
+
+    def get_content_from_id(self, content_id):
+        if content_id == 0:
+            return None
+        try:
+            return self._get_content(content_id)
+        except KeyError:
+            return None
+
+    def copy(self):
+        return ResolverTask()
+
+
 def get_content_id(content):
     """Return the ID of a content.
     """
-    if content is None:
-        return 0
-    utility = component.getUtility(IIntIds)
-    return utility.register(content)
+    return ResolverTask.get().get_content_id(content)
 
 
 def get_content_from_id(content_id):
     """Return a content from its ID.
     """
-    if content_id == 0:
-        return None
-    utility = component.getUtility(IIntIds)
-    try:
-        return utility.getObject(int(content_id))
-    except KeyError:
-        return None
+    return ResolverTask.get().get_content_from_id(content_id)
 
 
 class Reference(schema.Object):
     """Store a reference to an object.
     """
-    interface.implements(IReference)
+    grok.implements(IReference)
 
     missing_value = None
     multiple = False
@@ -68,7 +85,7 @@
 class ReferenceValue(TaggedRelationValue):
     """Store a reference information.
     """
-    interface.implements(IReferenceValue)
+    grok.implements(IReferenceValue)
 
     security = ClassSecurityInfo()
     security.declareProtected('View', 'target')
@@ -154,7 +171,7 @@
         self._source = source
         self._factory = factory
         self._name = unicode(name)
-        self._service = component.getUtility(IReferenceService)
+        self._service = getUtility(IReferenceService)
 
     def get_references(self):
         return self._service.get_references_from(
diff -r 533c064d4c7f -r 2c55eae09d13 src/silva/core/references/widgets/formulator.py
--- a/src/silva/core/references/widgets/formulator.py	Mon Nov 11 11:48:17 2013 +0100
+++ b/src/silva/core/references/widgets/formulator.py	Mon Nov 11 14:48:43 2013 +0100
@@ -135,12 +135,12 @@
 
         def convert(identifier):
             try:
-                content =  get_content_from_id(identifier)
-                if ISilvaObject.providedBy(content):
-                    return content
-                return None
+                content =  get_content_from_id(int(identifier))
             except ValueError:
                 self.raise_error('invalid_value', field)
+            if ISilvaObject.providedBy(content):
+                return content
+            return None
 
         if value:
             if multiple: