[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