[Checkins] SVN: z3c.searcher/trunk/ - Bugfix: Criterium didn't get correct located in SearchFilter. The criterium

Roger Ineichen roger at projekt01.ch
Sat Sep 19 18:20:58 EDT 2009


Log message for revision 104369:
  - Bugfix: Criterium didn't get correct located in SearchFilter. The criterium
    __name__ was allways an empty unicode value.
  - Bugfix: The criterim filter didn't work with more then one criterium used.
    The search form now locates the filter form and will set a individual prefix
    for the criterium form. 
  - adjust tests, reflect latest changes and fix element attribute order which
    get changed in z3c.form
  - prepare for release

Changed:
  U   z3c.searcher/trunk/CHANGES.txt
  U   z3c.searcher/trunk/setup.py
  U   z3c.searcher/trunk/src/z3c/searcher/README.txt
  U   z3c.searcher/trunk/src/z3c/searcher/criterium.pt
  U   z3c.searcher/trunk/src/z3c/searcher/filter.py
  U   z3c.searcher/trunk/src/z3c/searcher/form.py
  U   z3c.searcher/trunk/src/z3c/searcher/interfaces.py

-=-
Modified: z3c.searcher/trunk/CHANGES.txt
===================================================================
--- z3c.searcher/trunk/CHANGES.txt	2009-09-19 21:10:16 UTC (rev 104368)
+++ z3c.searcher/trunk/CHANGES.txt	2009-09-19 22:20:58 UTC (rev 104369)
@@ -2,12 +2,22 @@
 CHANGES
 =======
 
-0.5.3 (unreleased)
+0.6.0 (2009-09-20)
 ------------------
 
-- ...
+- Bugfix: Criterium didn't get correct located in SearchFilter. The criterium
+  __name__ was allways an empty unicode value.
 
+- Bugfix: The criterim filter didn't work with more then one criterium used.
+  The search form now locates the filter form and will set a individual prefix
+  for the criterium form. If you use a custom criterium form, you probably 
+  have to review your custom implementation. Especialy review the prefix setup
+  in the setupCriteriumRows method.
 
+- adjust tests, reflect latest changes and fix element attribute order which
+  get changed in z3c.form
+
+
 0.5.2 (2009-03-10)
 ------------------
 

Modified: z3c.searcher/trunk/setup.py
===================================================================
--- z3c.searcher/trunk/setup.py	2009-09-19 21:10:16 UTC (rev 104368)
+++ z3c.searcher/trunk/setup.py	2009-09-19 22:20:58 UTC (rev 104369)
@@ -23,7 +23,7 @@
 
 setup (
     name='z3c.searcher',
-    version='0.5.3dev',
+    version='0.6.0',
     author = "Roger Ineichen and the Zope Community",
     author_email = "zope-dev at zope.org",
     description = "Persistent and session based search form for Zope3",

Modified: z3c.searcher/trunk/src/z3c/searcher/README.txt
===================================================================
--- z3c.searcher/trunk/src/z3c/searcher/README.txt	2009-09-19 21:10:16 UTC (rev 104368)
+++ z3c.searcher/trunk/src/z3c/searcher/README.txt	2009-09-19 22:20:58 UTC (rev 104369)
@@ -450,6 +450,7 @@
 
 Criterium Form
 --------------
+
 Now we will show you how the form part is working. Each criterium can render 
 itself within a form. We offer a CriteriumForm class for doing this. Let's
 create and render such a criterium form:
@@ -460,6 +461,15 @@
   >>> criteriumRow
   <z3c.searcher.form.CriteriumForm object at ...>
 
+We also need to set a prefix, this is normaly done by the search form by
+calling setupCriteriumRows. And normaly the criterium is located in the search
+filter. We just need a criterium __name__ for now:
+
+  >>> textCriterium.__name__ = u'1'
+  >>> criteriumRow.prefix = 'form.criterium.%s' % str(textCriterium.__name__)
+  >>> criteriumRow.prefix
+  'form.criterium.1'
+
 Before we can render the form, we need to register the templates:
 
   >>> from zope.configuration import xmlconfig
@@ -521,41 +531,45 @@
       <b>matches</b>
     </td>
     <td style="padding-right:5px;">
-      <input type="text" id="form-widgets-value"
-         name="form.widgets.value"
-         class="text-widget required textline-field" value="" />
-      <span class="option">
-    <label for="form-widgets-connectorName-0">
-      <input type="radio" id="form-widgets-connectorName-0"
-             name="form.widgets.connectorName:list"
+      <input id="form-criterium-1-widgets-value"
+             name="form.criterium.1.widgets.value"
+             class="text-widget required textline-field"
+             value="" type="text" />
+  <span class="option">
+    <label for="form-criterium-1-widgets-connectorName-0">
+      <input id="form-criterium-1-widgets-connectorName-0"
+             name="form.criterium.1.widgets.connectorName:list"
              class="radio-widget required choice-field"
-             value="OR" checked="checked" />
+             value="OR" checked="checked" type="radio" />
       <span class="label">or</span>
     </label>
-  </span><span class="option">
-    <label for="form-widgets-connectorName-1">
-      <input type="radio" id="form-widgets-connectorName-1"
-             name="form.widgets.connectorName:list"
+  </span>
+  <span class="option">
+    <label for="form-criterium-1-widgets-connectorName-1">
+      <input id="form-criterium-1-widgets-connectorName-1"
+             name="form.criterium.1.widgets.connectorName:list"
              class="radio-widget required choice-field"
-             value="AND" />
+             value="AND" type="radio" />
       <span class="label">and</span>
     </label>
-  </span><span class="option">
-    <label for="form-widgets-connectorName-2">
-      <input type="radio" id="form-widgets-connectorName-2"
-             name="form.widgets.connectorName:list"
+  </span>
+  <span class="option">
+    <label for="form-criterium-1-widgets-connectorName-2">
+      <input id="form-criterium-1-widgets-connectorName-2"
+             name="form.criterium.1.widgets.connectorName:list"
              class="radio-widget required choice-field"
-             value="NOT" />
+             value="NOT" type="radio" />
       <span class="label">not</span>
     </label>
   </span>
-  <input name="form.widgets.connectorName-empty-marker"
+  <input name="form.criterium.1.widgets.connectorName-empty-marker"
          type="hidden" value="1" />
     </td>
     <td style="padding-right:5px;">
-      <input type="submit" id="form-buttons-remove"
-         name="form.buttons.remove"
-         class="submit-widget button-field" value="Remove" />
+  <input id="form-criterium-1-buttons-remove"
+         name="form.criterium.1.buttons.remove"
+         class="submit-widget button-field" value="Remove"
+         type="submit" />
     </td>
   </tr>
 
@@ -590,17 +604,20 @@
     <select name="filterformnewCriterium" size="1">
       <option value="fullText">fullText</option>
     </select>
-    <input type="submit" id="filterform-buttons-add"
-           name="filterform.buttons.add"
-           class="submit-widget button-field" value="Add" />
+  <input id="filterform-buttons-add"
+         name="filterform.buttons.add"
+         class="submit-widget button-field" value="Add"
+         type="submit" />
   </div>
   <div>
-    <input type="submit" id="filterform-buttons-search"
-           name="filterform.buttons.search"
-           class="submit-widget button-field" value="Search" />
-    <input type="submit" id="filterform-buttons-clear"
-           name="filterform.buttons.clear"
-           class="submit-widget button-field" value="Clear" />
+  <input id="filterform-buttons-search"
+         name="filterform.buttons.search"
+         class="submit-widget button-field" value="Search"
+         type="submit" />
+  <input id="filterform-buttons-clear"
+         name="filterform.buttons.clear"
+         class="submit-widget button-field" value="Clear"
+         type="submit" />
   </div>
   </fieldset>
 
@@ -632,10 +649,6 @@
         enctype="multipart/form-data" class="edit-form"
         name="form" id="form">
     <div class="viewspace">
-        <div class="required-info">
-           <span class="required">*</span>
-           &ndash; required
-        </div>
       <div>
     <fieldset>
   <legend>Filter</legend>
@@ -646,17 +659,20 @@
     <select name="filterformnewCriterium" size="1">
       <option value="fullText">fullText</option>
     </select>
-    <input type="submit" id="filterform-buttons-add"
-           name="filterform.buttons.add"
-           class="submit-widget button-field" value="Add" />
+  <input id="filterform-buttons-add"
+         name="filterform.buttons.add"
+         class="submit-widget button-field" value="Add"
+         type="submit" />
   </div>
   <div>
-    <input type="submit" id="filterform-buttons-search"
-           name="filterform.buttons.search"
-           class="submit-widget button-field" value="Search" />
-    <input type="submit" id="filterform-buttons-clear"
-           name="filterform.buttons.clear"
-           class="submit-widget button-field" value="Clear" />
+  <input id="filterform-buttons-search"
+         name="filterform.buttons.search"
+         class="submit-widget button-field" value="Search"
+         type="submit" />
+  <input id="filterform-buttons-clear"
+         name="filterform.buttons.clear"
+         class="submit-widget button-field" value="Clear"
+         type="submit" />
   </div>
   </fieldset>
     </div>
@@ -698,10 +714,6 @@
         enctype="multipart/form-data" class="edit-form"
         name="formTable" id="formTable">
     <div class="viewspace">
-        <div class="required-info">
-           <span class="required">*</span>
-           &ndash; required
-        </div>
       <div>
       <div class="filterForm">
         <fieldset>
@@ -713,17 +725,20 @@
     <select name="filterformnewCriterium" size="1">
       <option value="fullText">fullText</option>
     </select>
-    <input type="submit" id="filterform-buttons-add"
+  <input id="filterform-buttons-add"
          name="filterform.buttons.add"
-         class="submit-widget button-field" value="Add" />
+         class="submit-widget button-field" value="Add"
+         type="submit" />
   </div>
   <div>
-    <input type="submit" id="filterform-buttons-search"
+  <input id="filterform-buttons-search"
          name="filterform.buttons.search"
-         class="submit-widget button-field" value="Search" />
-    <input type="submit" id="filterform-buttons-clear"
+         class="submit-widget button-field" value="Search"
+         type="submit" />
+  <input id="filterform-buttons-clear"
          name="filterform.buttons.clear"
-         class="submit-widget button-field" value="Clear" />
+         class="submit-widget button-field" value="Clear"
+         type="submit" />
   </div>
   </fieldset>
       </div>

Modified: z3c.searcher/trunk/src/z3c/searcher/criterium.pt
===================================================================
--- z3c.searcher/trunk/src/z3c/searcher/criterium.pt	2009-09-19 21:10:16 UTC (rev 104368)
+++ z3c.searcher/trunk/src/z3c/searcher/criterium.pt	2009-09-19 22:20:58 UTC (rev 104369)
@@ -11,6 +11,6 @@
     <tal:block replace="structure view/widgets/connectorName/render" />
   </td>
   <td style="padding-right:5px;">
-	<input tal:replace="structure view/actions/remove/render" />
+    <input tal:replace="structure view/actions/remove/render" />
   </td>
 </tr>

Modified: z3c.searcher/trunk/src/z3c/searcher/filter.py
===================================================================
--- z3c.searcher/trunk/src/z3c/searcher/filter.py	2009-09-19 21:10:16 UTC (rev 104368)
+++ z3c.searcher/trunk/src/z3c/searcher/filter.py	2009-09-19 22:20:58 UTC (rev 104369)
@@ -45,9 +45,12 @@
     """
     zope.interface.implements(interfaces.ISearchFilter)
 
+    counter = 0
+
     def __init__(self):
         super(SearchFilter, self).__init__()
         self.criteria = persistent.list.PersistentList()
+        self.counter = 0
 
     def clear(self):
         """See interfaces.ISearchFilter"""
@@ -66,13 +69,13 @@
             self, interfaces.ISearchCriteriumFactory, name=name)()
         if value is not interfaces.NOVALUE:
             criterium.value = value
-        criterium.__name__ = name
         criterium.__parent__ = self
         return criterium
 
     def addCriterium(self, criterium):
         """See interfaces.ISearchFilter"""
-        location.locate(criterium, self)
+        self.counter += 1
+        location.locate(criterium, self, unicode(self.counter))
         self.criteria.append(criterium)
 
     def createAndAddCriterium(self, name, value=interfaces.NOVALUE):

Modified: z3c.searcher/trunk/src/z3c/searcher/form.py
===================================================================
--- z3c.searcher/trunk/src/z3c/searcher/form.py	2009-09-19 21:10:16 UTC (rev 104368)
+++ z3c.searcher/trunk/src/z3c/searcher/form.py	2009-09-19 22:20:58 UTC (rev 104369)
@@ -95,7 +95,7 @@
     prefix = 'filterform'
     ignoreContext = True
     criteriumRows = []
-    searchFilter = None
+    rowName = 'row'
 
     # The filterName is used in the ISearchSession to identify filter
     filterName = 'searchFilter'
@@ -113,6 +113,11 @@
         """
         return interfaces.SEARCH_SESSION_FILTER_KEY
 
+    @property
+    def addCriteriumName(self):
+        return self.prefix + '-add'
+
+    @property
     def criteriumFactories(self):
         for name, factory in self.searchFilter.criteriumFactories:
             yield {'name': name, 'title': factory.title}
@@ -147,34 +152,34 @@
     def setupCriteriumRows(self):
         self.criteriumRows = []
         append = self.criteriumRows.append
-        index = 0
         for criterium in self.searchFilter.criteria:
             row = zope.component.getMultiAdapter(
-                (criterium, self.request), name='row')
-            row.prefix = str(index)
+                (criterium, self.request), name=self.rowName)
+            row.__name__ = row.criteriumName
+            row.prefix = '%s.criterium.%s' % (self.prefix,
+                str(row.criteriumName))
             row.update()
             append(row)
-            index += 1
 
     def update(self):
         self.setupCriteriumRows()
         super(FilterForm, self).update()
 
-    @button.buttonAndHandler(u'Add')
+    @button.buttonAndHandler(_(u'Add'), name='add')
     def handleAdd(self, action):
-        name = self.request.get(self.prefix + 'newCriterium', None)
+        name = self.request.get(self.addCriteriumName, None)
         if name is not None:
             self.searchFilter.createAndAddCriterium(name)
             self.setupCriteriumRows()
             self.status = _('New criterium added.')
 
-    @button.buttonAndHandler(u'Clear', name='clear')
+    @button.buttonAndHandler(_(u'Clear'), name='clear')
     def handleClear(self, action):
         self.searchFilter.clear()
         self.setupCriteriumRows()
         self.status = _('Criteria cleared.')
 
-    @button.buttonAndHandler(u'Search', name='search')
+    @button.buttonAndHandler(_(u'Search'), name='search')
     def handleSearch(self, action):
         data, errors = self.widgets.extract()
         for row in self.criteriumRows:

Modified: z3c.searcher/trunk/src/z3c/searcher/interfaces.py
===================================================================
--- z3c.searcher/trunk/src/z3c/searcher/interfaces.py	2009-09-19 21:10:16 UTC (rev 104368)
+++ z3c.searcher/trunk/src/z3c/searcher/interfaces.py	2009-09-19 22:20:58 UTC (rev 104369)
@@ -189,13 +189,65 @@
         """Generate a query object."""
 
 
+class ICriteriumForm(IForm):
+    """Criterium form."""
+
+    criteriumName = zope.schema.Field(
+        title=_('Criterium name'),
+        description=_('The criterium name'),
+        required=True)
+
+    def save():
+        """Save criterium changes."""
+
+
 class IFilterForm(IForm):
     """Filter form."""
 
+    criteriumRows = zope.schema.List(
+        title=_('List of criterium forms'),
+        description=_('A list of criterium forms'),
+        value_type=zope.schema.Field(
+            title=_('Criterium form'),
+            description=_('Criterium form'),
+            required=True
+            ),
+        default=[],
+        required=False)
 
+    rowName = zope.schema.Field(
+        title=_('Row name'),
+        description=_('The row name used for lookup row forms.'),
+        required=True)
+
+    filterKey = zope.schema.Field(
+        title=_('Seach filter key'),
+        description=_('The search filter annotation key.'),
+        required=True,
+        default=SEARCH_SESSION_FILTER_KEY)
+
+    addCriteriumName = zope.schema.Field(
+        title=_('Add criterium name'),
+        description=_('The name used for identify add criterium action.'),
+        required=True)
+
+    criteriumFactories = zope.schema.Dict(
+        title=_('Name criterium factory dictionary'),
+        description=_('The name criterium factory dictionary'),
+        required=True,
+        default={})
+
+    searchFilter = zope.schema.Field(
+        title=_('Search filter class'),
+        description=_('The search filter class'),
+        required=False)
+
+    def setupCriteriumRows():
+        """Setup criterium row forms."""
+
+
 class ISearchForm(IForm):
     """Search form."""
 
-
 class ISearchTable(ITable):
     """Search table."""



More information about the checkins mailing list