[Testbot] Plone 4.3 - Python 2.7 - Build # 2053 - Still failing! - 7 failure(s)

jenkins at plone.org jenkins at plone.org
Mon Mar 17 00:56:18 UTC 2014


-------------------------------------------------------------------------------
Plone 4.3 - Python 2.7 - Build # 2053 - Still Failing!
-------------------------------------------------------------------------------

http://jenkins.plone.org/job/plone-4.3-python-2.7/2053/


-------------------------------------------------------------------------------
CHANGES
-------------------------------------------------------------------------------

Repository: plone.app.dexterity
Branch: refs/heads/master
Date: 2014-03-16T17:06:45-07:00
Author: David Glick (davisagli) <david at glicksoftware.com>
Commit: https://github.com/plone/plone.app.dexterity/commit/1359c48cc54dce93f291b94ab31a161d3bb08e6d

add behavior for editing an item's id

Files changed:
A plone/app/dexterity/behaviors/id.py
A plone/app/dexterity/behaviors/tests/test_id.py
M docs/reference/standard-behaviours.rst
M plone/app/dexterity/behaviors/configure.zcml

diff --git a/docs/reference/standard-behaviours.rst b/docs/reference/standard-behaviours.rst
index dfcee9f..2938608 100644
--- a/docs/reference/standard-behaviours.rst
+++ b/docs/reference/standard-behaviours.rst
@@ -32,6 +32,8 @@ the resultant form fields and interfaces.
 +-------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
 | plone.app.dexterity.behaviors.discussion.IAllowDiscussion         | Allow discussion: Allow discussion on this item                                                                                                      |
 +-------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
+| plone.app.dexterity.behaviors.id.IShortName                       | Short name: Gives the ability to rename an item from its edit form.                                                                             |
++-------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
 | plone.app.dexterity.behaviors.nextprevious.INextPreviousEnabled   | Next previous navigation: Enable next previous navigation for all items of this type                                                                 |
 +-------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
 | Products.CMFPlone.interfaces.constrains.ISelectableConstrainTypes | Folder Addable Constrains: Restrict the content types that can be added to folderish content                                                         |
diff --git a/plone/app/dexterity/behaviors/configure.zcml b/plone/app/dexterity/behaviors/configure.zcml
index 19b08a9..9928ae7 100644
--- a/plone/app/dexterity/behaviors/configure.zcml
+++ b/plone/app/dexterity/behaviors/configure.zcml
@@ -124,6 +124,15 @@
         for="plone.dexterity.interfaces.IDexterityContainer"
         />
 
+    <!-- Short name -->
+    <plone:behavior
+        title="Short name"
+        description="Gives the ability to rename an item from its edit form."
+        factory=".id.ShortName"
+        provides=".id.IShortName"
+        for="plone.dexterity.interfaces.IDexterityContent"
+        />
+
     <!-- BBB -->
     <configure zcml:condition="installed plone.app.relationfield">
       <include package="plone.app.relationfield" />
diff --git a/plone/app/dexterity/behaviors/id.py b/plone/app/dexterity/behaviors/id.py
new file mode 100644
index 0000000..8752ca1
--- /dev/null
+++ b/plone/app/dexterity/behaviors/id.py
@@ -0,0 +1,50 @@
+from Acquisition import aq_inner
+from Acquisition import aq_parent
+from zope import schema
+from zope.interface import alsoProvides
+from zope.container.interfaces import INameChooser
+from plone.app.dexterity import MessageFactory as _
+from plone.autoform import directives as form
+from plone.autoform.interfaces import IFormFieldProvider
+from plone.supermodel import model
+import transaction
+
+
+class IShortName(model.Schema):
+
+    model.fieldset(
+        'settings',
+        label=_(u"Settings"),
+        fields=['id'],
+    )
+
+    id = schema.ASCIILine(
+        title=_(u'Short name'),
+        description=_(u'This name will be displayed in the URL.'),
+        required=False,
+    )
+    form.write_permission(id='cmf.AddPortalContent')
+
+alsoProvides(IShortName, IFormFieldProvider)
+
+
+class ShortName(object):
+
+    def __init__(self, context):
+        self.context = context
+
+    def _get_id(self):
+        return self.context.getId()
+
+    def _set_id(self, value):
+        if not value:
+            return
+        context = aq_inner(self.context)
+        parent = aq_parent(context)
+        new_id = INameChooser(parent).chooseName(value, context)
+        if context.getId():
+            transaction.savepoint()
+            parent.manage_renameObject(context.getId(), new_id)
+        else:
+            context.id = new_id
+    id = property(_get_id, _set_id)
diff --git a/plone/app/dexterity/behaviors/tests/test_id.py b/plone/app/dexterity/behaviors/tests/test_id.py
new file mode 100644
index 0000000..6874419
--- /dev/null
+++ b/plone/app/dexterity/behaviors/tests/test_id.py
@@ -0,0 +1,70 @@
+from plone.app.dexterity.testing import DEXTERITY_FUNCTIONAL_TESTING
+from plone.app.testing import SITE_OWNER_NAME
+from plone.app.testing import SITE_OWNER_PASSWORD
+from plone.testing import z2
+import transaction
+import unittest
+
+
+class TestShortNameBehavior(unittest.TestCase):
+
+    layer = DEXTERITY_FUNCTIONAL_TESTING
+
+    def setUp(self):
+        # add IShortName behavior to Page
+        behaviors = list(self.layer['portal'].portal_types.Document.behaviors)
+        behaviors.append('plone.app.dexterity.behaviors.id.IShortName')
+        self.layer['portal'].portal_types.Document.behaviors = tuple(behaviors)
+        transaction.commit()
+
+        # prepare browser
+        self.browser = z2.Browser(self.layer['app'])
+        self.browser.addHeader('Authorization', 'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,))
+        self.browser.open('http://nohost/plone')
+
+    def test_add_item_w_id_specified(self):
+        self.browser.getLink('Page').click()
+        self.browser.getControl('Title').value = 'title'
+        self.browser.getControl('Short name').value = 'foo'
+        self.browser.getControl('Save').click()
+        self.assertEqual(self.browser.url, 'http://nohost/plone/foo')
+
+    def test_add_item_w_title_only(self):
+        self.browser.getLink('Page').click()
+        self.browser.getControl('Title').value = 'Id from Title'
+        self.browser.getControl('Save').click()
+        self.assertEqual(self.browser.url, 'http://nohost/plone/id-from-title')
+
+    def test_edit_item_renames(self):
+        self.browser.getLink('Page').click()
+        self.browser.getControl('Title').value = 'title'
+        self.browser.getControl('Short name').value = 'foo'
+        self.browser.getControl('Save').click()
+        self.browser.getLink('Edit').click()
+        self.assertEqual(self.browser.getControl('Short name').value, 'foo')
+        self.browser.getControl('Short name').value = 'bar'
+        self.browser.getControl('Save').click()
+        self.assertEqual(self.browser.url, 'http://nohost/plone/bar')
+
+    def test_edit_item_doesnt_rename_if_id_blank(self):
+        self.browser.getLink('Page').click()
+        self.browser.getControl('Title').value = 'title'
+        self.browser.getControl('Short name').value = 'foo'
+        self.browser.getControl('Save').click()
+        self.browser.getLink('Edit').click()
+        self.browser.getControl('Short name').value = ''
+        self.browser.getControl('Save').click()
+        self.assertEqual(self.browser.url, 'http://nohost/plone/foo')
+
+    def test_edit_item_doesnt_rename_if_same_id(self):
+        self.browser.getLink('Page').click()
+        self.browser.getControl('Title').value = 'title'
+        self.browser.getControl('Short name').value = 'foo'
+        self.browser.getControl('Save').click()
+        mtime = self.layer['portal'].foo.bobobase_modification_time()
+        self.browser.getLink('Edit').click()
+        self.browser.getControl('Short name').value = 'foo'
+        self.browser.getControl('Save').click()
+        self.assertEqual(self.browser.url, 'http://nohost/plone/foo')
+        # assert that object has not been modified
+        self.assertEqual(mtime, self.layer['portal'].foo.bobobase_modification_time())




-------------------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CHANGES.log
Type: application/octet-stream
Size: 8430 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20140317/46ce785e/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: build.log
Type: application/octet-stream
Size: 88495 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20140317/46ce785e/attachment-0003.obj>


More information about the Testbot mailing list