[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