[Testbot] Plone 4.3 - Python 2.7 - Build # 2059 - Still failing! - 7 failure(s)
jenkins at plone.org
jenkins at plone.org
Tue Mar 18 11:39:26 UTC 2014
-------------------------------------------------------------------------------
Plone 4.3 - Python 2.7 - Build # 2059 - Still Failing!
-------------------------------------------------------------------------------
http://jenkins.plone.org/job/plone-4.3-python-2.7/2059/
-------------------------------------------------------------------------------
CHANGES
-------------------------------------------------------------------------------
Repository: plone.app.workflow
Branch: refs/heads/2.1.x
Date: 2014-03-14T21:51:49+01:00
Author: Robert Niederreiter (rnixx) <office at squarewave.at>
Commit: https://github.com/plone/plone.app.workflow/commit/166749443a08c4f92ff1a6ac933f6dde5a072f51
Introduce ``required_interface`` attribute on ``plone.app.workflow.interfaces.ISharingPageRole``
Files changed:
M CHANGES.txt
M README.txt
M plone/app/workflow/browser/sharing.py
M plone/app/workflow/exportimport.py
M plone/app/workflow/interfaces.py
M plone/app/workflow/localroles.py
M plone/app/workflow/tests/test_exportimport.py
M setup.py
diff --git a/CHANGES.txt b/CHANGES.txt
index 67d13d6..941b455 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -5,7 +5,9 @@ Changelog
2.1.8 (unreleased)
------------------
-- Nothing changed yet.
+- Introduce ``required_interface`` attribute on
+ ``plone.app.workflow.interfaces.ISharingPageRole``.
+ [rnix]
2.1.7 (2014-01-27)
diff --git a/README.txt b/README.txt
index abba57b..148faf3 100644
--- a/README.txt
+++ b/README.txt
@@ -12,6 +12,7 @@ the "Sharing" page.::
id="CopyEditor"
title="Can edit copy"
permission="Manage portal"
+ interface="Products.CMFPlone.interfaces.ISiteRoot"
i18n:attributes="title"
/>
</sharing>
diff --git a/plone/app/workflow/browser/sharing.py b/plone/app/workflow/browser/sharing.py
index c745484..f60bbdc 100644
--- a/plone/app/workflow/browser/sharing.py
+++ b/plone/app/workflow/browser/sharing.py
@@ -132,8 +132,13 @@ def roles(self):
for name, utility in getUtilitiesFor(ISharingPageRole):
permission = utility.required_permission
- if permission is None or portal_membership.checkPermission(permission, context):
- pairs.append(dict(id = name, title = utility.title))
+ if permission is not None:
+ if not portal_membership.checkPermission(permission, context):
+ continue
+ iface = utility.required_interface
+ if iface is not None and not iface.providedBy(context):
+ continue
+ pairs.append(dict(id = name, title = utility.title))
pairs.sort(key=lambda x: normalizeString(translate(x["title"], context=self.request)))
return pairs
diff --git a/plone/app/workflow/exportimport.py b/plone/app/workflow/exportimport.py
index 3333d91..af0ac39 100644
--- a/plone/app/workflow/exportimport.py
+++ b/plone/app/workflow/exportimport.py
@@ -8,6 +8,8 @@
from zope.component import queryMultiAdapter
from zope.component.interfaces import IComponentRegistry
+from zope.dottedname.resolve import resolve
+
from Products.GenericSetup.interfaces import IBody
from Products.GenericSetup.interfaces import ISetupEnviron
from Products.GenericSetup.utils import XMLAdapterBase
@@ -24,10 +26,13 @@ class PersistentSharingPageRole(Persistent):
title = u""
required_permission = None
+ required_interface = None
- def __init__(self, title=u"", required_permission=None):
+ def __init__(self, title=u"",
+ required_permission=None, required_interface=None):
self.title = PMF(title)
self.required_permission = required_permission
+ self.required_interface = required_interface
class SharingXMLAdapter(XMLAdapterBase):
@@ -78,6 +83,9 @@ def _initRole(self, node):
name = unicode(node.getAttribute('id'))
title = unicode(node.getAttribute('title'))
required = node.getAttribute('permission') or None
+ iface = node.getAttribute('interface') or None
+ if iface is not None:
+ iface = resolve(iface)
if node.hasAttribute('remove'):
utility = self.context.queryUtility(ISharingPageRole, name)
@@ -87,7 +95,8 @@ def _initRole(self, node):
self.context.unregisterUtility(utility, ISharingPageRole, name)
return
- component = PersistentSharingPageRole(title=title, required_permission=required)
+ component = PersistentSharingPageRole(
+ title=title, required_permission=required, required_interface=iface)
self.context.registerUtility(component, ISharingPageRole, name, info=self.info_tag)
@@ -102,6 +111,11 @@ def _extractRole(self, reg):
if component.required_permission:
node.setAttribute('permission', component.required_permission)
+ if component.required_interface:
+ iface = component.required_interface
+ iface = iface.__module__ + '.' + iface.__name__
+ node.setAttribute('interface', iface)
+
return node
diff --git a/plone/app/workflow/interfaces.py b/plone/app/workflow/interfaces.py
index 57397ba..e485e9c 100644
--- a/plone/app/workflow/interfaces.py
+++ b/plone/app/workflow/interfaces.py
@@ -14,5 +14,11 @@ class ISharingPageRole(Interface):
title = schema.TextLine(title=u"A friendly name for the role")
- required_permission = schema.TextLine(title=u"Permission required to manage this local role",
- required=False)
+ required_permission = schema.TextLine(
+ title=u"Permission required to manage this local role",
+ required=False)
+
+ required_interface = schema.Object(
+ schema=Interface,
+ title=u"Context interface required to display this role",
+ required=False)
diff --git a/plone/app/workflow/localroles.py b/plone/app/workflow/localroles.py
index ed9e5f8..1a61a13 100644
--- a/plone/app/workflow/localroles.py
+++ b/plone/app/workflow/localroles.py
@@ -17,6 +17,7 @@ class ReaderRole(object):
title = _(u"title_can_view", default=u"Can view")
required_permission = permissions.DelegateReaderRole
+ required_interface = None
class EditorRole(object):
@@ -24,6 +25,7 @@ class EditorRole(object):
title = _(u"title_can_edit", default=u"Can edit")
required_permission = permissions.DelegateEditorRole
+ required_interface = None
class ContributorRole(object):
@@ -31,6 +33,7 @@ class ContributorRole(object):
title = _(u"title_can_add", default=u"Can add")
required_permission = permissions.DelegateContributorRole
+ required_interface = None
class ReviewerRole(object):
@@ -38,6 +41,7 @@ class ReviewerRole(object):
title = _(u"title_can_review", default=u"Can review")
required_permission = permissions.DelegateReviewerRole
+ required_interface = None
# Only managers can manage these
diff --git a/plone/app/workflow/tests/test_exportimport.py b/plone/app/workflow/tests/test_exportimport.py
index f3e9e99..4da884c 100644
--- a/plone/app/workflow/tests/test_exportimport.py
+++ b/plone/app/workflow/tests/test_exportimport.py
@@ -1,5 +1,5 @@
import unittest
-
+from zope.interface import Interface
from zope.component import provideAdapter, provideUtility, getUtilitiesFor, getSiteManager
from zope.component.testing import tearDown
@@ -56,7 +56,10 @@ def test_import_single_no_purge(self):
xml = """\
<sharing>
- <role id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
+ <role id='CopyEditor'
+ title='Can copyedit'
+ permission='Delegate edit copy'
+ interface='zope.interface.Interface' />
</sharing>
"""
context = DummyImportContext(self.site, purge=False)
@@ -66,15 +69,21 @@ def test_import_single_no_purge(self):
roles = self.roles()
self.assertEquals(1, len(roles))
+
self.assertEquals('Can copyedit', roles['CopyEditor'].title)
self.assertEquals('Delegate edit copy', roles['CopyEditor'].required_permission)
+ self.assertEquals(Interface, roles['CopyEditor'].required_interface)
def test_import_multiple_no_purge(self):
xml = """\
<sharing>
- <role id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
- <role id='Controller' title='Can control' />
+ <role id='CopyEditor'
+ title='Can copyedit'
+ permission='Delegate edit copy'
+ interface='zope.interface.Interface' />
+ <role id='Controller'
+ title='Can control' />
</sharing>
"""
context = DummyImportContext(self.site, purge=False)
@@ -86,6 +95,7 @@ def test_import_multiple_no_purge(self):
self.assertEquals(2, len(roles))
self.assertEquals('Can copyedit', roles['CopyEditor'].title)
self.assertEquals('Delegate edit copy', roles['CopyEditor'].required_permission)
+ self.assertEquals(Interface, roles['CopyEditor'].required_interface)
self.assertEquals('Can control', roles['Controller'].title)
self.assertEquals(None, roles['Controller'].required_permission)
@@ -93,7 +103,10 @@ def test_import_multiple_times_no_purge(self):
xml = """\
<sharing>
- <role id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
+ <role id='CopyEditor'
+ title='Can copyedit'
+ permission='Delegate edit copy'
+ interface='zope.interface.Interface' />
</sharing>
"""
context = DummyImportContext(self.site, purge=False)
@@ -105,10 +118,12 @@ def test_import_multiple_times_no_purge(self):
self.assertEquals(1, len(roles))
self.assertEquals('Can copyedit', roles['CopyEditor'].title)
self.assertEquals('Delegate edit copy', roles['CopyEditor'].required_permission)
+ self.assertEquals(Interface, roles['CopyEditor'].required_interface)
xml = """\
<sharing>
- <role id='Controller' title='Can control' />
+ <role id='Controller'
+ title='Can control' />
</sharing>
"""
context = DummyImportContext(self.site, purge=False)
@@ -120,6 +135,7 @@ def test_import_multiple_times_no_purge(self):
self.assertEquals(2, len(roles))
self.assertEquals('Can copyedit', roles['CopyEditor'].title)
self.assertEquals('Delegate edit copy', roles['CopyEditor'].required_permission)
+ self.assertEquals(Interface, roles['CopyEditor'].required_interface)
self.assertEquals('Can control', roles['Controller'].title)
self.assertEquals(None, roles['Controller'].required_permission)
@@ -127,7 +143,10 @@ def test_import_multiples_times_purge(self):
xml = """\
<sharing>
- <role id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
+ <role id='CopyEditor'
+ title='Can copyedit'
+ permission='Delegate edit copy'
+ interface='zope.interface.Interface' />
</sharing>
"""
context = DummyImportContext(self.site, purge=False)
@@ -139,10 +158,12 @@ def test_import_multiples_times_purge(self):
self.assertEquals(1, len(roles))
self.assertEquals('Can copyedit', roles['CopyEditor'].title)
self.assertEquals('Delegate edit copy', roles['CopyEditor'].required_permission)
+ self.assertEquals(Interface, roles['CopyEditor'].required_interface)
xml = """\
<sharing>
- <role id='Controller' title='Can control' />
+ <role id='Controller'
+ title='Can control' />
</sharing>
"""
context = DummyImportContext(self.site, purge=True)
@@ -159,7 +180,10 @@ def test_import_multiples_times_no_purge_overwrite(self):
xml = """\
<sharing>
- <role id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
+ <role id='CopyEditor'
+ title='Can copyedit'
+ permission='Delegate edit copy'
+ interface='zope.interface.Interface' />
</sharing>
"""
context = DummyImportContext(self.site, purge=False)
@@ -171,10 +195,13 @@ def test_import_multiples_times_no_purge_overwrite(self):
self.assertEquals(1, len(roles))
self.assertEquals('Can copyedit', roles['CopyEditor'].title)
self.assertEquals('Delegate edit copy', roles['CopyEditor'].required_permission)
+ self.assertEquals(Interface, roles['CopyEditor'].required_interface)
xml = """\
<sharing>
- <role id='CopyEditor' title='Can edit copy' permission='Delegate: CopyEditor'/>
+ <role id='CopyEditor'
+ title='Can edit copy'
+ permission='Delegate: CopyEditor' />
</sharing>
"""
context = DummyImportContext(self.site, purge=False)
@@ -186,6 +213,7 @@ def test_import_multiples_times_no_purge_overwrite(self):
self.assertEquals(1, len(roles))
self.assertEquals('Can edit copy', roles['CopyEditor'].title)
self.assertEquals('Delegate: CopyEditor', roles['CopyEditor'].required_permission)
+ self.assertEquals(None, roles['CopyEditor'].required_interface)
def test_import_override_global(self):
@@ -193,8 +221,12 @@ def test_import_override_global(self):
xml = """\
<sharing>
- <role id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
- <role id='DoerOfStuff' title='Can do stuff' permission='Delegate doing stuff'/>
+ <role id='CopyEditor'
+ title='Can copyedit'
+ permission='Delegate edit copy' />
+ <role id='DoerOfStuff'
+ title='Can do stuff'
+ permission='Delegate doing stuff' />
</sharing>
"""
context = DummyImportContext(self.site, purge=False)
@@ -206,6 +238,7 @@ def test_import_override_global(self):
self.assertEquals(2, len(roles))
self.assertEquals('Can copyedit', roles['CopyEditor'].title)
self.assertEquals('Delegate edit copy', roles['CopyEditor'].required_permission)
+ self.assertEquals(None, roles['CopyEditor'].required_interface)
self.assertEquals('Can do stuff', roles['DoerOfStuff'].title)
self.assertEquals('Delegate doing stuff', roles['DoerOfStuff'].required_permission)
@@ -213,7 +246,9 @@ def test_remove_one(self):
xml = """\
<sharing>
- <role id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
+ <role id='CopyEditor'
+ title='Can copyedit'
+ permission='Delegate edit copy' />
</sharing>
"""
context = DummyImportContext(self.sm, purge=False)
@@ -227,7 +262,8 @@ def test_remove_one(self):
xml = """\
<sharing>
- <role remove="True" id='CopyEditor'/>
+ <role remove="True"
+ id='CopyEditor' />
</sharing>
"""
context = DummyImportContext(self.sm, purge=False)
@@ -241,8 +277,12 @@ def test_remove_one(self):
def test_remove_multiple(self):
xml = """\
<sharing>
- <role id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
- <role id='DoerOfStuff' title='Can do stuff' permission='Delegate doing stuff'/>
+ <role id='CopyEditor'
+ title='Can copyedit'
+ permission='Delegate edit copy' />
+ <role id='DoerOfStuff'
+ title='Can do stuff'
+ permission='Delegate doing stuff' />
</sharing>
"""
context = DummyImportContext(self.sm, purge=False)
@@ -251,8 +291,13 @@ def test_remove_multiple(self):
xml = """\
<sharing>
- <role id='Hacker' title='Can hack' permission='Hack the system'/>
- <role remove="True" id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
+ <role id='Hacker'
+ title='Can hack'
+ permission='Hack the system' />
+ <role remove="True"
+ id='CopyEditor'
+ title='Can copyedit'
+ permission='Delegate edit copy' />
</sharing>
"""
context = DummyImportContext(self.sm, purge=False)
@@ -291,8 +336,9 @@ def test_export_multiple(self):
import_xml = """\
<sharing>
- <role id='CopyEditor' title='Can copyedit' permission='Delegate edit copy'/>
- <role id='Controller' title='Can control' />
+ <role title="Can control" id="Controller"/>
+ <role title="Can copyedit" id="CopyEditor"
+ interface="zope.interface.Interface" permission="Delegate edit copy"/>
</sharing>
"""
@@ -300,7 +346,8 @@ def test_export_multiple(self):
<?xml version="1.0"?>
<sharing>
<role title="Can control" id="Controller"/>
- <role title="Can copyedit" id="CopyEditor" permission="Delegate edit copy"/>
+ <role title="Can copyedit" id="CopyEditor"
+ interface="zope.interface.Interface" permission="Delegate edit copy"/>
</sharing>
"""
@@ -313,6 +360,7 @@ def test_export_multiple(self):
export_sharing(export_context)
self.assertEquals('sharing.xml', export_context._wrote[0][0])
+
self.assertEquals(export_xml, export_context._wrote[0][1])
diff --git a/setup.py b/setup.py
index e2e20fc..bd7e034 100644
--- a/setup.py
+++ b/setup.py
@@ -35,6 +35,7 @@
'plone.memoize',
'transaction',
'zope.component',
+ 'zope.dottedname',
'zope.i18n',
'zope.i18nmessageid',
'zope.interface',
Repository: plone.app.workflow
Branch: refs/heads/2.1.x
Date: 2014-03-17T13:13:21+01:00
Author: Robert Niederreiter (rnixx) <office at squarewave.at>
Commit: https://github.com/plone/plone.app.workflow/commit/b6342fb847a071bd728d34b68a877f3a1cbfadce
be friendly to utilities implemented without required_interface
Files changed:
M plone/app/workflow/browser/sharing.py
diff --git a/plone/app/workflow/browser/sharing.py b/plone/app/workflow/browser/sharing.py
index f60bbdc..3b55bf7 100644
--- a/plone/app/workflow/browser/sharing.py
+++ b/plone/app/workflow/browser/sharing.py
@@ -135,7 +135,8 @@ def roles(self):
if permission is not None:
if not portal_membership.checkPermission(permission, context):
continue
- iface = utility.required_interface
+ # be friendly to utilities implemented without required_interface
+ iface = getattr(utility, 'required_interface', None)
if iface is not None and not iface.providedBy(context):
continue
pairs.append(dict(id = name, title = utility.title))
-------------------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CHANGES.log
Type: application/octet-stream
Size: 17902 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20140318/2006e0cc/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: build.log
Type: application/octet-stream
Size: 88111 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20140318/2006e0cc/attachment-0003.obj>
More information about the Testbot
mailing list