[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: