[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/ - incorporated rename form into folder contents form (quick and dirty without using formlib widgets)

Yvo Schubbe cvs-admin at zope.org
Thu Aug 2 08:33:22 UTC 2012


Log message for revision 127422:
  - incorporated rename form into folder contents form (quick and dirty without using formlib widgets)

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/TODO.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py
  A   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder_rename.pt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/folder.txt

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/TODO.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/TODO.txt	2012-08-01 16:27:08 UTC (rev 127421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/TODO.txt	2012-08-02 08:33:17 UTC (rev 127422)
@@ -11,22 +11,22 @@
       [x] folder_contents_template.pt -> folder_contents.pt
       [x] validateItemIds.py -> ContentsView.validate_items
       [x] validateClipboardData.py -> obsolete (show_paste checks cb_dataValid)
-      [x] folder_cut_control.py -> ContentsView.handle_cut
-      [x] folder_copy_control.py -> ContentsView.handle_copy
-      [x] folder_paste_control.py -> ContentsView.handle_paste
-      [x] folder_delete_control.py -> ContentsView.handle_delete
-      [x] folder_sort_control.py -> ContentsView.handle_sort_order
-      [x] folder_up_control.py -> ContentsView.handle_up
-      [x] folder_down_control.py -> ContentsView.handle_down
-      [x] folder_top_control.py -> ContentsView.handle_top
-      [x] folder_bottom_control.py -> ContentsView.handle_bottom
+      [x] folder_cut_control.py -> ContentsView.handle_cut_success
+      [x] folder_copy_control.py -> ContentsView.handle_copy_success
+      [x] folder_paste_control.py -> ContentsView.handle_paste_success
+      [x] folder_delete_control.py -> ContentsView.handle_delete_success
+      [x] folder_sort_control.py -> ContentsView.handle_sort_order_success
+      [x] folder_up_control.py -> ContentsView.handle_up_success
+      [x] folder_down_control.py -> ContentsView.handle_down_success
+      [x] folder_top_control.py -> ContentsView.handle_top_success
+      [x] folder_bottom_control.py -> ContentsView.handle_bottom_success
       [-] folder_filter_form.pt (structure)
       [-] filterCookie.py
       [-] clearCookie.py
 
-      [?] folder_rename_form.py
-      [?] folder_rename_control.py
-      [?] folder_rename_template.pt
+      [x] folder_rename_form.py -> ContentsView
+      [x] folder_rename_control.py -> ContentsView.handle_rename_success
+      [x] folder_rename_template.pt -> folder_rename.pt
 
   [x] IMutableMinimalDublinCore @@properties.html:
 

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py	2012-08-01 16:27:08 UTC (rev 127421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py	2012-08-02 08:33:17 UTC (rev 127422)
@@ -72,41 +72,42 @@
     """Folder contents view"""
 
     template = ViewPageTemplateFile('folder_contents.pt')
+    rename_template = ViewPageTemplateFile('folder_rename.pt')
 
     object_actions = form.Actions(
         form.Action(
-            name='rename',
+            name='select_for_rename',
             label=_(u'Rename...'),
             validator='validate_items',
-            condition='show_rename',
-            success='handle_rename',
+            condition='show_select_for_rename',
+            success='handle_select_for_rename_success',
             failure='handle_failure'),
         form.Action(
             name='cut',
             label=_(u'Cut'),
             condition='show_basic',
             validator='validate_items',
-            success='handle_cut',
+            success='handle_cut_success',
             failure='handle_failure'),
         form.Action(
             name='copy',
             label=_(u'Copy'),
             condition='show_basic',
             validator='validate_items',
-            success='handle_copy',
+            success='handle_copy_success',
             failure='handle_failure'),
         form.Action(
             name='paste',
             label=_(u'Paste'),
             condition='show_paste',
-            success='handle_paste',
+            success='handle_paste_success',
             failure='handle_failure'),
         form.Action(
             name='delete',
             label=_(u'Delete'),
             condition='show_delete',
             validator='validate_items',
-            success='handle_delete',
+            success='handle_delete_success',
             failure='handle_failure')
             )
 
@@ -116,14 +117,14 @@
             label=_(u'Up'),
             condition='is_orderable',
             validator='validate_items',
-            success='handle_up',
+            success='handle_up_success',
             failure='handle_failure'),
         form.Action(
             name='down',
             label=_(u'Down'),
             condition='is_orderable',
             validator='validate_items',
-            success='handle_down',
+            success='handle_down_success',
             failure='handle_failure')
             )
 
@@ -133,14 +134,14 @@
             label=_(u'Top'),
             condition='is_orderable',
             validator='validate_items',
-            success='handle_top',
+            success='handle_top_success',
             failure='handle_failure'),
         form.Action(
             name='bottom',
             label=_(u'Bottom'),
             condition='is_orderable',
             validator='validate_items',
-            success='handle_bottom',
+            success='handle_bottom_success',
             failure='handle_failure')
             )
 
@@ -149,11 +150,25 @@
             name='sort_order',
             label=_(u'Set as Default Sort'),
             condition='can_sort_be_changed',
-            success='handle_sort_order',
+            success='handle_sort_order_success',
             failure='handle_failure')
             )
 
-    actions = object_actions + delta_actions + absolute_actions + sort_actions
+    rename_actions = form.Actions(
+        form.Action(
+            name='rename',
+            label=_(u'Rename'),
+            validator='validate_items',
+            success='handle_rename_success',
+            failure='handle_rename_failure'),
+        form.Action(
+            name='cancel',
+            label=_(u'Cancel'),
+            validator='handle_cancel_validate',
+            success='handle_cancel_success'))
+
+    actions = (object_actions + delta_actions + absolute_actions + sort_actions
+               + rename_actions)
     form_fields = form.FormFields()
     delta_field = form.FormFields(IDeltaItem)
     description = u''
@@ -182,6 +197,18 @@
         return tuple(contents)
 
     @memoize
+    def listSelectedItems(self):
+        ids = self._get_ids()
+        contents = []
+        for item in self._getBatchObj():
+            if not item.getId() in ids:
+                continue
+            if not item.cb_isMoveable():
+                continue
+            contents.append(ContentProxy(item))
+        return tuple(contents)
+
+    @memoize
     @decode
     def up_info(self):
         """Link to the contens view of the parent object"""
@@ -252,11 +279,18 @@
     @memoize
     def _get_ids(self):
         """Identify objects that have been selected"""
-        ids = self.request.form.get('form.select_ids', [])
+        ids = self.request.form.get('{0}.select_ids'.format(self.prefix), [])
         if isinstance(ids, basestring):
             ids = [ids]
         return [ str(id) for id in ids ]
 
+    @memoize
+    def _get_new_ids(self):
+        ids = self.request.form.get('{0}.new_ids'.format(self.prefix), [])
+        if isinstance(ids, basestring):
+            ids = [ids]
+        return [ str(id) for id in ids ]
+
     #Action conditions
     @memoize
     def show_basic(self, action=None):
@@ -280,7 +314,7 @@
         return bool(self.context.cb_dataValid())
 
     @memoize
-    def show_rename(self, action=None):
+    def show_select_for_rename(self, action=None):
         if not self.show_basic():
             return False
         if not self._checkPermission(AddPortalContent):
@@ -320,16 +354,13 @@
         return errors
 
     #Action handlers
-    def handle_rename(self, action, data):
-        """Redirect to rename view passing the ids of objects to be renamed"""
-        # currently redirects to a PythonScript
-        # should be replaced with a dedicated form
-        self.request.form['ids'] = self._get_ids()
-        keys = ",".join(self._getNavigationVars().keys() + ['ids'])
-        # keys = 'b_start, ids, key, reverse'
-        return self._setRedirect('portal_types', 'object/rename_items', keys)
 
-    def handle_cut(self, action, data):
+    def handle_select_for_rename_success(self, action, data):
+        """Redirect to rename template.
+        """
+        return self.rename_template()
+
+    def handle_cut_success(self, action, data):
         """Cut the selected objects and put them in the clipboard"""
         ids = self._get_ids()
         try:
@@ -346,7 +377,7 @@
             self.status = _(u'Unauthorized: Cut failed.')
         return self._setRedirect('portal_types', 'object/folderContents')
 
-    def handle_copy(self, action, data):
+    def handle_copy_success(self, action, data):
         """Copy the selected objects to the clipboard"""
         ids = self._get_ids()
         try:
@@ -360,7 +391,7 @@
             return self.handle_failure(action, data, ())
         return self._setRedirect('portal_types', 'object/folderContents')
 
-    def handle_paste(self, action, data):
+    def handle_paste_success(self, action, data):
         """Paste the objects from the clipboard into the folder"""
         try:
             result = self.context.manage_pasteObjects(self.request['__cp'])
@@ -380,7 +411,7 @@
             return self.handle_failure(action, data, ())
         return self._setRedirect('portal_types', 'object/folderContents')
 
-    def handle_delete(self, action, data):
+    def handle_delete_success(self, action, data):
         """Delete the selected objects"""
         ids = self._get_ids()
         self.context.manage_delObjects(list(ids))
@@ -390,7 +421,7 @@
             self.status = _(u'Items deleted.')
         return self._setRedirect('portal_types', 'object/folderContents')
 
-    def handle_up(self, action, data):
+    def handle_up_success(self, action, data):
         """Move the selected objects up the selected number of places"""
         ids = self._get_ids()
         delta = data.get('delta', 1)
@@ -410,7 +441,7 @@
             return self.handle_failure(action, data, ())
         return self._setRedirect('portal_types', 'object/folderContents')
 
-    def handle_down(self, action, data):
+    def handle_down_success(self, action, data):
         """Move the selected objects down the selected number of places"""
         ids = self._get_ids()
         delta = data.get('delta', 1)
@@ -430,7 +461,7 @@
             return self.handle_failure(action, data, ())
         return self._setRedirect('portal_types', 'object/folderContents')
 
-    def handle_top(self, action, data):
+    def handle_top_success(self, action, data):
         """Move the selected objects to the top of the page"""
         ids = self._get_ids()
         subset_ids = [obj.getId()
@@ -449,7 +480,7 @@
             return self.handle_failure(action, data, ())
         return self._setRedirect('portal_types', 'object/folderContents')
 
-    def handle_bottom(self, action, data):
+    def handle_bottom_success(self, action, data):
         """Move the selected objects to the bottom of the page"""
         ids = self._get_ids()
         subset_ids = [obj.getId()
@@ -468,13 +499,41 @@
             return self.handle_failure(action, data, ())
         return self._setRedirect('portal_types', 'object/folderContents')
 
-    def handle_sort_order(self, action, data):
+    def handle_sort_order_success(self, action, data):
         """Set the sort options for the folder."""
         self.context.setDefaultSorting(*self._get_sorting())
         self.status = _(u'Default sort order changed.')
         return self._setRedirect('portal_types', 'object/folderContents')
 
+    def handle_rename_success(self, action, data):
+        """Rename objects in a folder.
+        """
+        ids = self._get_ids()
+        new_ids = self._get_new_ids()
+        if not ids == new_ids:
+            try:
+                self.context.manage_renameObjects(ids, new_ids)
+                if len(ids) == 1:
+                    self.status = _(u'Item renamed.')
+                else:
+                    self.status = _(u'Items renamed.')
+            except CopyError:
+                self.status = _(u'CopyError: Rename failed.')
+                return self.handle_rename_failure(action, data, ())
+        else:
+            self.status = self.noChangesMessage
+        return self._setRedirect('portal_types', 'object/folderContents',
+                  '{0}.b_start, {0}.sort_key, {0}.reverse'.format(self.prefix))
 
+    def handle_cancel_success(self, action, data):
+        return self._setRedirect('portal_types', 'object/folderContents',
+                  '{0}.b_start, {0}.sort_key, {0}.reverse'.format(self.prefix))
+
+    def handle_rename_failure(self, action, data, errors):
+        super(ContentsView, self).handle_failure(action, data, errors)
+        return self.rename_template()
+
+
 class FolderView(BatchViewBase):
 
     """View for IFolderish.

Added: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder_rename.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder_rename.pt	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder_rename.pt	2012-08-02 08:33:17 UTC (rev 127422)
@@ -0,0 +1,39 @@
+<html metal:use-macro="context/@@standard_macros/page">
+<body>
+
+<metal:slot metal:fill-slot="body" i18n:domain="cmf_default">
+<h1 i18n:translate="">Rename Items</h1>
+
+<form action="." method="post" tal:attributes="action request/ACTUAL_URL">
+  <tal:block repeat="widget view/hidden_widgets"
+             replace="structure widget/hidden" />
+ <table class="FormLayout">
+  <tr tal:repeat="item view/listSelectedItems">
+   <td width="8%"
+   ><img src="" alt="" border="0"
+       tal:attributes="src item/icon; alt item/type"
+       i18n:attributes="alt" /></td>
+   <td width="20%"
+   ><tal:span tal:replace="item/name">ID</tal:span>
+    <input type="hidden" name="form.select_ids" value=""
+       tal:attributes="value item/name" /></td>
+   <td width="5%"
+   ><strong i18n:translate="">to</strong></td>
+   <td
+   ><input type="text" name="form.new_ids" value=""
+       tal:attributes="value item/name" size="20" /></td>
+  </tr>
+ </table>
+<div class="form">
+<div class="clear"></div>
+
+<div class="buttons">
+ <tal:loop tal:repeat="action view/rename_actions"
+    tal:replace="structure action/render" />
+</div>
+</div>
+</form>
+</metal:slot>
+
+</body>
+</html>


Property changes on: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder_rename.pt
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/folder.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/folder.txt	2012-08-01 16:27:08 UTC (rev 127421)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/folder.txt	2012-08-02 08:33:17 UTC (rev 127422)
@@ -224,3 +224,11 @@
     True
     >>> '[[cmf_default][Set as Default Sort]]' in browser.contents
     False
+
+Select 'Members' subfolder for renaming:
+
+    >>> browser.open('http://localhost/site/@@edit.html')
+    >>> browser.getControl(name='form.select_ids').value = ('Members',)
+    >>> browser.getControl('[[cmf_default][Rename...]]').click()
+    >>> '[[cmf_default][Rename Items]]' in browser.contents
+    True



More information about the checkins mailing list