[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