[Checkins] SVN: z3c.form/trunk/src/z3c/form/ Optimized the way terms are used in the converter. Instead of looking up

Stephan Richter srichter at cosmos.phy.tufts.edu
Wed Jul 4 13:22:00 EDT 2007


Log message for revision 77415:
  Optimized the way terms are used in the converter. Instead of looking up 
  the terms itself, the converter now uses the terms of the widget. This 
  is particularly helpful in scenarios where it is expensive to look up 
  the terms.
  

Changed:
  U   z3c.form/trunk/src/z3c/form/converter.py
  U   z3c.form/trunk/src/z3c/form/converter.txt
  U   z3c.form/trunk/src/z3c/form/interfaces.py
  U   z3c.form/trunk/src/z3c/form/widget.py

-=-
Modified: z3c.form/trunk/src/z3c/form/converter.py
===================================================================
--- z3c.form/trunk/src/z3c/form/converter.py	2007-07-04 16:48:13 UTC (rev 77414)
+++ z3c.form/trunk/src/z3c/form/converter.py	2007-07-04 17:21:59 UTC (rev 77415)
@@ -246,9 +246,7 @@
         if value is self.field.missing_value:
             return []
         # Look up the term in the terms
-        terms = zope.component.getMultiAdapter(
-            (widget.context, widget.request, widget.form, self.field, widget),
-             interfaces.ITerms)
+        terms = widget.updateTerms()
         return [terms.getTerm(value).token]
 
     def toFieldValue(self, value):
@@ -256,10 +254,8 @@
         widget = self.widget
         if not len(value) or value[0] == widget.noValueToken:
             return self.field.missing_value
-        terms = zope.component.getMultiAdapter(
-            (widget.context, widget.request, widget.form, self.field, widget),
-             interfaces.ITerms)
-        return terms.getValue(value[0])
+        terms = widget.updateTerms()
+        return widget.terms.getValue(value[0])
 
 
 class CollectionSequenceDataConverter(BaseDataConverter):
@@ -271,18 +267,16 @@
     def toWidgetValue(self, value):
         """Convert from Python bool to HTML representation."""
         widget = self.widget
-        terms = zope.component.getMultiAdapter(
-            (widget.context, widget.request, widget.form, self.field, widget),
-             interfaces.ITerms)
-        return [terms.getTerm(entry).token for entry in value]
+        if not widget.terms:
+            widget.updateTerms()
+        return [widget.terms.getTerm(entry).token for entry in value]
 
     def toFieldValue(self, value):
         """See interfaces.IDataConverter"""
         widget = self.widget
-        terms = zope.component.getMultiAdapter(
-            (widget.context, widget.request, widget.form, self.field, widget),
-             interfaces.ITerms)
+        if not widget.terms:
+            widget.updateTerms()
         collectionType = self.field._type
         if isinstance(collectionType, tuple):
             collectionType = collectionType[-1]
-        return collectionType([terms.getValue(token) for token in value])
+        return collectionType([widget.terms.getValue(token) for token in value])

Modified: z3c.form/trunk/src/z3c/form/converter.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/converter.txt	2007-07-04 16:48:13 UTC (rev 77414)
+++ z3c.form/trunk/src/z3c/form/converter.txt	2007-07-04 17:21:59 UTC (rev 77415)
@@ -464,6 +464,7 @@
 
   >>> from z3c.form import widget
   >>> seqWidget = widget.SequenceWidget(TestRequest())
+  >>> seqWidget.field = gender
 
 We now use the field and widget to instantiate the converter:
 
@@ -517,6 +518,7 @@
 
   >>> genders = zope.schema.List(value_type=gender)
   >>> seqWidget = widget.SequenceWidget(TestRequest())
+  >>> seqWidget.field = genders
 
 We now use the field and widget to instantiate the converter:
 
@@ -540,6 +542,7 @@
 
   >>> genders = zope.schema.Set(value_type=gender)
   >>> seqWidget = widget.SequenceWidget(TestRequest())
+  >>> seqWidget.field = genders
 
   >>> csdv = converter.CollectionSequenceDataConverter(genders, seqWidget)
 

Modified: z3c.form/trunk/src/z3c/form/interfaces.py
===================================================================
--- z3c.form/trunk/src/z3c/form/interfaces.py	2007-07-04 16:48:13 UTC (rev 77414)
+++ z3c.form/trunk/src/z3c/form/interfaces.py	2007-07-04 17:21:59 UTC (rev 77415)
@@ -355,6 +355,14 @@
         description=_('A component that provides the options for selection.'),
         schema=ITerms)
 
+    def updateTerms():
+        """Update the widget's ``terms`` attribute and return the terms.
+
+        This method can be used by external components to get the terms
+        without having to worry whether they are already created or not.
+        """
+
+
 class ISelectWidget(ISequenceWidget):
     """Select widget with ITerms option."""
 

Modified: z3c.form/trunk/src/z3c/form/widget.py
===================================================================
--- z3c.form/trunk/src/z3c/form/widget.py	2007-07-04 16:48:13 UTC (rev 77414)
+++ z3c.form/trunk/src/z3c/form/widget.py	2007-07-04 17:21:59 UTC (rev 77415)
@@ -167,13 +167,17 @@
                 value.append(term.token)
         return value
 
-    def update(self):
-        """See z3c.form.interfaces.IWidget."""
-        # Create terms first, since we need them for the generic update.
+    def updateTerms(self):
         if self.terms is None:
             self.terms = zope.component.getMultiAdapter(
                 (self.context, self.request, self.form, self.field, self),
                 interfaces.ITerms)
+        return self.terms
+
+    def update(self):
+        """See z3c.form.interfaces.IWidget."""
+        # Create terms first, since we need them for the generic update.
+        self.updateTerms()
         super(SequenceWidget, self).update()
 
     def extract(self, default=interfaces.NOVALUE):



More information about the Checkins mailing list