[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/search/ Search functions now match PythonScript and batching is supported.

Charlie Clark charlie at begeistert.org
Mon Oct 11 14:21:29 EDT 2010


Log message for revision 117457:
  Search functions now match PythonScript and batching is supported.

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/search/interfaces.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.pt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/search/interfaces.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/search/interfaces.py	2010-10-11 14:43:28 UTC (rev 117456)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/search/interfaces.py	2010-10-11 18:21:28 UTC (rev 117457)
@@ -27,46 +27,48 @@
 def status_vocab(context):
     """Provides a list of workflow states"""
     catalog = getToolByName(context, 'portal_catalog')
-    values = [(u'--any--', "None")]
-    values += [(v, v) for v in catalog.uniqueValuesFor('review_state')]
-    return SimpleVocabulary.fromItems(values)
+    values = [SimpleTerm(None, None, _(u"--any--"))]
+    values += [SimpleTerm(v, v, v)
+               for v in catalog.uniqueValuesFor('review_state')]
+    return SimpleVocabulary(values)
 directlyProvides(status_vocab, IContextSourceBinder)
 
 def subject_vocab(context):
     """Provides a list of subject keywords"""
     catalog = getToolByName(context, 'portal_catalog')
-    values = [(u'--any--', "None")]
-    values += [(v, v) for v in catalog.uniqueValuesFor('Subject')]
-    return SimpleVocabulary.fromItems(values)
+    values = [SimpleTerm(None, None, _(u"--any--"))]
+    values += [SimpleTerm(v, v, v)
+               for v in catalog.uniqueValuesFor('Subject')]
+    return SimpleVocabulary(values)
 directlyProvides(subject_vocab, IContextSourceBinder)
 
 def date_vocab(context):
     """Provides a list of dates for searching with"""
     mtool = getToolByName(context, 'portal_membership')
-    dates = [SimpleTerm(date(1970, 1, 1), date(1970, 1, 1), 'Ever')]
+    dates = [SimpleTerm(date(1970, 1, 1), date(1970, 1, 1), _(u'Ever'))]
     if not mtool.isAnonymousUser():
         login_time = mtool.getAuthenticatedMember().last_login_time
         if not hasattr(login_time, 'parts'):
             login_time = DateTime(login_time)
         login = date(*login_time.parts()[:3])
         dates.append(SimpleTerm(
-            login, login, 'Last login')
+            login, login, _(u'Last login'))
                      )
 
     today = date.today()
     dates.append(SimpleTerm(today - timedelta(days=1),
                             today - timedelta(days=1),
-                            u'Yesterday'
+                            _(u'Yesterday')
                             )
                  )
     dates.append(SimpleTerm(today - timedelta(days=7),
                             today - timedelta(days=7),
-                            u'Last week'
+                            _(u'Last week')
                             )
                  )
     dates.append(SimpleTerm(today - timedelta(days=31),
                             today - timedelta(days=31),
-                            u'Last month'
+                            _(u'Last month')
                             )
                  )
     return SimpleVocabulary(dates)
@@ -76,7 +78,7 @@
     """Provides a list of portal types"""
     ttool = getToolByName(context, 'portal_types')
     types = ttool.listTypeInfo()
-    terms = [SimpleTerm("None", "None", u'--any--')]
+    terms = [SimpleTerm(None, None, _(u"--any--"))]
     terms += [SimpleTerm(t.getId(), t.getId(), t.Title()) for t in types]
     return SimpleVocabulary(terms)
 directlyProvides(type_vocab, IContextSourceBinder)
@@ -94,10 +96,10 @@
                         value_type=Choice(
                             source=status_vocab
                             ),
-                        required=False
+                        required=False,
                         )
 
-    search_text = TextLine(
+    SearchableText = TextLine(
                     title=_(u"Full Text"),
                     description=_(
                         u"For a simple text search, enter your search term"
@@ -151,7 +153,7 @@
                     required=False,
                     )
 
-    creator = ASCIILine(
+    listCreators = ASCIILine(
                 title=_(u"Creator"),
                 description=_(
                     u"To find items by a particular user only, enter their"

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.pt	2010-10-11 14:43:28 UTC (rev 117456)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.pt	2010-10-11 18:21:28 UTC (rev 117457)
@@ -25,7 +25,7 @@
   </fieldset>
 
   <div class="buttons">
-    <tal:loop tal:repeat="action view/actions"
+    <tal:loop tal:repeat="action view/search"
      tal:replace="structure action/render" />
   </div>
 

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.py	2010-10-11 14:43:28 UTC (rev 117456)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.py	2010-10-11 18:21:28 UTC (rev 117457)
@@ -52,8 +52,9 @@
     form_fields['Subject'].custom_widget = ChoiceMultiSelectWidget
     form_fields['portal_type'].custom_widget = ChoiceMultiSelectWidget
     prefix = 'form'
+    _query = {}
 
-    actions = form.Actions(
+    search = form.Actions(
         form.Action(
             name='search',
             label=_(u"Search"),
@@ -62,42 +63,79 @@
             ),
         )
 
-    #def __init__(self, *args):
-        #super(Search, self).__init__(*args)
-        #self.hidden_fields += self.form_fields
+    # for handling searches from the search box
+    image = form.Actions(
+        form.Action(
+            name='search.x',
+            label=_(u"Search"),
+            success='handle_search',
+            failure='handle_failure',
+            ),
+        form.Action(
+            name='search.y',
+            label=_(u"Search"),
+            success='handle_search',
+            failure='handle_failure',
+            ),
+        )
 
+    actions = search + image
+
     @property
+    @memoize
     def catalog(self):
         return self._getTool('portal_catalog')
 
     @property
-    def types(self):
-        return self._getTool('portal_types')
+    @memoize
+    def is_anonymous(self):
+        mtool = self._getTool('portal_membership')
+        return mtool.isAnonymousUser()
 
+    @memoize
+    def _getHiddenVars(self):
+        data = {}
+        if hasattr(self, 'hidden_widgets'):
+            form.getWidgetsData(self.hidden_widgets, self.prefix, data)
+        if hasattr(self, '_query'):
+            data.update(self._query)
+        else:
+            data = self.request.form
+        return data
+
+    @property
+    @memoize
+    def search_fields(self):
+        if self.is_anonymous:
+            return self.form_fields.omit('review_state')
+        else:
+            return self.form_fields
+
     def setUpWidgets(self, ignore_request=False):
-        """Create widgets for the folder contents."""
+        if "form.b_start" in self.request.form \
+        or "b_start" in self.request.form:
+            self.template = self.results
         super(Search, self).setUpWidgets(ignore_request)
         self.widgets = form.setUpWidgets(
-                self.form_fields, self.prefix, self.context,
+                self.search_fields, self.prefix, self.context,
                 self.request, ignore_request=ignore_request)
 
     def handle_search(self, action, data):
         for k, v in data.items():
             if k in ('review_state', 'Title', 'Subject', 'Description',
-                     'portal_type', 'listCreators'):
-                if type(v) == type([]):
-                    v = filter(None, v)
-                if not v:
+                     'portal_type', 'listCreators', 'SearchableText'):
+                if not v or v == u"None":
                     del data[k]
             elif k == 'created' and v == EPOCH:
                 del data[k]
-
-        self._items = self.catalog.searchResults(data)
+        self._query = data
         self.template = self.results
 
+    @memoize
     def _get_items(self):
-        return getattr(self, '_items', ())
+        return self.catalog.searchResults(self._query)
 
+    @memoize
     def listBatchItems(self):
         return( {'description': item.Description,
            'icon': item.getIconURL,



More information about the checkins mailing list