[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/ - show buttons only if using them is allowed

Yvo Schubbe cvs-admin at zope.org
Sat Jul 7 10:02:44 UTC 2012


Log message for revision 127280:
  - show buttons only if using them is allowed

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder_contents.pt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/folder.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/test_folder.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py	2012-07-07 09:41:15 UTC (rev 127279)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder.py	2012-07-07 10:02:37 UTC (rev 127280)
@@ -35,8 +35,11 @@
 from Products.CMFDefault.exceptions import CopyError
 from Products.CMFDefault.exceptions import zExceptions_Unauthorized
 from Products.CMFDefault.formlib.form import _EditFormMixin
+from Products.CMFDefault.permissions import AddPortalContent
+from Products.CMFDefault.permissions import DeleteObjects
 from Products.CMFDefault.permissions import ListFolderContents
 from Products.CMFDefault.permissions import ManageProperties
+from Products.CMFDefault.permissions import ViewManagementScreens
 from Products.CMFDefault.utils import Message as _
 from Products.CMFDefault.utils import thousands_commas
 
@@ -224,7 +227,6 @@
         self.icon = context.icon
         self.url = context.absolute_url()
         self.ModificationDate = context.ModificationDate()
-        self.widget = "%s.select" % self.name
 
 
 class ContentsView(BatchViewBase, _EditFormMixin, form.PageForm):
@@ -238,32 +240,32 @@
             name='rename',
             label=_(u'Rename'),
             validator='validate_items',
-            condition='has_subobjects',
+            condition='show_rename',
             success='handle_rename',
             failure='handle_failure'),
         form.Action(
             name='cut',
             label=_(u'Cut'),
-            condition='has_subobjects',
+            condition='show_basic',
             validator='validate_items',
             success='handle_cut',
             failure='handle_failure'),
         form.Action(
             name='copy',
             label=_(u'Copy'),
-            condition='has_subobjects',
+            condition='show_basic',
             validator='validate_items',
             success='handle_copy',
             failure='handle_failure'),
         form.Action(
             name='paste',
             label=_(u'Paste'),
-            condition='check_clipboard_data',
+            condition='show_paste',
             success='handle_paste'),
         form.Action(
             name='delete',
             label=_(u'Delete'),
-            condition='has_subobjects',
+            condition='show_delete',
             validator='validate_items',
             success='handle_delete',
             failure='handle_failure')
@@ -318,6 +320,7 @@
 
     def content_fields(self):
         """Create content field objects only for batched items"""
+        show_widgets = self._checkPermission(ViewManagementScreens)
         f = IFolderItem['select']
         contents = []
         b_start = self._getBatchStart()
@@ -327,6 +330,10 @@
             field = form.FormField(f, 'select', item.id)
             fields += form.FormFields(field)
             content = ContentProxy(item)
+            if show_widgets:
+                content.widget = '{0}.select'.format(content.name)
+            else:
+                content.widget = None
             if key == 'position':
                 content.position = b_start + idx + 1
             else:
@@ -376,10 +383,6 @@
             return self.context.getDefaultSorting()
 
     @memoize
-    def _is_default_sorting(self,):
-        return self._get_sorting() == self.context.getDefaultSorting()
-
-    @memoize
     def column_headings(self):
         key, reverse = self._get_sorting()
         columns = ({'sort_key': 'Type',
@@ -414,27 +417,52 @@
 
     #Action conditions
     @memoize
-    def has_subobjects(self, action=None):
-        """Return false if the user cannot rename subobjects"""
+    def show_basic(self, action=None):
+        if not self._checkPermission(ViewManagementScreens):
+            return False
         return bool(self._get_items())
 
     @memoize
-    def check_clipboard_data(self, action=None):
+    def show_delete(self, action=None):
+        if not self.show_basic():
+            return False
+        return self._checkPermission(DeleteObjects)
+
+    @memoize
+    def show_paste(self, action=None):
         """Any data in the clipboard"""
+        if not self._checkPermission(ViewManagementScreens):
+            return False
+        if not self._checkPermission(AddPortalContent):
+            return False
         return bool(self.context.cb_dataValid())
 
     @memoize
+    def show_rename(self, action=None):
+        if not self.show_basic():
+            return False
+        if not self._checkPermission(AddPortalContent):
+            return False
+        return self.context.allowedContentTypes()
+
+    @memoize
     def can_sort_be_changed(self, action=None):
         """Returns true if the default sort key may be changed
             may be sorted for display"""
-        items_move_allowed = self._checkPermission(ManageProperties)
-        return items_move_allowed and not \
-            self._get_sorting() == self.context.getDefaultSorting()
+        if not self._checkPermission(ViewManagementScreens):
+            return False
+        if not self._checkPermission(ManageProperties):
+            return False
+        return not self._get_sorting() == self.context.getDefaultSorting()
 
     @memoize
     def is_orderable(self, action=None):
         """Returns true if the displayed contents can be
             reorded."""
+        if not self._checkPermission(ViewManagementScreens):
+            return False
+        if not self._checkPermission(ManageProperties):
+            return False
         key, _reverse = self._get_sorting()
         return key == 'position' and len(self._get_items()) > 1
 

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder_contents.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder_contents.pt	2012-07-07 09:41:15 UTC (rev 127279)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/folder_contents.pt	2012-07-07 10:02:37 UTC (rev 127280)
@@ -29,7 +29,7 @@
    tal:attributes="action request/ACTUAL_URL">
    <tal:block repeat="widget view/hidden_widgets"
               replace="structure widget/hidden" />
-   <table class="BatchTable" tal:condition="view/has_subobjects">
+   <table class="BatchTable" tal:condition="view/listBatchItems">
      <tr>
        <th tal:repeat="column view/column_headings"
             tal:attributes="colspan column/colspan | nothing"><a href="column"
@@ -39,7 +39,8 @@
      </tr>
    <tr tal:repeat="item view/listBatchItems"
       tal:attributes="class python: (repeat['item'].even() and 'row-hilite') or None">
-     <td tal:content="structure python:view.widgets[item.widget]()">Checkbox</td>
+     <td><tal:case tal:condition="item/widget"
+        tal:content="structure python: view.widgets[item.widget]()">Checkbox</tal:case></td>
      <td><a href="" tal:attributes="href item/url"
          tal:condition="item/icon"
       ><img src="" alt="" border="0"

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/folder.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/folder.txt	2012-07-07 09:41:15 UTC (rev 127279)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/folder.txt	2012-07-07 10:02:37 UTC (rev 127280)
@@ -61,11 +61,164 @@
     >>> 'name="form.reverse" type="hidden" value="1"' in browser.contents
     True
 
-Change the default sort order:
+Verify initially visible buttons:
 
+    >>> browser.open('http://localhost/site/@@edit.html')
+    >>> '[[cmf_default][Rename]]' in browser.contents
+    True
+    >>> '[[cmf_default][Cut]]' in browser.contents
+    True
+    >>> '[[cmf_default][Copy]]' in browser.contents
+    True
+    >>> '[[cmf_default][Paste]]' in browser.contents
+    False
+    >>> '[[cmf_default][Delete]]' in browser.contents
+    True
+    >>> '[[cmf_default][Up]]' in browser.contents
+    False
+    >>> '[[cmf_default][Down]]' in browser.contents
+    False
+    >>> '[[cmf_default][Top]]' in browser.contents
+    False
+    >>> '[[cmf_default][Bottom]]' in browser.contents
+    False
+    >>> '[[cmf_default][Set as Default Sort]]' in browser.contents
+    False
+
+Copy the 'Members' subfolder:
+
+    >>> browser.getControl(name='form.Members.select').value = True
+    >>> browser.getControl('[[cmf_default][Copy]]').click()
+    >>> '[[cmf_default][Item copied.]]' in browser.contents
+    True
+
+Now there is clipboard data and the paste button is also visible:
+
+    >>> browser.open('http://localhost/site/@@edit.html')
+    >>> '[[cmf_default][Rename]]' in browser.contents
+    True
+    >>> '[[cmf_default][Cut]]' in browser.contents
+    True
+    >>> '[[cmf_default][Copy]]' in browser.contents
+    True
+    >>> '[[cmf_default][Paste]]' in browser.contents
+    True
+    >>> '[[cmf_default][Delete]]' in browser.contents
+    True
+    >>> '[[cmf_default][Up]]' in browser.contents
+    False
+    >>> '[[cmf_default][Down]]' in browser.contents
+    False
+    >>> '[[cmf_default][Top]]' in browser.contents
+    False
+    >>> '[[cmf_default][Bottom]]' in browser.contents
+    False
+    >>> '[[cmf_default][Set as Default Sort]]' in browser.contents
+    False
+
+Paste the object from the clipboard:
+
+    >>> browser.getControl('[[cmf_default][Paste]]').click()
+    >>> '[[cmf_default][Item pasted.]]' in browser.contents
+    True
+
+Now there is more than one object and the order buttons are visible:
+
+    >>> browser.open('http://localhost/site/@@edit.html')
+    >>> '[[cmf_default][Rename]]' in browser.contents
+    True
+    >>> '[[cmf_default][Cut]]' in browser.contents
+    True
+    >>> '[[cmf_default][Copy]]' in browser.contents
+    True
+    >>> '[[cmf_default][Paste]]' in browser.contents
+    True
+    >>> '[[cmf_default][Delete]]' in browser.contents
+    True
+    >>> '[[cmf_default][Up]]' in browser.contents
+    True
+    >>> '[[cmf_default][Down]]' in browser.contents
+    True
+    >>> '[[cmf_default][Top]]' in browser.contents
+    True
+    >>> '[[cmf_default][Bottom]]' in browser.contents
+    True
+    >>> '[[cmf_default][Set as Default Sort]]' in browser.contents
+    False
+
+Without the necessary permissions some buttons are not visible:
+
+    >>> from Products.CMFDefault.permissions import AddPortalContent
+    >>> app.site.manage_permission(AddPortalContent, roles=[])
+    >>> browser.open('http://localhost/site/@@edit.html')
+    >>> '[[cmf_default][Rename]]' in browser.contents
+    False
+    >>> '[[cmf_default][Cut]]' in browser.contents
+    True
+    >>> '[[cmf_default][Copy]]' in browser.contents
+    True
+    >>> '[[cmf_default][Paste]]' in browser.contents
+    False
+    >>> '[[cmf_default][Delete]]' in browser.contents
+    True
+    >>> app.site.manage_permission(AddPortalContent, roles=['Manager'])
+
+    >>> from Products.CMFDefault.permissions import DeleteObjects
+    >>> app.site.manage_permission(DeleteObjects, roles=[])
+    >>> browser.open('http://localhost/site/@@edit.html')
+    >>> '[[cmf_default][Rename]]' in browser.contents
+    True
+    >>> '[[cmf_default][Cut]]' in browser.contents
+    True
+    >>> '[[cmf_default][Copy]]' in browser.contents
+    True
+    >>> '[[cmf_default][Paste]]' in browser.contents
+    True
+    >>> '[[cmf_default][Delete]]' in browser.contents
+    False
+    >>> app.site.manage_permission(DeleteObjects, roles=['Manager'])
+
+    >>> from Products.CMFDefault.permissions import ViewManagementScreens
+    >>> app.site.manage_permission(ViewManagementScreens, roles=[])
+    >>> browser.open('http://localhost/site/@@edit.html')
+    >>> '[[cmf_default][Rename]]' in browser.contents
+    False
+    >>> '[[cmf_default][Cut]]' in browser.contents
+    False
+    >>> '[[cmf_default][Copy]]' in browser.contents
+    False
+    >>> '[[cmf_default][Paste]]' in browser.contents
+    False
+    >>> '[[cmf_default][Delete]]' in browser.contents
+    False
+    >>> app.site.manage_permission(ViewManagementScreens, roles=['Manager'])
+
+Sorted by getId different buttons are visible:
+
     >>> browser.open('http://localhost/site/@@edit.html?form.sort_key=getId')
+    >>> '[[cmf_default][Rename]]' in browser.contents
+    True
+    >>> '[[cmf_default][Cut]]' in browser.contents
+    True
+    >>> '[[cmf_default][Copy]]' in browser.contents
+    True
+    >>> '[[cmf_default][Paste]]' in browser.contents
+    True
+    >>> '[[cmf_default][Delete]]' in browser.contents
+    True
+    >>> '[[cmf_default][Up]]' in browser.contents
+    False
+    >>> '[[cmf_default][Down]]' in browser.contents
+    False
+    >>> '[[cmf_default][Top]]' in browser.contents
+    False
+    >>> '[[cmf_default][Bottom]]' in browser.contents
+    False
     >>> '[[cmf_default][Set as Default Sort]]' in browser.contents
     True
+
+Change the default sort order:
+
     >>> browser.getControl('[[cmf_default][Set as Default Sort]]').click()
     >>> '[[cmf_default][Default sort order changed.]]' in browser.contents
     True

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-07 09:41:15 UTC (rev 127279)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/content/tests/test_folder.py	2012-07-07 10:02:37 UTC (rev 127280)
@@ -197,18 +197,18 @@
         view = ContentsView(self.folder, TestRequest())
         self.assertFalse(view.can_sort_be_changed())
 
-    def test_empty_has_subobjects(self):
+    def test_show_basic_empty(self):
         view = ContentsView(self.folder, TestRequest())
-        self.assertFalse(view.has_subobjects())
+        self.assertFalse(view.show_basic())
 
-    def test_has_subobjects(self):
+    def test_show_basic(self):
         self._make_one()
         view = ContentsView(self.folder, TestRequest())
-        self.assertTrue(view.has_subobjects())
+        self.assertTrue(view.show_basic())
 
-    def test_check_clipboard_data(self):
+    def test_show_paste(self):
         view = ContentsView(self.folder, TestRequest())
-        self.assertFalse(view.check_clipboard_data())
+        self.assertFalse(view.show_paste())
 
     def test_validate_items(self):
         """Cannot validate forms without widgets"""



More information about the checkins mailing list