[Checkins] SVN: Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/new_folder.py Hidden variables now handled in a formlib way.

Charlie Clark charlie at begeistert.org
Tue Aug 18 17:03:26 EDT 2009


Log message for revision 102919:
  Hidden variables now handled in a formlib way.

Changed:
  U   Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/new_folder.py

-=-
Modified: Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/new_folder.py
===================================================================
--- Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/new_folder.py	2009-08-18 20:41:31 UTC (rev 102918)
+++ Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/new_folder.py	2009-08-18 21:03:25 UTC (rev 102919)
@@ -69,13 +69,14 @@
     
     b_start = Int(
         title=u"Batch start",
-        required=False)
+        required=False,
+        default=0)
         
-    key = TextLine(
+    sort_key = TextLine(
         title=u"Sort key",
         required=False)
         
-    reverse = Bool(
+    reverse = Int(
         title=u"Reverse sort order",
         required=False)
 
@@ -85,10 +86,22 @@
     """Helper class for creating batch-based views."""
 
     _BATCH_SIZE = 25
+    hidden_fields = form.FormFields(IHidden)
+    prefix = ''
+    
+    def __call__(self):
+        self.setUpWidgets()
+        return super(BatchViewBase, self).__call__()
+    
+    @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):
-        return int(self.request.form.get('b_start', 0))
+        return self._getHiddenVars().get('b_start', 0)
 
     @memoize
     def _getBatchObj(self):
@@ -98,23 +111,35 @@
 
     @memoize
     def _getHiddenVars(self):
-        return {}
+        data = {}
+        form.getWidgetsData(self.hidden_widgets, self.prefix, data)
+        return data
 
     @memoize
     def _getNavigationVars(self):
         return self._getHiddenVars()
+    
+    @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):
+    def _getNavigationURL(self, b_start=None):
         target = self._getViewURL()
         kw = self._getNavigationVars().copy()
+        if 'bstart' not in kw:
+            kw['b_start'] = b_start
 
-        kw['b_start'] = b_start
         for k, v in kw.items():
             if not v or k == 'portal_status_message':
-                del kw[k]
+                pass
+            else:
+                new_key = self.expand_prefix(k)
+                kw[new_key] = v
+            del kw[k]
 
-        query = kw and ('?%s' % make_query(kw)) or ''
+        query = kw and ('?%s' % urllib.urlencode(kw)) or ''
         return u'%s%s' % (target, query)
 
     # interface
@@ -180,8 +205,6 @@
 
     def page_range(self):
         """Create a range of up to ten pages around the current page"""
-        url = self._getViewURL()
-        batch_query = '%s?b_start:int=%s'
         pages = [(idx + 1, b_start) for idx, b_start in enumerate(
                     range(0, 
                         self._getBatchObj().sequence_length, 
@@ -192,8 +215,11 @@
         range_stop = min(max(self.page_number() + 5, 10), len(pages))
         _page_range = []
         for page, b_start in pages[range_start:range_stop]:
-            _page_range.append({'number':page, 
-            'url':batch_query % (url, b_start)})
+            _page_range.append(
+                {'number':page, 
+                 'url':self._getNavigationURL(b_start)
+                }
+                              )
         return _page_range
 
     @memoize
@@ -228,6 +254,7 @@
     """Folder contents view"""
     
     template = ViewPageTemplateFile('templates/contents.pt')
+    prefix = 'form'
     
     object_actions = form.Actions(
         form.Action(
@@ -305,7 +332,6 @@
     
     def __init__(self, *args, **kw):
         super(ContentsView, self).__init__(*args, **kw)
-        self.hidden_fields = form.FormFields(IHidden)
         self.form_fields = form.FormFields()
         self.delta_field = form.FormFields(IDeltaItem)
         self.contents = self.context.contentValues()
@@ -337,13 +363,10 @@
         
     def setUpWidgets(self, ignore_request=False):
         """Create widgets for the folder contents."""
+        super(ContentsView, self).setUpWidgets(ignore_request)
         data = {}
         for i in self.contents:
-            data['%s.name' %i.id] = i.getId()
-        self.hidden_widgets = form.setUpDataWidgets(
-                self.hidden_fields, "", self.context,
-                self.request, data=self._getHiddenVars(),
-                        ignore_request=ignore_request)
+            data['%s.name' % i.id] = i.getId()
         self.widgets = form.setUpDataWidgets(
                 self.form_fields, self.prefix, self.context,
                 self.request, data=data, ignore_request=ignore_request)
@@ -354,40 +377,42 @@
     @memoize
     def _get_sorting(self):
         """How should the contents be sorted"""
-        key = self.request.form.get('key', None)
+        data = self._getHiddenVars()
+        key = data.get('sort_key')
         if key:
-            return (key, self.request.form.get('reverse', 0))
+            return (key, data.get('reverse', 0))
         else:
             return self.context.getDefaultSorting()
             
     @memoize
-    def _is_default_sorting(self):
+    def _is_default_sorting(self,):
         return self._get_sorting() == self.context.getDefaultSorting()
-    
+        
     @memoize
     def column_headings(self):
         key, reverse = self._get_sorting()
-        columns = ( {'key': 'Type',
+        columns = ( {'sort_key': 'Type',
                      'title': _(u'Type'),
                      'colspan': '2'}
-                  , {'key': 'getId',
+                  , {'sort_key': 'getId',
                      'title': _(u'Name')}
-                  , {'key': 'modified',
+                  , {'sort_key': 'modified',
                      'title': _(u'Last Modified')}
-                  , {'key': 'position',
+                  , {'sort_key': 'position',
                      'title': _(u'Position')}
                   )
         for column in columns:
-            if key == column['key'] and not reverse and key != 'position':
-                query = make_query(key=column['key'], reverse=1)
-            else:
-                query = make_query(key=column['key'])
+            paras = {'hidden.sort_key':column['sort_key']}
+            if key == column['sort_key'] \
+            and not reverse and key != 'position':
+                paras['hidden.reverse'] = 1
+            query = urllib.urlencode(paras)
             column['url'] = '%s?%s' % (self._getViewURL(), query)
         return tuple(columns)
         
     @memoize
     def _get_items(self):
-        (key, reverse) = self._get_sorting()
+        key, reverse = self._get_sorting()
         items = self.contents
         return sequence.sort(items,
                              ((key, 'cmp', reverse and 'desc' or 'asc'),))
@@ -421,13 +446,6 @@
                             and k.split(".")[-1] == 'select']
         return ids
 
-    @memoize    
-    def _getHiddenVars(self):
-        b_start = self._getBatchStart()
-        is_default = self._is_default_sorting()
-        (key, reverse) = is_default and ('', 0) or self._get_sorting()
-        return {'b_start': b_start, 'key': key, 'reverse': reverse}
-    
     #Action conditions
     @memoize
     def has_subobjects(self, action=None):



More information about the Checkins mailing list