[Testbot] Plone 5.0 - Python 2.7 - Build # 1987 - Improvement! - 6 failure(s)
jenkins at plone.org
jenkins at plone.org
Mon Mar 17 02:07:04 UTC 2014
-------------------------------------------------------------------------------
Plone 5.0 - Python 2.7 - Build # 1987 - Still Failing!
-------------------------------------------------------------------------------
http://jenkins.plone.org/job/plone-5.0-python-2.7/1987/
-------------------------------------------------------------------------------
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/2611a3cf/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: build.log
Type: application/octet-stream
Size: 123715 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20140317/2611a3cf/attachment-0003.obj>
More information about the Testbot
mailing list