[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/ - split up BatchViewBase: BatchFormMixin is now the special version for formlib forms

Yvo Schubbe cvs-admin at zope.org
Mon Jul 16 07:45:22 UTC 2012


Log message for revision 127344:
  - split up BatchViewBase: BatchFormMixin is now the special version for formlib forms
  - fixed Roster view

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/test_folder.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members_list.pt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/test_members.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/search/tests/test_search.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/widgets/batch.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/widgets/tests/test_batch.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py	2012-07-12 11:48:37 UTC (rev 127343)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py	2012-07-16 07:45:18 UTC (rev 127344)
@@ -29,10 +29,11 @@
 from Products.CMFCore.interfaces import IMembershipTool
 from Products.CMFDefault.browser.utils import decode
 from Products.CMFDefault.browser.utils import memoize
+from Products.CMFDefault.browser.widgets.batch import BatchFormMixin
 from Products.CMFDefault.browser.widgets.batch import BatchViewBase
 from Products.CMFDefault.exceptions import CopyError
 from Products.CMFDefault.exceptions import zExceptions_Unauthorized
-from Products.CMFDefault.formlib.form import _EditFormMixin
+from Products.CMFDefault.formlib.form import EditFormBase
 from Products.CMFDefault.permissions import AddPortalContent
 from Products.CMFDefault.permissions import DeleteObjects
 from Products.CMFDefault.permissions import ListFolderContents
@@ -61,11 +62,11 @@
         self.ModificationDate = context.ModificationDate()
 
 
-class ContentsView(BatchViewBase, _EditFormMixin, form.PageForm):
+class ContentsView(BatchFormMixin, EditFormBase):
+
     """Folder contents view"""
 
     template = ViewPageTemplateFile('folder_contents.pt')
-    prefix = 'form'
 
     object_actions = form.Actions(
         form.Action(
@@ -213,7 +214,7 @@
     @memoize
     def _get_sorting(self):
         """How should the contents be sorted"""
-        data = self._getHiddenVars()
+        data = self._getNavigationVars()
         key = data.get('sort_key')
         if key:
             return (key, data.get('reverse', 0))
@@ -321,7 +322,7 @@
         # currently redirects to a PythonScript
         # should be replaced with a dedicated form
         self.request.form['ids'] = self._get_ids(data)
-        keys = ",".join(self._getHiddenVars().keys() + ['ids'])
+        keys = ",".join(self._getNavigationVars().keys() + ['ids'])
         # keys = 'b_start, ids, key, reverse'
         return self._setRedirect('portal_types', 'object/rename_items', keys)
 
@@ -468,7 +469,7 @@
 
     @memoize
     def _get_items(self):
-        (key, reverse) = self.context.getDefaultSorting()
+        key, reverse = self.context.getDefaultSorting()
         items = self.context.contentValues()
         items = sort(items, ((key, 'cmp', reverse and 'desc' or 'asc'),))
         return LazyFilter(items, skip='View')

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/test_folder.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/test_folder.py	2012-07-12 11:48:37 UTC (rev 127343)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/test_folder.py	2012-07-16 07:45:18 UTC (rev 127344)
@@ -68,6 +68,7 @@
         url = 'http://example.com/folder_contents'
         self._make_batch()
         view = ContentsView(self.folder, TestRequest(ACTUAL_URL=url))
+        view._getNavigationVars = lambda: {}
         self.assertTrue(view._getNavigationURL(25) == url + "?form.b_start=25")
 
     def test_view(self):
@@ -81,24 +82,29 @@
 
     def test_list_batch_items(self):
         view = ContentsView(self.folder, TestRequest())
+        view._getNavigationVars = lambda: {}
         view.content_fields()
         self.assertEqual(view.listBatchItems, [])
 
     def test_is_orderable(self):
         view = ContentsView(self.folder, TestRequest())
+        view._getNavigationVars = lambda: {}
         self.assertFalse(view.is_orderable())
 
     def test_sort_can_be_changed(self):
         view = ContentsView(self.folder, TestRequest())
+        view._getNavigationVars = lambda: {}
         self.assertFalse(view.can_sort_be_changed())
 
     def test_show_basic_empty(self):
         view = ContentsView(self.folder, TestRequest())
+        view._getNavigationVars = lambda: {}
         self.assertFalse(view.show_basic())
 
     def test_show_basic(self):
         self._make_one()
         view = ContentsView(self.folder, TestRequest())
+        view._getNavigationVars = lambda: {}
         self.assertTrue(view.show_basic())
 
     def test_show_paste(self):
@@ -148,7 +154,7 @@
         url = 'http://example.com/view'
         self._make_batch()
         view = FolderView(self.folder, TestRequest(ACTUAL_URL=url))
-        self.assertTrue(view._getNavigationURL(25) == url + "?b_start=25")
+        self.assertEqual(view._getNavigationURL(25), url + "?b_start:int=25")
 
     def test_folder_has_local(self):
         self._make_one('local_pt')

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members.py	2012-07-12 11:48:37 UTC (rev 127343)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members.py	2012-07-16 07:45:18 UTC (rev 127344)
@@ -20,14 +20,14 @@
 from zope.schema import Bool
 from zope.schema import Date
 from zope.schema import TextLine
-from zope.sequencesort.ssort import sort
-from ZTUtils import LazyFilter
 
 from Products.CMFCore.interfaces import IMembershipTool
 from Products.CMFDefault.browser.utils import memoize
+from Products.CMFDefault.browser.widgets.batch import BatchFormMixin
 from Products.CMFDefault.browser.widgets.batch import BatchViewBase
 from Products.CMFDefault.browser.widgets.batch import IBatchForm
 from Products.CMFDefault.formlib.form import EditFormBase
+from Products.CMFDefault.permissions import ManageUsers
 from Products.CMFDefault.utils import Message as _
 
 
@@ -73,12 +73,11 @@
         self.widget = "%s.select" % member_id
 
 
-class Manage(BatchViewBase, EditFormBase):
+class Manage(BatchFormMixin, EditFormBase):
 
     template = ViewPageTemplateFile("members.pt")
     delete_template = ViewPageTemplateFile("members_delete.pt")
     guillotine = None
-    prefix = 'form' # required for hidden fields to work
     form_fields = form.FormFields()
     hidden_fields = form.FormFields(IBatchForm)
 
@@ -200,11 +199,6 @@
 
 class Roster(BatchViewBase):
 
-    hidden_fields = form.FormFields(IBatchForm)
-    form_fields = form.FormFields()
-    actions = ()
-    template = ViewPageTemplateFile("members_list.pt")
-
     @property
     @memoize
     def mtool(self):
@@ -212,24 +206,20 @@
 
     @memoize
     def isUserManager(self):
-        return self.mtool.checkPermission('Manage users',
-                          self.mtool.getMembersFolder()
-                                            )
+        return self.mtool.checkPermission(ManageUsers,
+                                          self.mtool.getMembersFolder())
 
     @memoize
     def _get_items(self):
-        (key, reverse) = self.context.getDefaultSorting()
-        items = self.mtool().getRoster()
-        items = sort(items, ((key, 'cmp', reverse and 'desc' or 'asc'),))
-        return LazyFilter(items, skip='View')
+        return self.mtool.getRoster()
 
-    @memoize
     def listBatchItems(self):
         members = []
-        for item in self._getBatchObj():
-            member = item
-            member['home'] = self.mtool().getHomeUrl(item['id'],
-                                verifyPermission=1)
-            member['listed'] = member['listed'] and _(u"Yes") or _("No")
-            members.append(member)
-        return members
+        for member in self._getBatchObj():
+            member_home = self.mtool.getHomeUrl(member['id'],
+                                                verifyPermission=1)
+            member_listed = member['listed'] and _(u'Yes') or _(u'No')
+            members.append({'id': member['id'],
+                            'home': member_home,
+                            'listed': member_listed})
+        return tuple(members)

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members_list.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members_list.pt	2012-07-12 11:48:37 UTC (rev 127343)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/members_list.pt	2012-07-16 07:45:18 UTC (rev 127344)
@@ -1,7 +1,7 @@
 <html metal:use-macro="context/@@standard_macros/page">
 <body>
 
-<metal:slot metal:fill-slot="body">
+<metal:slot metal:fill-slot="body" i18n:domain="cmf_default">
 
 <h2 i18n:translate="">Portal Members</h2>
 

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/test_members.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/test_members.py	2012-07-12 11:48:37 UTC (rev 127343)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/membership/tests/test_members.py	2012-07-16 07:45:18 UTC (rev 127344)
@@ -100,6 +100,7 @@
         url = 'http://example.com/members.html'
         self._make_batch()
         view = Manage(self.site, TestRequest(ACTUAL_URL=url))
+        view._getNavigationVars = lambda: {}
         self.assertTrue(view._getNavigationURL(25) == url + "?form.b_start=25")
 
     def test_view(self):
@@ -109,6 +110,7 @@
     def test_list_batch_items(self):
         self._make_one("Bob")
         view = Manage(self.site, TestRequest())
+        view._getNavigationVars = lambda: {}
         view.member_fields()
         members = view.listBatchItems
         self.assertTrue(isinstance(members[0], MemberProxy))

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.py	2012-07-12 11:48:37 UTC (rev 127343)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/search/search.py	2012-07-16 07:45:18 UTC (rev 127344)
@@ -22,7 +22,7 @@
 from Products.CMFCore.interfaces import ICatalogTool
 from Products.CMFCore.interfaces import IMembershipTool
 from Products.CMFDefault.browser.utils import memoize
-from Products.CMFDefault.browser.widgets.batch import BatchViewBase
+from Products.CMFDefault.browser.widgets.batch import BatchFormMixin
 from Products.CMFDefault.browser.widgets.batch import IBatchForm
 from Products.CMFDefault.formlib.form import EditFormBase
 from Products.CMFDefault.formlib.widgets import ChoiceMultiSelectWidget
@@ -31,7 +31,8 @@
 EPOCH = datetime.date(1970, 1, 1)
 
 
-class Search(BatchViewBase, EditFormBase):
+class Search(BatchFormMixin, EditFormBase):
+
     """Portal Search Form"""
 
     template = ViewPageTemplateFile("search.pt")
@@ -41,7 +42,6 @@
     form_fields['review_state'].custom_widget = ChoiceMultiSelectWidget
     form_fields['Subject'].custom_widget = ChoiceMultiSelectWidget
     form_fields['portal_type'].custom_widget = ChoiceMultiSelectWidget
-    prefix = 'form'
 
     search = form.Actions(
         form.Action(
@@ -82,7 +82,7 @@
         return mtool.isAnonymousUser()
 
     @memoize
-    def _getHiddenVars(self):
+    def _getNavigationVars(self):
         data = {}
         if hasattr(self, 'hidden_widgets'):
             form.getWidgetsData(self.hidden_widgets, self.prefix, data)

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/search/tests/test_search.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/search/tests/test_search.py	2012-07-12 11:48:37 UTC (rev 127343)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/search/tests/test_search.py	2012-07-16 07:45:18 UTC (rev 127344)
@@ -49,17 +49,17 @@
 
     def test_strip_unused_paramaters(self):
         view = self._getTargetClass()
-        data = {'portal_type': ['Document'], 'review_state':u"None",
-                'Subject':u"None"}
+        data = {'portal_type': ['Document'], 'review_state': u"None",
+                'Subject': u"None"}
         view.handle_search('search', data)
-        self.assertEqual(view._query, {'portal_type':['Document']})
+        self.assertEqual(view._query, {'portal_type': ['Document']})
 
     def test_add_search_vars_to_hidden(self):
         view = self._getTargetClass()
         self.assertFalse(hasattr(view, '_query'))
         data = {'portal_type': ['Document']}
         view.handle_search('search', data)
-        self.assertEqual(view._getHiddenVars(), data)
+        self.assertEqual(view._getNavigationVars(), data)
 
     def test_search_returns_results(self):
         view = self._getTargetClass()

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/widgets/batch.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/widgets/batch.py	2012-07-12 11:48:37 UTC (rev 127343)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/widgets/batch.py	2012-07-16 07:45:18 UTC (rev 127344)
@@ -10,7 +10,7 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-"""Browser views for folders.
+"""Base classes for batch views.
 """
 
 import sys
@@ -21,6 +21,7 @@
 from zope.schema import Int
 from zope.schema import TextLine
 from ZTUtils import Batch
+from ZTUtils import make_query
 
 from Products.CMFDefault.browser.utils import decode
 from Products.CMFDefault.browser.utils import memoize
@@ -56,23 +57,14 @@
 
 class BatchViewBase(ViewBase):
 
-    """ Helper class for creating batch-based views.
+    """Base class for creating batch-based views.
     """
 
     _BATCH_SIZE = 25
-    hidden_fields = form.FormFields(IBatchForm, ISortForm)
-    prefix = ''
 
     @memoize
-    def setUpWidgets(self, ignore_request=False):
-        self.hidden_widgets = form.setUpWidgets(self.hidden_fields,
-                            self.prefix, self.context, self.request,
-                            ignore_request=ignore_request)
-
-    @memoize
     def _getBatchStart(self):
-        b_start = self._getHiddenVars().get('b_start', 0)
-        return int(b_start)
+        return self._getNavigationVars().get('b_start', 0)
 
     @memoize
     def _getBatchObj(self):
@@ -81,24 +73,10 @@
         return Batch(items, self._BATCH_SIZE, b_start, orphan=0)
 
     @memoize
-    def _getHiddenVars(self):
-        data = {}
-        if hasattr(self, 'hidden_widgets'):
-            form.getWidgetsData(self.hidden_widgets, self.prefix, data)
-        else:
-            data = self.request.form
-        return data
-
-    @memoize
     def _getNavigationVars(self):
-        return self._getHiddenVars()
+        return self.request.form
 
     @memoize
-    def expand_prefix(self, key,):
-        """Return a form specific query key for use in GET strings"""
-        return "%s%s" % (form.expandPrefix(self.prefix), key)
-
-    @memoize
     def _getNavigationURL(self, b_start):
         target = self._getViewURL()
         kw = self._getNavigationVars().copy()
@@ -106,14 +84,9 @@
         kw['b_start'] = b_start
         for k, v in kw.items():
             if not v or k == 'portal_status_message':
-                pass
-            else:
-                new_key = self.expand_prefix(k)
-                if new_key != k:
-                    kw[new_key] = v
-                    del kw[k]
+                del kw[k]
 
-        query = kw and ('?%s' % urllib.urlencode(kw)) or ''
+        query = kw and ('?%s' % make_query(kw)) or ''
         return u'%s%s' % (target, query)
 
     # interface
@@ -218,4 +191,42 @@
     @memoize
     @decode
     def summary_match(self):
-        return self.request.form.get('SearchableText')
+        return self._getNavigationVars().get('SearchableText')
+
+
+class BatchFormMixin(BatchViewBase):
+
+    """Mixin class for creating batch-based forms.
+    """
+
+    hidden_fields = form.FormFields(IBatchForm, ISortForm)
+
+    @memoize
+    def _getNavigationVars(self):
+        data = {}
+        form.getWidgetsData(self.hidden_widgets, self.prefix, data)
+        return data
+
+    @memoize
+    def _getNavigationURL(self, b_start):
+        target = self._getViewURL()
+        kw = self._getNavigationVars().copy()
+
+        kw['b_start'] = b_start
+        for k, v in kw.items():
+            if not v or k == 'portal_status_message':
+                del kw[k]
+            else:
+                new_key = "%s%s" % (form.expandPrefix(self.prefix), k)
+                if new_key != k:
+                    kw[new_key] = v
+                    del kw[k]
+
+        query = kw and ('?%s' % urllib.urlencode(kw)) or ''
+        return u'%s%s' % (target, query)
+
+    @memoize
+    def setUpWidgets(self, ignore_request=False):
+        self.hidden_widgets = form.setUpWidgets(
+            self.hidden_fields, self.prefix, self.context, self.request,
+            ignore_request=ignore_request)

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/widgets/tests/test_batch.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/widgets/tests/test_batch.py	2012-07-12 11:48:37 UTC (rev 127343)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/widgets/tests/test_batch.py	2012-07-16 07:45:18 UTC (rev 127344)
@@ -18,22 +18,17 @@
 from zope.publisher.browser import TestRequest
 
 
-class BatchViewTests(unittest.TestCase):
+class BatchFormMixinTests(unittest.TestCase):
 
     def _makeOne(self, batch_size=30):
-        from Products.CMFDefault.browser.widgets.batch import BatchViewBase
-        batch = BatchViewBase(None,
+        from Products.CMFDefault.browser.widgets.batch import BatchFormMixin
+        batch = BatchFormMixin(None,
                               TestRequest(ACTUAL_URL='http://example.com'))
+        batch.prefix = 'form'
+        batch._getNavigationVars = lambda: {}
         batch._get_items = lambda: range(batch_size)
         return batch
 
-    def test_expand_prefix(self):
-        batch = self._makeOne()
-        self.assertEqual(batch.expand_prefix('key'), 'key')
-        batch = self._makeOne()
-        batch.prefix = 'form'
-        self.assertEqual(batch.expand_prefix('key'), 'form.key')
-
     def test_page_count(self):
         batch = self._makeOne()
         self.assertEqual(batch.page_count(), 2)
@@ -71,20 +66,20 @@
         batch = self._makeOne(1000)
         batch._getBatchStart = lambda: 250
         self.assertEqual(batch.navigation_previous(),
-                         {'url': u'http://example.com?b_start=225',
+                         {'url': u'http://example.com?form.b_start=225',
                           'title': u'Previous ${count} items'}
                          )
 
     def test_navigation_next(self):
         batch = self._makeOne()
         self.assertEqual(batch.navigation_next(),
-                         {'url': u'http://example.com?b_start=25',
+                         {'url': u'http://example.com?form.b_start=25',
                           'title': u'Next ${count} items'}
                          )
         batch = self._makeOne(1000)
         batch._getBatchStart = lambda: 250
         self.assertEqual(batch.navigation_next(),
-                         {'url': u'http://example.com?b_start=275',
+                         {'url': u'http://example.com?form.b_start=275',
                           'title': u'Next ${count} items'}
                          )
 
@@ -92,38 +87,38 @@
         batch = self._makeOne()
         self.assertEqual(
             batch.page_range(),
-            [{'url': u'http://example.com?b_start=0', 'number': 1},
-             {'url': u'http://example.com?b_start=25', 'number': 2}])
+            [{'url': u'http://example.com', 'number': 1},
+             {'url': u'http://example.com?form.b_start=25', 'number': 2}])
         batch = self._makeOne(1000)
         self.assertEqual(
             batch.page_range(),
-            [{'url': u'http://example.com?b_start=0', 'number': 1},
-             {'url': u'http://example.com?b_start=25', 'number': 2},
-             {'url': u'http://example.com?b_start=50', 'number': 3},
-             {'url': u'http://example.com?b_start=75', 'number': 4},
-             {'url': u'http://example.com?b_start=100', 'number': 5},
-             {'url': u'http://example.com?b_start=125', 'number': 6},
-             {'url': u'http://example.com?b_start=150', 'number': 7},
-             {'url': u'http://example.com?b_start=175', 'number': 8},
-             {'url': u'http://example.com?b_start=200', 'number': 9},
-             {'url': u'http://example.com?b_start=225', 'number': 10}])
+            [{'url': u'http://example.com', 'number': 1},
+             {'url': u'http://example.com?form.b_start=25', 'number': 2},
+             {'url': u'http://example.com?form.b_start=50', 'number': 3},
+             {'url': u'http://example.com?form.b_start=75', 'number': 4},
+             {'url': u'http://example.com?form.b_start=100', 'number': 5},
+             {'url': u'http://example.com?form.b_start=125', 'number': 6},
+             {'url': u'http://example.com?form.b_start=150', 'number': 7},
+             {'url': u'http://example.com?form.b_start=175', 'number': 8},
+             {'url': u'http://example.com?form.b_start=200', 'number': 9},
+             {'url': u'http://example.com?form.b_start=225', 'number': 10}])
         batch = self._makeOne(1000)
         batch._getBatchStart = lambda: 250
         self.assertEqual(
             batch.page_range(),
-            [{'url': u'http://example.com?b_start=150', 'number': 7},
-             {'url': u'http://example.com?b_start=175', 'number': 8},
-             {'url': u'http://example.com?b_start=200', 'number': 9},
-             {'url': u'http://example.com?b_start=225', 'number': 10},
-             {'url': u'http://example.com?b_start=250', 'number': 11},
-             {'url': u'http://example.com?b_start=275', 'number': 12},
-             {'url': u'http://example.com?b_start=300', 'number': 13},
-             {'url': u'http://example.com?b_start=325', 'number': 14},
-             {'url': u'http://example.com?b_start=350', 'number': 15},
-             {'url': u'http://example.com?b_start=375', 'number': 16}])
+            [{'url': u'http://example.com?form.b_start=150', 'number': 7},
+             {'url': u'http://example.com?form.b_start=175', 'number': 8},
+             {'url': u'http://example.com?form.b_start=200', 'number': 9},
+             {'url': u'http://example.com?form.b_start=225', 'number': 10},
+             {'url': u'http://example.com?form.b_start=250', 'number': 11},
+             {'url': u'http://example.com?form.b_start=275', 'number': 12},
+             {'url': u'http://example.com?form.b_start=300', 'number': 13},
+             {'url': u'http://example.com?form.b_start=325', 'number': 14},
+             {'url': u'http://example.com?form.b_start=350', 'number': 15},
+             {'url': u'http://example.com?form.b_start=375', 'number': 16}])
 
 
 def test_suite():
     suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(BatchViewTests))
+    suite.addTest(unittest.makeSuite(BatchFormMixinTests))
     return suite



More information about the checkins mailing list