[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