[Checkins] SVN: z3c.formwidget.query/trunk/src/z3c/formwidget/query/ - Use the correct ITerms interface and implement it properly

Martin Aspeli optilude at gmx.net
Mon Aug 25 21:20:35 EDT 2008


Log message for revision 90255:
  - Use the correct ITerms interface and implement it properly
  - Resolve some confusion between value and token
  - Retain radio buttons/check boxes for the original field value on the first
    page load
  - Retain the current selection, regardless of whether it was part of the
    original field value after searching
  
  

Changed:
  U   z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt
  U   z3c.formwidget.query/trunk/src/z3c/formwidget/query/interfaces.py
  U   z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py

-=-
Modified: z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt
===================================================================
--- z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt	2008-08-26 00:38:28 UTC (rev 90254)
+++ z3c.formwidget.query/trunk/src/z3c/formwidget/query/README.txt	2008-08-26 01:20:35 UTC (rev 90255)
@@ -39,10 +39,9 @@
   ...
   ...     __contains__ = vocabulary.__contains__
   ...     __iter__ = vocabulary.__iter__
+  ...     getTerm = vocabulary.getTerm
+  ...     getTermByToken = vocabulary.getTermByToken
   ...
-  ...     def getTermByValue(self, value):
-  ...         return self.vocabulary.by_value[value]
-  ...
   ...     def search(self, query_string):
   ...         return [v for v in self if query_string.lower() in v.value.lower()]
 

Modified: z3c.formwidget.query/trunk/src/z3c/formwidget/query/interfaces.py
===================================================================
--- z3c.formwidget.query/trunk/src/z3c/formwidget/query/interfaces.py	2008-08-26 00:38:28 UTC (rev 90254)
+++ z3c.formwidget.query/trunk/src/z3c/formwidget/query/interfaces.py	2008-08-26 01:20:35 UTC (rev 90255)
@@ -1,5 +1,8 @@
-from zope.schema.interfaces import ISource, IVocabularyTokenized
+from zope.schema.interfaces import IVocabularyTokenized
 
-class IQuerySource(ISource, IVocabularyTokenized):
+class IQuerySource(IVocabularyTokenized):
+    """A source that supports searching
+    """
+    
     def search(query_string):
         """Return values that match query."""

Modified: z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py
===================================================================
--- z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py	2008-08-26 00:38:28 UTC (rev 90254)
+++ z3c.formwidget.query/trunk/src/z3c/formwidget/query/widget.py	2008-08-26 01:20:35 UTC (rev 90255)
@@ -13,25 +13,26 @@
 import z3c.form.form
 import z3c.form.field
 import z3c.form.widget
+import z3c.form.term
 import z3c.form.browser.radio
 import z3c.form.browser.checkbox
 
 from z3c.formwidget.query import MessageFactory as _
 
-class QueryTerms(SimpleVocabulary):
-    zope.interface.implements(ITerms)
+class QueryTerms(z3c.form.term.Terms):
     
-    def __init__(self, terms):
-        super(QueryTerms, self).__init__(terms)
-
-    def getTerm(self, value):
-        return self.by_value[value]
+    def __init__(self, context, request, form, field, widget, terms):
+        self.context = context
+        self.request = request
+        self.form = form
+        self.field = field
+        self.widget = widget
         
-    def getValue(self, token):
-        return self.by_token[token].value
-        
+        self.terms = SimpleVocabulary(terms)
+            
 class QuerySubForm(z3c.form.form.Form):
     zope.interface.implements(z3c.form.interfaces.ISubForm)
+    css_class = 'querySelectSearch'
 
     fields = z3c.form.field.Fields(
         zope.schema.TextLine(
@@ -67,6 +68,7 @@
         return self.field.source
 
     def update(self):
+        
         # setup query form
         prefix = self.name
         
@@ -91,23 +93,33 @@
         else:
             terms = set()
 
-        # add current selection
+        values = set([term.token for term in terms])
+        tokens = set([term.value for term in terms])
+
+        # Add current selection (a value) to terms
         selection = zope.component.getMultiAdapter(
             (self.context, self.field), z3c.form.interfaces.IDataManager).get()
 
         if not isinstance(selection, (tuple, set, list)):
             selection = (selection,)
 
-        values = [term.value for term in terms]
-
-        map(terms.add,
-            map(source.getTermByValue,
-                filter(lambda value: value and value not in values, selection)))
-        
         self.selection = selection
 
+        for value in selection:
+            if value and value not in values:
+                terms.add(source.getTerm(value))
+
+        # Add tokens in the request to terms
+        request_values = self.request.get(self.name, [])
+        if not isinstance(request_values, (tuple, set, list)):
+            request_values = (request_values,)
+
+        for token in request_values:
+            if token and token not in tokens:
+                terms.add(source.getTermByToken(token))
+
         # set terms
-        self.terms = QueryTerms(terms)
+        self.terms = QueryTerms(self.context, self.request, self.form, self.field, self, terms)
 
         # filter on extracted data
         value = self.extract()



More information about the Checkins mailing list