[Testbot] Plone 5.0 - Python 2.7 - Build # 3698 - Still failing! - 0 failure(s)
jenkins at plone.org
jenkins at plone.org
Fri Nov 14 16:13:33 UTC 2014
-------------------------------------------------------------------------------
Plone 5.0 - Python 2.7 - Build # 3698 - Still Failing!
-------------------------------------------------------------------------------
http://jenkins.plone.org/job/plone-5.0-python-2.7/3698/
-------------------------------------------------------------------------------
CHANGES
-------------------------------------------------------------------------------
Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-11-14T10:23:36+01:00
Author: Dylan Jay () <software at pretaweb.com>
Commit: https://github.com/plone/Products.CMFPlone/commit/3f22c23e9609490096e74017b81eeea1fb1a00dc
Move markup controlpanel to CMFPlone
start moving markup control panel to CMFPlone
Conflicts:
Products/CMFPlone/controlpanel/browser/configure.zcml
Products/CMFPlone/interfaces/__init__.py
Products/CMFPlone/interfaces/controlpanel.py
Inserting IMarkupSchema into the registry (but failing)
test_controlpanel_markup and test_bbb_markup now passing
Conflicts:
Products/CMFPlone/controlpanel/README.rst
start of robot test for markup control panel
robot tests for markup control panel. not passing as control panel isn't affecting editor yet
Files changed:
A Products/CMFPlone/controlpanel/bbb/markup.py
A Products/CMFPlone/controlpanel/browser/markup.py
A Products/CMFPlone/controlpanel/tests/test_bbb_markup.py
A Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
A Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
M Products/CMFPlone/controlpanel/README.rst
M Products/CMFPlone/controlpanel/bbb/configure.zcml
M Products/CMFPlone/controlpanel/browser/configure.zcml
M Products/CMFPlone/interfaces/__init__.py
M Products/CMFPlone/interfaces/controlpanel.py
M Products/CMFPlone/profiles/dependencies/registry.xml
diff --git a/Products/CMFPlone/controlpanel/README.rst b/Products/CMFPlone/controlpanel/README.rst
index 9e49bcf..ab497d2 100644
--- a/Products/CMFPlone/controlpanel/README.rst
+++ b/Products/CMFPlone/controlpanel/README.rst
@@ -84,3 +84,13 @@ Overview Control Panel
>>> from Products.CMFPlone.interfaces.controlpanel import IDateAndTimeSchema
>>> tz_settings = registry.forInterface(IDateAndTimeSchema, prefix='plone')
>>> tz_settings.portal_timezone = 'UTC'
+
+
+Markup Control Panel
+------------------------
+
+ >>> from Products.CMFPlone.interfaces import IMarkupSchema
+ >>> markup_settings = registry.forInterface(IMarkupSchema, prefix='plone')
+
+ >>> markup_settings.default_type = True
+ >>> markup_settings.allowed_types = True
diff --git a/Products/CMFPlone/controlpanel/bbb/configure.zcml b/Products/CMFPlone/controlpanel/bbb/configure.zcml
index c647f0b..dc8d0ba 100644
--- a/Products/CMFPlone/controlpanel/bbb/configure.zcml
+++ b/Products/CMFPlone/controlpanel/bbb/configure.zcml
@@ -8,5 +8,6 @@
<adapter factory=".navigation.NavigationControlPanelAdapter" />
<adapter factory=".search.SearchControlPanelAdapter" />
<adapter factory=".site.SiteControlPanelAdapter" />
+ <adapter factory=".markup.MarkupControlPanelAdapter" />
</configure>
diff --git a/Products/CMFPlone/controlpanel/bbb/markup.py b/Products/CMFPlone/controlpanel/bbb/markup.py
new file mode 100644
index 0000000..51bb95d
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/bbb/markup.py
@@ -0,0 +1,56 @@
+from zope.component import getAdapter
+from zope.site.hooks import getSite
+from Products.CMFPlone.interfaces.siteroot import IPloneSiteRoot
+from zope.component import adapts
+from zope.interface import implements
+from Products.CMFCore.utils import getToolByName
+
+from Products.CMFPlone.interfaces import IMarkupSchema
+
+
+class MarkupControlPanelAdapter(object):
+
+ adapts(IPloneSiteRoot)
+ implements(IMarkupSchema)
+
+ def __init__(self, context):
+ self.context = context
+ self.portal = getSite()
+ pprop = getToolByName(self.portal, 'portal_properties')
+ self.pmembership = getToolByName(context, 'portal_membership')
+ portal_url = getToolByName(context, 'portal_url')
+ self.portal = portal_url.getPortalObject()
+ self.context = pprop.site_properties
+ self.site_properties = pprop.site_properties
+ self.portal_transforms = getToolByName(
+ self.portal,
+ 'portal_transforms'
+ )
+
+ def get_default_type(self):
+ return self.site_properties.getProperty('default_contenttype')
+
+ def set_default_type(self, value):
+ self.site_properties.manage_changeProperties(default_contenttype=value)
+
+ default_type = property(get_default_type, set_default_type)
+
+ def get_allowed_types(self):
+ allowable_types = self.portal_transforms.listAvailableTextInputs()
+ forbidden_types = list(
+ self.site_properties.getProperty('forbidden_contenttypes')
+ )
+ allowed_types = [
+ type for type in allowable_types if type not in forbidden_types
+ ]
+ return allowed_types
+
+ def set_allowed_types(self, value):
+ # The menu pretends to be a whitelist, but we are storing a blacklist
+ # so that new types are available by default. So, we inverse the list.
+ allowable_types = self.portal_transforms.listAvailableTextInputs()
+ forbidden_types = [t for t in allowable_types if t not in value]
+ self.site_properties.manage_changeProperties(
+ forbidden_contenttypes=tuple(forbidden_types)
+ )
+ allowed_types = property(get_allowed_types, set_allowed_types)
\ No newline at end of file
diff --git a/Products/CMFPlone/controlpanel/browser/configure.zcml b/Products/CMFPlone/controlpanel/browser/configure.zcml
index 3f548cd..1e3a13e 100644
--- a/Products/CMFPlone/controlpanel/browser/configure.zcml
+++ b/Products/CMFPlone/controlpanel/browser/configure.zcml
@@ -90,4 +90,12 @@
template="resourceregistry.pt"
/>
+ <!-- Markup Control Panel -->
+ <browser:page
+ name="markup-controlpanel"
+ for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+ class=".markup.MarkupControlPanel"
+ permission="plone.app.controlpanel.Markup"
+ />
+
</configure>
diff --git a/Products/CMFPlone/controlpanel/browser/markup.py b/Products/CMFPlone/controlpanel/browser/markup.py
new file mode 100644
index 0000000..7ab7a7d
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/browser/markup.py
@@ -0,0 +1,22 @@
+from z3c.form.browser.checkbox import CheckBoxFieldWidget
+from plone.app.registry.browser import controlpanel
+
+from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.interfaces import IMarkupSchema
+
+
+class MarkupControlPanelForm(controlpanel.RegistryEditForm):
+
+ id = "MarkupControlPanel"
+ label = _(u"Markup settings")
+ schema = IMarkupSchema
+ schema_prefix = "plone"
+
+ def updateFields(self):
+ super(MarkupControlPanelForm, self).updateFields()
+ self.fields['allowed_types'].widgetFactory = \
+ CheckBoxFieldWidget
+
+
+class MarkupControlPanel(controlpanel.ControlPanelFormWrapper):
+ form = MarkupControlPanelForm
diff --git a/Products/CMFPlone/controlpanel/tests/test_bbb_markup.py b/Products/CMFPlone/controlpanel/tests/test_bbb_markup.py
new file mode 100644
index 0000000..1e81aa6
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/tests/test_bbb_markup.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+import unittest2 as unittest
+
+from plone.testing.z2 import Browser
+from plone.app.testing import SITE_OWNER_NAME, SITE_OWNER_PASSWORD
+
+from zope.component import getUtility
+from plone.registry.interfaces import IRegistry
+from Products.CMFPlone.interfaces import IMarkupSchema
+
+from Products.CMFPlone.testing import \
+ PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+
+
+class EditingControlPanelAdapterTest(unittest.TestCase):
+
+ layer = PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+
+ def setUp(self):
+ self.app = self.layer['app']
+ self.portal = self.layer['portal']
+ self.portal_url = self.portal.absolute_url()
+ registry = getUtility(IRegistry)
+ self.settings = registry.forInterface(IMarkupSchema, prefix="plone")
+ self.browser = Browser(self.app)
+ self.browser.handleErrors = False
+ self.browser.addHeader(
+ 'Authorization',
+ 'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
+ )
+
+ def test_default_type(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.browser.getControl('Default format').value = ['text/html']
+ self.browser.getControl('Save').click()
+
+ self.assertEqual(self.settings.default_type, 'text/html')
+
+ def test_allowed_types(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.browser.getControl(
+ name='form.widgets.allowed_types:list'
+ ).value = ['text/plain', 'text/x-web-textile']
+ self.browser.getControl('Save').click()
+
+ self.assertEqual(
+ self.settings.allowed_types,
+ ('text/plain', 'text/x-web-textile'))
\ No newline at end of file
diff --git a/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py b/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
new file mode 100644
index 0000000..b048a07
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+import unittest2 as unittest
+
+from plone.testing.z2 import Browser
+from plone.app.testing import SITE_OWNER_NAME, SITE_OWNER_PASSWORD
+
+from plone.registry.interfaces import IRegistry
+from plone.registry import Registry
+from Products.CMFPlone.interfaces import IMarkupSchema
+
+from zope.component import getMultiAdapter, getUtility
+
+from Products.CMFCore.utils import getToolByName
+
+from plone.app.testing import TEST_USER_ID, setRoles
+
+from Products.CMFPlone.testing import PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+
+
+class MarkupRegistryIntegrationTest(unittest.TestCase):
+ """Test plone.app.registry based markup storage.
+ """
+
+ layer = PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+
+ def setUp(self):
+ self.portal = self.layer['portal']
+ self.request = self.layer['request']
+# setRoles(self.portal, TEST_USER_ID, ['Manager'])
+
+ registry = getUtility(IRegistry)
+# self.registry.registerInterface(IMarkupSchema)
+ self.settings = registry.forInterface(
+ IMarkupSchema, prefix="plone")
+
+ def test_markup_controlpanel_view(self):
+ view = getMultiAdapter(
+ (self.portal, self.portal.REQUEST),
+ name="markup-controlpanel"
+ )
+ view = view.__of__(self.portal)
+ self.assertTrue(view())
+
+ def test_plone_app_registry_in_controlpanel(self):
+ self.controlpanel = getToolByName(self.portal, "portal_controlpanel")
+ self.assertTrue(
+ 'plone.app.registry' in [a.getAction(self)['id']
+ for a in self.controlpanel.listActions()]
+ )
+
+ def test_default_type_setting(self):
+ self.assertTrue('default_type' in IMarkupSchema.names())
+ self.assertEqual(
+ self.settings.default_type,
+ 'text/html'
+ )
+
+ def test_allowed_types_setting(self):
+ self.assertTrue('allowed_types' in IMarkupSchema.names())
+ self.assertEqual(
+ self.settings.allowed_types,
+ ('text/html', 'text/x-web-textile')
+ )
diff --git a/Products/CMFPlone/interfaces/__init__.py b/Products/CMFPlone/interfaces/__init__.py
index 499ab16..a6b800e 100644
--- a/Products/CMFPlone/interfaces/__init__.py
+++ b/Products/CMFPlone/interfaces/__init__.py
@@ -18,6 +18,7 @@
from controlpanel import ITinyMCEResourceTypesSchema
from controlpanel import ITypesSchema
from events import IConfigurationChangedEvent
+from controlpanel import IMarkupSchema
from events import ISiteManagerCreatedEvent
from events import IReorderedEvent
from interface import IInterfaceTool
@@ -34,4 +35,4 @@
from workflow import IWorkflowChain
from resources import IResourceRegistry
from resources import IBundleRegistry
-from patterns import IPatternsSettings
\ No newline at end of file
+from patterns import IPatternsSettings
diff --git a/Products/CMFPlone/interfaces/controlpanel.py b/Products/CMFPlone/interfaces/controlpanel.py
index 36b4b9c..01a0816 100644
--- a/Products/CMFPlone/interfaces/controlpanel.py
+++ b/Products/CMFPlone/interfaces/controlpanel.py
@@ -871,3 +871,33 @@ class IDateAndTimeSchema(Interface):
class ITypesSchema(Interface):
"""
"""
+
+
+class IMarkupSchema(Interface):
+
+ default_type = schema.Choice(
+ title=_(u'Default format'),
+ description=_(
+ u"Select the default format of textfields for newly "
+ u"created content objects."
+ ),
+ default=u'text/html',
+ vocabulary="plone.app.vocabularies.AllowableContentTypes",
+ required=True
+ )
+
+ allowed_types = schema.Tuple(
+ title=_(u'Alternative formats'),
+ description=_(
+ u"Select which formats are available for users as "
+ u"alternative to the default format. Note that if new "
+ u"formats are installed, they will be enabled for text "
+ u"fields by default unless explicitly turned off here "
+ u"or by the relevant installer."
+ ),
+ required=True,
+ default=('text/html', 'text/x-web-textile'),
+ value_type=schema.Choice(
+ vocabulary="plone.app.vocabularies.AllowableContentTypes"
+ )
+ )
diff --git a/Products/CMFPlone/profiles/dependencies/registry.xml b/Products/CMFPlone/profiles/dependencies/registry.xml
index 29d27ec..47f0569 100644
--- a/Products/CMFPlone/profiles/dependencies/registry.xml
+++ b/Products/CMFPlone/profiles/dependencies/registry.xml
@@ -12,6 +12,8 @@
prefix="plone" />
<records interface="Products.CMFPlone.interfaces.IDateAndTimeSchema"
prefix="plone" />
+ <records interface="Products.CMFPlone.interfaces.IMarkupSchema"
+ prefix="plone" />
<record interface="Products.ResourceRegistries.interfaces.settings.IResourceRegistriesSettings" field="resourceBundlesForThemes">
<value purge="false">
<element key="(default)">
diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
new file mode 100644
index 0000000..1eb60ea
--- /dev/null
+++ b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
@@ -0,0 +1,90 @@
+*** Settings *****************************************************************
+
+Resource plone/app/robotframework/keywords.robot
+Resource plone/app/robotframework/saucelabs.robot
+
+Library Remote ${PLONE_URL}/RobotRemote
+
+Resource keywords.robot
+
+Test Setup Open SauceLabs test browser
+Test Teardown Run keywords Report test status Close all browsers
+
+
+*** Test Cases ***************************************************************
+
+Scenario: Change Default Markup Types in the Markup Control Panel
+ Given a logged-in site administrator
+ and the markup control panel
+ When I set allowed types to "text/restructured"
+ Then I do not see the standard editor when I create a document
+
+Scenario: Set Default Markup to be Restructured Text
+ Given a logged-in site administrator
+ and the markup control panel
+ When I set the default type to "text/restructured"
+ Then I do not see the standard editor when I create a document
+
+
+*** Keywords *****************************************************************
+
+# --- GIVEN ------------------------------------------------------------------
+
+a logged-in site administrator
+ Enable autologin as Site Administrator
+
+a document '${title}'
+ Create content type=Document id=doc title=${title}
+
+the markup control panel
+ Go to ${PLONE_URL}/@@markup-controlpanel
+
+
+# --- WHEN -------------------------------------------------------------------
+
+I set allowed types to "${type}"
+ with the label text/html UnSelect Checkbox
+ with the label text/x-web-textile UnSelect Checkbox
+ with the label ${type} Select Checkbox
+ Click Button Save
+ Wait until page contains Changes saved
+
+
+I disable the standard editor
+ Select from list by label name=form.widgets.default_editor:list None
+ Click Button Save
+ Wait until page contains Changes saved
+
+
+# --- THEN -------------------------------------------------------------------
+
+Then I can see only "${type}" when creating a document
+ Go To ${PLONE_URL}/++add++Document
+ Wait until page contains Add Page
+ with the label Title Input Text My Document
+ Click Link Settings
+ Page should contain element name=form.widgets.IShortName.id
+ Input Text name=form.widgets.IShortName.id this-is-my-custom-short-name
+ Click Button Save
+ Wait until page contains Item created
+ Location should be ${PLONE_URL}/this-is-my-custom-short-name/view
+
+I do not see the standard editor when I create a document
+ Go To ${PLONE_URL}/++add++Document
+ Wait until page contains Add Page
+ Page should not contain element css=.mce-tinymce
+
+# --- Helpers -----------------------------------------------------------------
+
+With the label
+ [arguments] ${title} ${extra_keyword} @{list}
+ ${for}= label "${title}"
+ Run Keyword ${extra_keyword} id=${for} @{list}
+
+label "${title}"
+ [Return] ${for}
+ ${for}= Get Element Attribute xpath=//label[contains(., "${title}")]@for
+
+label2 "${title}"
+ [Return] ${for}
+ ${for}= Get Element Attribute xpath=//label[contains(., "${title}")]//input
Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-11-14T10:53:57+01:00
Author: Johannes Raggam (thet) <raggam-nl at adm.at>
Commit: https://github.com/plone/Products.CMFPlone/commit/2a37da50444bb3dcc3788a55a9d69493be717969
Refactor markup control panel to new controlpanel structure
Files changed:
A Products/CMFPlone/controlpanel/tests/test_controlpanel_bbb_markup_adapter.py
A Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_markup.py
M CHANGES.rst
M Products/CMFPlone/controlpanel/bbb/markup.py
M Products/CMFPlone/controlpanel/browser/markup.py
M Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
M Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
D Products/CMFPlone/controlpanel/tests/test_bbb_markup.py
diff --git a/CHANGES.rst b/CHANGES.rst
index e240a86..7feb62f 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -8,6 +8,9 @@ Changelog
5.0b1 (unreleased)
------------------
+- Move markup control panel to CMFPlone. Fixes #220.
+ [djay, thet]
+
- Use jstz to set default portal_timezone in @@plone-addsite.
[instification]
diff --git a/Products/CMFPlone/controlpanel/bbb/markup.py b/Products/CMFPlone/controlpanel/bbb/markup.py
index 51bb95d..ed2a185 100644
--- a/Products/CMFPlone/controlpanel/bbb/markup.py
+++ b/Products/CMFPlone/controlpanel/bbb/markup.py
@@ -1,11 +1,9 @@
-from zope.component import getAdapter
-from zope.site.hooks import getSite
+from Products.CMFPlone.interfaces import IMarkupSchema
from Products.CMFPlone.interfaces.siteroot import IPloneSiteRoot
+from plone.registry.interfaces import IRegistry
from zope.component import adapts
+from zope.component import getUtility
from zope.interface import implements
-from Products.CMFCore.utils import getToolByName
-
-from Products.CMFPlone.interfaces import IMarkupSchema
class MarkupControlPanelAdapter(object):
@@ -14,43 +12,21 @@ class MarkupControlPanelAdapter(object):
implements(IMarkupSchema)
def __init__(self, context):
- self.context = context
- self.portal = getSite()
- pprop = getToolByName(self.portal, 'portal_properties')
- self.pmembership = getToolByName(context, 'portal_membership')
- portal_url = getToolByName(context, 'portal_url')
- self.portal = portal_url.getPortalObject()
- self.context = pprop.site_properties
- self.site_properties = pprop.site_properties
- self.portal_transforms = getToolByName(
- self.portal,
- 'portal_transforms'
- )
-
- def get_default_type(self):
- return self.site_properties.getProperty('default_contenttype')
-
- def set_default_type(self, value):
- self.site_properties.manage_changeProperties(default_contenttype=value)
-
- default_type = property(get_default_type, set_default_type)
-
- def get_allowed_types(self):
- allowable_types = self.portal_transforms.listAvailableTextInputs()
- forbidden_types = list(
- self.site_properties.getProperty('forbidden_contenttypes')
- )
- allowed_types = [
- type for type in allowable_types if type not in forbidden_types
- ]
- return allowed_types
-
- def set_allowed_types(self, value):
- # The menu pretends to be a whitelist, but we are storing a blacklist
- # so that new types are available by default. So, we inverse the list.
- allowable_types = self.portal_transforms.listAvailableTextInputs()
- forbidden_types = [t for t in allowable_types if t not in value]
- self.site_properties.manage_changeProperties(
- forbidden_contenttypes=tuple(forbidden_types)
- )
- allowed_types = property(get_allowed_types, set_allowed_types)
\ No newline at end of file
+ registry = getUtility(IRegistry)
+ self.settings = registry.forInterface(IMarkupSchema, prefix="plone")
+
+ @property
+ def default_type(self):
+ return self.settings.default_type
+
+ @default_type.setter
+ def default_type(self, value):
+ self.settings.default_type = value
+
+ @property
+ def allowed_types(self):
+ return self.settings.allowed_types
+
+ @allowed_types.setter
+ def allowed_types(self, value):
+ self.settings.allowed_types = value
diff --git a/Products/CMFPlone/controlpanel/browser/markup.py b/Products/CMFPlone/controlpanel/browser/markup.py
index 7ab7a7d..54ced9e 100644
--- a/Products/CMFPlone/controlpanel/browser/markup.py
+++ b/Products/CMFPlone/controlpanel/browser/markup.py
@@ -1,8 +1,7 @@
-from z3c.form.browser.checkbox import CheckBoxFieldWidget
-from plone.app.registry.browser import controlpanel
-
from Products.CMFPlone import PloneMessageFactory as _
from Products.CMFPlone.interfaces import IMarkupSchema
+from plone.app.registry.browser import controlpanel
+from z3c.form.browser.checkbox import CheckBoxFieldWidget
class MarkupControlPanelForm(controlpanel.RegistryEditForm):
diff --git a/Products/CMFPlone/controlpanel/tests/test_bbb_markup.py b/Products/CMFPlone/controlpanel/tests/test_bbb_markup.py
deleted file mode 100644
index 1e81aa6..0000000
--- a/Products/CMFPlone/controlpanel/tests/test_bbb_markup.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# -*- coding: utf-8 -*-
-import unittest2 as unittest
-
-from plone.testing.z2 import Browser
-from plone.app.testing import SITE_OWNER_NAME, SITE_OWNER_PASSWORD
-
-from zope.component import getUtility
-from plone.registry.interfaces import IRegistry
-from Products.CMFPlone.interfaces import IMarkupSchema
-
-from Products.CMFPlone.testing import \
- PRODUCTS_CMFPLONE_INTEGRATION_TESTING
-
-
-class EditingControlPanelAdapterTest(unittest.TestCase):
-
- layer = PRODUCTS_CMFPLONE_INTEGRATION_TESTING
-
- def setUp(self):
- self.app = self.layer['app']
- self.portal = self.layer['portal']
- self.portal_url = self.portal.absolute_url()
- registry = getUtility(IRegistry)
- self.settings = registry.forInterface(IMarkupSchema, prefix="plone")
- self.browser = Browser(self.app)
- self.browser.handleErrors = False
- self.browser.addHeader(
- 'Authorization',
- 'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
- )
-
- def test_default_type(self):
- self.browser.open(
- "%s/@@markup-controlpanel" % self.portal_url)
- self.browser.getControl('Default format').value = ['text/html']
- self.browser.getControl('Save').click()
-
- self.assertEqual(self.settings.default_type, 'text/html')
-
- def test_allowed_types(self):
- self.browser.open(
- "%s/@@markup-controlpanel" % self.portal_url)
- self.browser.getControl(
- name='form.widgets.allowed_types:list'
- ).value = ['text/plain', 'text/x-web-textile']
- self.browser.getControl('Save').click()
-
- self.assertEqual(
- self.settings.allowed_types,
- ('text/plain', 'text/x-web-textile'))
\ No newline at end of file
diff --git a/Products/CMFPlone/controlpanel/tests/test_controlpanel_bbb_markup_adapter.py b/Products/CMFPlone/controlpanel/tests/test_controlpanel_bbb_markup_adapter.py
new file mode 100644
index 0000000..07e5c61
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/tests/test_controlpanel_bbb_markup_adapter.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+from Products.CMFPlone.interfaces import IMarkupSchema
+from Products.CMFPlone.testing import PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+from plone.registry.interfaces import IRegistry
+from zope.component import getUtility
+import unittest2 as unittest
+from plone.app.testing import TEST_USER_ID, setRoles
+from zope.component import getAdapter
+
+
+class MarkupControlPanelAdapterTest(unittest.TestCase):
+
+ layer = PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+
+ def setUp(self):
+ self.app = self.layer['app']
+ self.portal = self.layer['portal']
+ setRoles(self.portal, TEST_USER_ID, ['Manager'])
+ registry = getUtility(IRegistry)
+ self.settings = registry.forInterface(IMarkupSchema, prefix="plone")
+
+ def test_adapter_lookup(self):
+ self.assertTrue(getAdapter(self.portal, IMarkupSchema))
+
+ def test_get_default_type(self):
+# import pdb; pdb.set_trace()
+ self.settings.default_type = 'text/plain'
+ self.assertEquals(
+ getAdapter(self.portal, IMarkupSchema).default_type,
+ 'text/plain'
+ )
+
+ def test_set_default_type(self):
+# import pdb; pdb.set_trace()
+ getAdapter(self.portal, IMarkupSchema).default_type = 'text/plain' # noqa
+ self.assertEquals(
+ self.settings.default_type,
+ 'text/plain'
+ )
+
+ def test_get_allowed_types(self):
+ self.settings.allowed_types = ('text/plain', 'text/x-web-textile')
+# import pdb; pdb.set_trace()
+ self.assertEquals(
+ getAdapter(self.portal, IMarkupSchema).allowed_types,
+ ('text/plain', 'text/x-web-textile')
+ )
+
+ def test_set_allowed_types(self):
+# import pdb; pdb.set_trace()
+ getAdapter(self.portal, IMarkupSchema).allowed_types =\
+ ('text/plain', 'text/x-web-textile')
+ self.assertEquals(
+ self.settings.allowed_types,
+ ('text/plain', 'text/x-web-textile')
+ )
diff --git a/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_markup.py b/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_markup.py
new file mode 100644
index 0000000..2176953
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_markup.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+from Products.CMFPlone.interfaces import IMarkupSchema
+from Products.CMFPlone.testing import PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING
+from plone.app.testing import SITE_OWNER_NAME, SITE_OWNER_PASSWORD
+from plone.registry.interfaces import IRegistry
+from plone.testing.z2 import Browser
+from zope.component import getMultiAdapter
+from zope.component import getUtility
+import unittest2 as unittest
+
+
+class MarkupControlPanelFunctionalTest(unittest.TestCase):
+ """Make sure changes in the markup control panel are properly
+ stored in plone.app.registry.
+ """
+
+ layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING
+
+ def setUp(self):
+ self.app = self.layer['app']
+ self.portal = self.layer['portal']
+ self.portal_url = self.portal.absolute_url()
+ self.browser = Browser(self.app)
+ self.browser.handleErrors = False
+ self.browser.addHeader(
+ 'Authorization',
+ 'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
+ )
+
+ def test_markup_control_panel_link(self):
+ self.browser.open(
+ "%s/plone_control_panel" % self.portal_url)
+ self.browser.getLink('Markup').click()
+
+ def test_markup_control_panel_backlink(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.assertTrue("Plone Configuration" in self.browser.contents)
+
+ def test_markup_control_panel_sidebar(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.browser.getLink('Site Setup').click()
+ self.assertEqual(
+ self.browser.url,
+ 'http://nohost/plone/@@overview-controlpanel')
+
+ def test_markup_controlpanel_view(self):
+ view = getMultiAdapter((self.portal, self.portal.REQUEST),
+ name="markup-controlpanel")
+ view = view.__of__(self.portal)
+ self.assertTrue(view())
+
+ def test_default_type(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.browser.getControl('Default format').value = ['text/plain']
+ self.browser.getControl('Save').click()
+
+ registry = getUtility(IRegistry)
+ settings = registry.forInterface(IMarkupSchema, prefix='plone')
+ self.assertEqual(settings.default_type, 'text/plain')
+
+ def test_allowed_types(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.browser.getControl(
+ name='form.widgets.allowed_types:list'
+ ).value = ['text/html', 'text/x-web-textile']
+ self.browser.getControl('Save').click()
+
+ registry = getUtility(IRegistry)
+ settings = registry.forInterface(IMarkupSchema, prefix='plone')
+ self.assertEqual(settings.allowed_types,
+ ('text/html', 'text/x-web-textile'))
diff --git a/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py b/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
index b048a07..b7c45f6 100644
--- a/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
+++ b/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
@@ -1,20 +1,11 @@
# -*- coding: utf-8 -*-
-import unittest2 as unittest
-
-from plone.testing.z2 import Browser
-from plone.app.testing import SITE_OWNER_NAME, SITE_OWNER_PASSWORD
-
-from plone.registry.interfaces import IRegistry
-from plone.registry import Registry
-from Products.CMFPlone.interfaces import IMarkupSchema
-
-from zope.component import getMultiAdapter, getUtility
-
from Products.CMFCore.utils import getToolByName
-
-from plone.app.testing import TEST_USER_ID, setRoles
-
+from Products.CMFPlone.interfaces import IMarkupSchema
from Products.CMFPlone.testing import PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+from plone.registry.interfaces import IRegistry
+from zope.component import getMultiAdapter
+from zope.component import getUtility
+import unittest2 as unittest
class MarkupRegistryIntegrationTest(unittest.TestCase):
@@ -26,38 +17,24 @@ class MarkupRegistryIntegrationTest(unittest.TestCase):
def setUp(self):
self.portal = self.layer['portal']
self.request = self.layer['request']
-# setRoles(self.portal, TEST_USER_ID, ['Manager'])
-
registry = getUtility(IRegistry)
-# self.registry.registerInterface(IMarkupSchema)
- self.settings = registry.forInterface(
- IMarkupSchema, prefix="plone")
+ self.settings = registry.forInterface(IMarkupSchema, prefix="plone")
def test_markup_controlpanel_view(self):
- view = getMultiAdapter(
- (self.portal, self.portal.REQUEST),
- name="markup-controlpanel"
- )
+ view = getMultiAdapter((self.portal, self.portal.REQUEST),
+ name="markup-controlpanel")
view = view.__of__(self.portal)
self.assertTrue(view())
- def test_plone_app_registry_in_controlpanel(self):
+ def test_markup_in_controlpanel(self):
self.controlpanel = getToolByName(self.portal, "portal_controlpanel")
- self.assertTrue(
- 'plone.app.registry' in [a.getAction(self)['id']
- for a in self.controlpanel.listActions()]
- )
-
- def test_default_type_setting(self):
- self.assertTrue('default_type' in IMarkupSchema.names())
- self.assertEqual(
- self.settings.default_type,
- 'text/html'
- )
-
- def test_allowed_types_setting(self):
- self.assertTrue('allowed_types' in IMarkupSchema.names())
- self.assertEqual(
- self.settings.allowed_types,
- ('text/html', 'text/x-web-textile')
- )
+ self.assertTrue('MarkupSettings' in [
+ a.getAction(self)['id']
+ for a in self.controlpanel.listActions()
+ ])
+
+ def test_default_type_exists(self):
+ self.assertTrue(hasattr(self.settings, 'default_type'))
+
+ def test_allowed_types_exists(self):
+ self.assertTrue(hasattr(self.settings, 'allowed_types'))
diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
index 1eb60ea..65f090e 100644
--- a/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
+++ b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
@@ -1,3 +1,7 @@
+Documentation
+... $ bin/robot-server Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING
+... $ bin/robot test_controlpanel_markup.robot
+
*** Settings *****************************************************************
Resource plone/app/robotframework/keywords.robot
@@ -17,22 +21,20 @@ Scenario: Change Default Markup Types in the Markup Control Panel
Given a logged-in site administrator
and the markup control panel
When I set allowed types to "text/restructured"
- Then I do not see the standard editor when I create a document
+#TODO: Waiting on richtext pattern to support this
+# Then I do not see the standard editor when I create a document
Scenario: Set Default Markup to be Restructured Text
Given a logged-in site administrator
and the markup control panel
When I set the default type to "text/restructured"
- Then I do not see the standard editor when I create a document
-
+#TODO: Waiting on richtext pattern to support this
+# Then I do not see the standard editor when I create a document
*** Keywords *****************************************************************
# --- GIVEN ------------------------------------------------------------------
-a logged-in site administrator
- Enable autologin as Site Administrator
-
a document '${title}'
Create content type=Document id=doc title=${title}
@@ -49,6 +51,10 @@ I set allowed types to "${type}"
Click Button Save
Wait until page contains Changes saved
+I set the default type to "${type}"
+ Select from list by label name=form.widgets.default_type:list ${type}
+ Click Button Save
+ Wait until page contains Changes saved
I disable the standard editor
Select from list by label name=form.widgets.default_editor:list None
Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-11-14T12:05:26+01:00
Author: Johannes Raggam (thet) <raggam-nl at adm.at>
Commit: https://github.com/plone/Products.CMFPlone/commit/7e9814be75556394072a30371af1a9a57912ba99
increase profile version for new upgrade steps
Files changed:
M Products/CMFPlone/profiles/default/metadata.xml
diff --git a/Products/CMFPlone/profiles/default/metadata.xml b/Products/CMFPlone/profiles/default/metadata.xml
index 986ec19..679ff60 100644
--- a/Products/CMFPlone/profiles/default/metadata.xml
+++ b/Products/CMFPlone/profiles/default/metadata.xml
@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<metadata>
- <version>5003</version>
+ <version>5004</version>
</metadata>
Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-11-14T16:28:24+01:00
Author: Johannes Raggam (thet) <raggam-nl at adm.at>
Commit: https://github.com/plone/Products.CMFPlone/commit/c225702733dedac0bb9edf9872a17f72cfa91dba
Merge branch 'markup_controlpanel_squashed'
Conflicts:
Products/CMFPlone/interfaces/__init__.py
Files changed:
A Products/CMFPlone/controlpanel/bbb/markup.py
A Products/CMFPlone/controlpanel/browser/markup.py
A Products/CMFPlone/controlpanel/tests/test_controlpanel_bbb_markup_adapter.py
A Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_markup.py
A Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
A Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
M CHANGES.rst
M Products/CMFPlone/controlpanel/README.rst
M Products/CMFPlone/controlpanel/bbb/configure.zcml
M Products/CMFPlone/controlpanel/browser/configure.zcml
M Products/CMFPlone/interfaces/__init__.py
M Products/CMFPlone/interfaces/controlpanel.py
M Products/CMFPlone/profiles/default/metadata.xml
M Products/CMFPlone/profiles/dependencies/registry.xml
diff --git a/CHANGES.rst b/CHANGES.rst
index e240a86..7feb62f 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -8,6 +8,9 @@ Changelog
5.0b1 (unreleased)
------------------
+- Move markup control panel to CMFPlone. Fixes #220.
+ [djay, thet]
+
- Use jstz to set default portal_timezone in @@plone-addsite.
[instification]
diff --git a/Products/CMFPlone/controlpanel/README.rst b/Products/CMFPlone/controlpanel/README.rst
index 9e49bcf..ab497d2 100644
--- a/Products/CMFPlone/controlpanel/README.rst
+++ b/Products/CMFPlone/controlpanel/README.rst
@@ -84,3 +84,13 @@ Overview Control Panel
>>> from Products.CMFPlone.interfaces.controlpanel import IDateAndTimeSchema
>>> tz_settings = registry.forInterface(IDateAndTimeSchema, prefix='plone')
>>> tz_settings.portal_timezone = 'UTC'
+
+
+Markup Control Panel
+------------------------
+
+ >>> from Products.CMFPlone.interfaces import IMarkupSchema
+ >>> markup_settings = registry.forInterface(IMarkupSchema, prefix='plone')
+
+ >>> markup_settings.default_type = True
+ >>> markup_settings.allowed_types = True
diff --git a/Products/CMFPlone/controlpanel/bbb/configure.zcml b/Products/CMFPlone/controlpanel/bbb/configure.zcml
index c647f0b..dc8d0ba 100644
--- a/Products/CMFPlone/controlpanel/bbb/configure.zcml
+++ b/Products/CMFPlone/controlpanel/bbb/configure.zcml
@@ -8,5 +8,6 @@
<adapter factory=".navigation.NavigationControlPanelAdapter" />
<adapter factory=".search.SearchControlPanelAdapter" />
<adapter factory=".site.SiteControlPanelAdapter" />
+ <adapter factory=".markup.MarkupControlPanelAdapter" />
</configure>
diff --git a/Products/CMFPlone/controlpanel/bbb/markup.py b/Products/CMFPlone/controlpanel/bbb/markup.py
new file mode 100644
index 0000000..ed2a185
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/bbb/markup.py
@@ -0,0 +1,32 @@
+from Products.CMFPlone.interfaces import IMarkupSchema
+from Products.CMFPlone.interfaces.siteroot import IPloneSiteRoot
+from plone.registry.interfaces import IRegistry
+from zope.component import adapts
+from zope.component import getUtility
+from zope.interface import implements
+
+
+class MarkupControlPanelAdapter(object):
+
+ adapts(IPloneSiteRoot)
+ implements(IMarkupSchema)
+
+ def __init__(self, context):
+ registry = getUtility(IRegistry)
+ self.settings = registry.forInterface(IMarkupSchema, prefix="plone")
+
+ @property
+ def default_type(self):
+ return self.settings.default_type
+
+ @default_type.setter
+ def default_type(self, value):
+ self.settings.default_type = value
+
+ @property
+ def allowed_types(self):
+ return self.settings.allowed_types
+
+ @allowed_types.setter
+ def allowed_types(self, value):
+ self.settings.allowed_types = value
diff --git a/Products/CMFPlone/controlpanel/browser/configure.zcml b/Products/CMFPlone/controlpanel/browser/configure.zcml
index 3f548cd..1e3a13e 100644
--- a/Products/CMFPlone/controlpanel/browser/configure.zcml
+++ b/Products/CMFPlone/controlpanel/browser/configure.zcml
@@ -90,4 +90,12 @@
template="resourceregistry.pt"
/>
+ <!-- Markup Control Panel -->
+ <browser:page
+ name="markup-controlpanel"
+ for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+ class=".markup.MarkupControlPanel"
+ permission="plone.app.controlpanel.Markup"
+ />
+
</configure>
diff --git a/Products/CMFPlone/controlpanel/browser/markup.py b/Products/CMFPlone/controlpanel/browser/markup.py
new file mode 100644
index 0000000..54ced9e
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/browser/markup.py
@@ -0,0 +1,21 @@
+from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.interfaces import IMarkupSchema
+from plone.app.registry.browser import controlpanel
+from z3c.form.browser.checkbox import CheckBoxFieldWidget
+
+
+class MarkupControlPanelForm(controlpanel.RegistryEditForm):
+
+ id = "MarkupControlPanel"
+ label = _(u"Markup settings")
+ schema = IMarkupSchema
+ schema_prefix = "plone"
+
+ def updateFields(self):
+ super(MarkupControlPanelForm, self).updateFields()
+ self.fields['allowed_types'].widgetFactory = \
+ CheckBoxFieldWidget
+
+
+class MarkupControlPanel(controlpanel.ControlPanelFormWrapper):
+ form = MarkupControlPanelForm
diff --git a/Products/CMFPlone/controlpanel/tests/test_controlpanel_bbb_markup_adapter.py b/Products/CMFPlone/controlpanel/tests/test_controlpanel_bbb_markup_adapter.py
new file mode 100644
index 0000000..07e5c61
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/tests/test_controlpanel_bbb_markup_adapter.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+from Products.CMFPlone.interfaces import IMarkupSchema
+from Products.CMFPlone.testing import PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+from plone.registry.interfaces import IRegistry
+from zope.component import getUtility
+import unittest2 as unittest
+from plone.app.testing import TEST_USER_ID, setRoles
+from zope.component import getAdapter
+
+
+class MarkupControlPanelAdapterTest(unittest.TestCase):
+
+ layer = PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+
+ def setUp(self):
+ self.app = self.layer['app']
+ self.portal = self.layer['portal']
+ setRoles(self.portal, TEST_USER_ID, ['Manager'])
+ registry = getUtility(IRegistry)
+ self.settings = registry.forInterface(IMarkupSchema, prefix="plone")
+
+ def test_adapter_lookup(self):
+ self.assertTrue(getAdapter(self.portal, IMarkupSchema))
+
+ def test_get_default_type(self):
+# import pdb; pdb.set_trace()
+ self.settings.default_type = 'text/plain'
+ self.assertEquals(
+ getAdapter(self.portal, IMarkupSchema).default_type,
+ 'text/plain'
+ )
+
+ def test_set_default_type(self):
+# import pdb; pdb.set_trace()
+ getAdapter(self.portal, IMarkupSchema).default_type = 'text/plain' # noqa
+ self.assertEquals(
+ self.settings.default_type,
+ 'text/plain'
+ )
+
+ def test_get_allowed_types(self):
+ self.settings.allowed_types = ('text/plain', 'text/x-web-textile')
+# import pdb; pdb.set_trace()
+ self.assertEquals(
+ getAdapter(self.portal, IMarkupSchema).allowed_types,
+ ('text/plain', 'text/x-web-textile')
+ )
+
+ def test_set_allowed_types(self):
+# import pdb; pdb.set_trace()
+ getAdapter(self.portal, IMarkupSchema).allowed_types =\
+ ('text/plain', 'text/x-web-textile')
+ self.assertEquals(
+ self.settings.allowed_types,
+ ('text/plain', 'text/x-web-textile')
+ )
diff --git a/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_markup.py b/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_markup.py
new file mode 100644
index 0000000..2176953
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_markup.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+from Products.CMFPlone.interfaces import IMarkupSchema
+from Products.CMFPlone.testing import PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING
+from plone.app.testing import SITE_OWNER_NAME, SITE_OWNER_PASSWORD
+from plone.registry.interfaces import IRegistry
+from plone.testing.z2 import Browser
+from zope.component import getMultiAdapter
+from zope.component import getUtility
+import unittest2 as unittest
+
+
+class MarkupControlPanelFunctionalTest(unittest.TestCase):
+ """Make sure changes in the markup control panel are properly
+ stored in plone.app.registry.
+ """
+
+ layer = PRODUCTS_CMFPLONE_FUNCTIONAL_TESTING
+
+ def setUp(self):
+ self.app = self.layer['app']
+ self.portal = self.layer['portal']
+ self.portal_url = self.portal.absolute_url()
+ self.browser = Browser(self.app)
+ self.browser.handleErrors = False
+ self.browser.addHeader(
+ 'Authorization',
+ 'Basic %s:%s' % (SITE_OWNER_NAME, SITE_OWNER_PASSWORD,)
+ )
+
+ def test_markup_control_panel_link(self):
+ self.browser.open(
+ "%s/plone_control_panel" % self.portal_url)
+ self.browser.getLink('Markup').click()
+
+ def test_markup_control_panel_backlink(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.assertTrue("Plone Configuration" in self.browser.contents)
+
+ def test_markup_control_panel_sidebar(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.browser.getLink('Site Setup').click()
+ self.assertEqual(
+ self.browser.url,
+ 'http://nohost/plone/@@overview-controlpanel')
+
+ def test_markup_controlpanel_view(self):
+ view = getMultiAdapter((self.portal, self.portal.REQUEST),
+ name="markup-controlpanel")
+ view = view.__of__(self.portal)
+ self.assertTrue(view())
+
+ def test_default_type(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.browser.getControl('Default format').value = ['text/plain']
+ self.browser.getControl('Save').click()
+
+ registry = getUtility(IRegistry)
+ settings = registry.forInterface(IMarkupSchema, prefix='plone')
+ self.assertEqual(settings.default_type, 'text/plain')
+
+ def test_allowed_types(self):
+ self.browser.open(
+ "%s/@@markup-controlpanel" % self.portal_url)
+ self.browser.getControl(
+ name='form.widgets.allowed_types:list'
+ ).value = ['text/html', 'text/x-web-textile']
+ self.browser.getControl('Save').click()
+
+ registry = getUtility(IRegistry)
+ settings = registry.forInterface(IMarkupSchema, prefix='plone')
+ self.assertEqual(settings.allowed_types,
+ ('text/html', 'text/x-web-textile'))
diff --git a/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py b/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
new file mode 100644
index 0000000..b7c45f6
--- /dev/null
+++ b/Products/CMFPlone/controlpanel/tests/test_controlpanel_markup.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+from Products.CMFCore.utils import getToolByName
+from Products.CMFPlone.interfaces import IMarkupSchema
+from Products.CMFPlone.testing import PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+from plone.registry.interfaces import IRegistry
+from zope.component import getMultiAdapter
+from zope.component import getUtility
+import unittest2 as unittest
+
+
+class MarkupRegistryIntegrationTest(unittest.TestCase):
+ """Test plone.app.registry based markup storage.
+ """
+
+ layer = PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+
+ def setUp(self):
+ self.portal = self.layer['portal']
+ self.request = self.layer['request']
+ registry = getUtility(IRegistry)
+ self.settings = registry.forInterface(IMarkupSchema, prefix="plone")
+
+ def test_markup_controlpanel_view(self):
+ view = getMultiAdapter((self.portal, self.portal.REQUEST),
+ name="markup-controlpanel")
+ view = view.__of__(self.portal)
+ self.assertTrue(view())
+
+ def test_markup_in_controlpanel(self):
+ self.controlpanel = getToolByName(self.portal, "portal_controlpanel")
+ self.assertTrue('MarkupSettings' in [
+ a.getAction(self)['id']
+ for a in self.controlpanel.listActions()
+ ])
+
+ def test_default_type_exists(self):
+ self.assertTrue(hasattr(self.settings, 'default_type'))
+
+ def test_allowed_types_exists(self):
+ self.assertTrue(hasattr(self.settings, 'allowed_types'))
diff --git a/Products/CMFPlone/interfaces/__init__.py b/Products/CMFPlone/interfaces/__init__.py
index 555d40e..35b0069 100644
--- a/Products/CMFPlone/interfaces/__init__.py
+++ b/Products/CMFPlone/interfaces/__init__.py
@@ -9,6 +9,7 @@
from controlpanel import IDateAndTimeSchema
from controlpanel import IEditingSchema
from controlpanel import IMaintenanceSchema
+from controlpanel import IMarkupSchema
from controlpanel import INavigationSchema
from controlpanel import ISearchSchema
from controlpanel import ISiteSchema
diff --git a/Products/CMFPlone/interfaces/controlpanel.py b/Products/CMFPlone/interfaces/controlpanel.py
index 36b4b9c..01a0816 100644
--- a/Products/CMFPlone/interfaces/controlpanel.py
+++ b/Products/CMFPlone/interfaces/controlpanel.py
@@ -871,3 +871,33 @@ class IDateAndTimeSchema(Interface):
class ITypesSchema(Interface):
"""
"""
+
+
+class IMarkupSchema(Interface):
+
+ default_type = schema.Choice(
+ title=_(u'Default format'),
+ description=_(
+ u"Select the default format of textfields for newly "
+ u"created content objects."
+ ),
+ default=u'text/html',
+ vocabulary="plone.app.vocabularies.AllowableContentTypes",
+ required=True
+ )
+
+ allowed_types = schema.Tuple(
+ title=_(u'Alternative formats'),
+ description=_(
+ u"Select which formats are available for users as "
+ u"alternative to the default format. Note that if new "
+ u"formats are installed, they will be enabled for text "
+ u"fields by default unless explicitly turned off here "
+ u"or by the relevant installer."
+ ),
+ required=True,
+ default=('text/html', 'text/x-web-textile'),
+ value_type=schema.Choice(
+ vocabulary="plone.app.vocabularies.AllowableContentTypes"
+ )
+ )
diff --git a/Products/CMFPlone/profiles/default/metadata.xml b/Products/CMFPlone/profiles/default/metadata.xml
index 986ec19..679ff60 100644
--- a/Products/CMFPlone/profiles/default/metadata.xml
+++ b/Products/CMFPlone/profiles/default/metadata.xml
@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<metadata>
- <version>5003</version>
+ <version>5004</version>
</metadata>
diff --git a/Products/CMFPlone/profiles/dependencies/registry.xml b/Products/CMFPlone/profiles/dependencies/registry.xml
index 29d27ec..47f0569 100644
--- a/Products/CMFPlone/profiles/dependencies/registry.xml
+++ b/Products/CMFPlone/profiles/dependencies/registry.xml
@@ -12,6 +12,8 @@
prefix="plone" />
<records interface="Products.CMFPlone.interfaces.IDateAndTimeSchema"
prefix="plone" />
+ <records interface="Products.CMFPlone.interfaces.IMarkupSchema"
+ prefix="plone" />
<record interface="Products.ResourceRegistries.interfaces.settings.IResourceRegistriesSettings" field="resourceBundlesForThemes">
<value purge="false">
<element key="(default)">
diff --git a/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
new file mode 100644
index 0000000..65f090e
--- /dev/null
+++ b/Products/CMFPlone/tests/robot/test_controlpanel_markup.robot
@@ -0,0 +1,96 @@
+Documentation
+... $ bin/robot-server Products.CMFPlone.testing.PRODUCTS_CMFPLONE_ROBOT_TESTING
+... $ bin/robot test_controlpanel_markup.robot
+
+*** Settings *****************************************************************
+
+Resource plone/app/robotframework/keywords.robot
+Resource plone/app/robotframework/saucelabs.robot
+
+Library Remote ${PLONE_URL}/RobotRemote
+
+Resource keywords.robot
+
+Test Setup Open SauceLabs test browser
+Test Teardown Run keywords Report test status Close all browsers
+
+
+*** Test Cases ***************************************************************
+
+Scenario: Change Default Markup Types in the Markup Control Panel
+ Given a logged-in site administrator
+ and the markup control panel
+ When I set allowed types to "text/restructured"
+#TODO: Waiting on richtext pattern to support this
+# Then I do not see the standard editor when I create a document
+
+Scenario: Set Default Markup to be Restructured Text
+ Given a logged-in site administrator
+ and the markup control panel
+ When I set the default type to "text/restructured"
+#TODO: Waiting on richtext pattern to support this
+# Then I do not see the standard editor when I create a document
+
+*** Keywords *****************************************************************
+
+# --- GIVEN ------------------------------------------------------------------
+
+a document '${title}'
+ Create content type=Document id=doc title=${title}
+
+the markup control panel
+ Go to ${PLONE_URL}/@@markup-controlpanel
+
+
+# --- WHEN -------------------------------------------------------------------
+
+I set allowed types to "${type}"
+ with the label text/html UnSelect Checkbox
+ with the label text/x-web-textile UnSelect Checkbox
+ with the label ${type} Select Checkbox
+ Click Button Save
+ Wait until page contains Changes saved
+
+I set the default type to "${type}"
+ Select from list by label name=form.widgets.default_type:list ${type}
+ Click Button Save
+ Wait until page contains Changes saved
+
+I disable the standard editor
+ Select from list by label name=form.widgets.default_editor:list None
+ Click Button Save
+ Wait until page contains Changes saved
+
+
+# --- THEN -------------------------------------------------------------------
+
+Then I can see only "${type}" when creating a document
+ Go To ${PLONE_URL}/++add++Document
+ Wait until page contains Add Page
+ with the label Title Input Text My Document
+ Click Link Settings
+ Page should contain element name=form.widgets.IShortName.id
+ Input Text name=form.widgets.IShortName.id this-is-my-custom-short-name
+ Click Button Save
+ Wait until page contains Item created
+ Location should be ${PLONE_URL}/this-is-my-custom-short-name/view
+
+I do not see the standard editor when I create a document
+ Go To ${PLONE_URL}/++add++Document
+ Wait until page contains Add Page
+ Page should not contain element css=.mce-tinymce
+
+# --- Helpers -----------------------------------------------------------------
+
+With the label
+ [arguments] ${title} ${extra_keyword} @{list}
+ ${for}= label "${title}"
+ Run Keyword ${extra_keyword} id=${for} @{list}
+
+label "${title}"
+ [Return] ${for}
+ ${for}= Get Element Attribute xpath=//label[contains(., "${title}")]@for
+
+label2 "${title}"
+ [Return] ${for}
+ ${for}= Get Element Attribute xpath=//label[contains(., "${title}")]//input
Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-11-14T16:29:44+01:00
Author: Johannes Raggam (thet) <raggam-nl at adm.at>
Commit: https://github.com/plone/Products.CMFPlone/commit/e8474b948f898d1e42bd0fb7b6b814f6c936de7d
Merge branch 'master' of git://github.com/plone/Products.CMFPlone
Files changed:
M Products/CMFPlone/profiles/dependencies/registry.xml
M Products/CMFPlone/skins/plone_login/failsafe_login_form.cpt
M Products/CMFPlone/skins/plone_login/logged_out.cpt
M Products/CMFPlone/skins/plone_login/login_failed.cpt
M Products/CMFPlone/skins/plone_login/login_form.cpt
M Products/CMFPlone/skins/plone_login/registered.pt
M Products/CMFPlone/static/plone.js
D Products/CMFPlone/skins/plone_ecmascript/login.js
diff --git a/Products/CMFPlone/profiles/dependencies/registry.xml b/Products/CMFPlone/profiles/dependencies/registry.xml
index 47f0569..bd110f3 100644
--- a/Products/CMFPlone/profiles/dependencies/registry.xml
+++ b/Products/CMFPlone/profiles/dependencies/registry.xml
@@ -657,6 +657,11 @@
<value key="js">++resource++mockup/backdrop/pattern.js</value>
</records>
+ <records prefix="plone.resources/mockup-patterns-cookietrigger"
+ interface='Products.CMFPlone.interfaces.IResourceRegistry'>
+ <value key="js">++resource++mockup/cookietrigger/pattern.js</value>
+ </records>
+
<records prefix="plone.resources/mockup-patterns-sortable"
interface='Products.CMFPlone.interfaces.IResourceRegistry'>
<value key="js">++resource++mockup/sortable/pattern.js</value>
diff --git a/Products/CMFPlone/skins/plone_ecmascript/login.js b/Products/CMFPlone/skins/plone_ecmascript/login.js
deleted file mode 100644
index a66dc13..0000000
--- a/Products/CMFPlone/skins/plone_ecmascript/login.js
+++ /dev/null
@@ -1,74 +0,0 @@
-// Functions used by login pages
-
-function cookiesEnabled() {
- // Test whether cookies are enabled by attempting to set a cookie and then change its value
- // set test cookie
- var c = "areYourCookiesEnabled=0";
- document.cookie = c;
- var dc = document.cookie;
- // cookie not set? fail
- if (dc.indexOf(c) == -1) return 0;
- // change test cookie
- c = "areYourCookiesEnabled=1";
- document.cookie = c;
- dc = document.cookie;
- // cookie not changed? fail
- if (dc.indexOf(c) == -1) return 0;
- // delete cookie
- document.cookie = "areYourCookiesEnabled=; expires=Thu, 01-Jan-70 00:00:01 GMT";
- return 1;
-}
-
-function setLoginVars(user_name_id, alt_user_name_id, password_id, empty_password_id, js_enabled_id, cookies_enabled_id) {
- // Indicate that javascript is enabled, set cookie status, copy username and password length info to
- // alternative variables since these vars are removed from the request by zope's authentication mechanism.
- if (js_enabled_id) {
- el = document.getElementById(js_enabled_id);
- if (el) { el.value = 1; }
- }
- if (cookies_enabled_id) {
- el = document.getElementById(cookies_enabled_id);
- // Do a fresh cookies enabled test every time we press the login button
- // so that we are up to date in case the user enables cookies after seeing
- // the cookies message.
- if (el) { el.value = cookiesEnabled(); }
- }
- if (user_name_id && alt_user_name_id) {
- user_name = document.getElementById(user_name_id)
- alt_user_name = document.getElementById(alt_user_name_id)
- if (user_name && alt_user_name) {
- alt_user_name.value = user_name.value;
- }
- }
- if (password_id && empty_password_id) {
- password = document.getElementById(password_id)
- empty_password = document.getElementById(empty_password_id)
- if (password && empty_password) {
- if (password.value.length==0) {
- empty_password.value = '1';
- } else {
- empty_password.value = '0';
- }
- }
- }
- return 1;
-}
-
-function showCookieMessage(msg_id) {
- // Show the element with the given id if cookies are not enabled
- msg = document.getElementById(msg_id)
- if (msg) {
- if (cookiesEnabled()) {
- msg.style.display = 'none';
- } else {
- msg.style.display = 'block';
- }
- }
-}
-
-function showEnableCookiesMessage() {
- // Show the element with the id 'enable_cookies_message' if cookies are not enabled
- showCookieMessage('enable_cookies_message')
-}
-// Call showEnableCookiesMessage after the page loads
-jQuery(showEnableCookiesMessage);
diff --git a/Products/CMFPlone/skins/plone_login/failsafe_login_form.cpt b/Products/CMFPlone/skins/plone_login/failsafe_login_form.cpt
index 224707e..7a58954 100644
--- a/Products/CMFPlone/skins/plone_login/failsafe_login_form.cpt
+++ b/Products/CMFPlone/skins/plone_login/failsafe_login_form.cpt
@@ -43,9 +43,7 @@ If you do not have an account here, head over to the
</p>
-<div class="portalMessage error"
- id="enable_cookies_message"
- style="display:none">
+<div class="portalMessage error pat-cookietrigger" style="display:none">
<strong i18n:translate="">
Error
</strong>
diff --git a/Products/CMFPlone/skins/plone_login/logged_out.cpt b/Products/CMFPlone/skins/plone_login/logged_out.cpt
index b05ea0f..e00fbcf 100644
--- a/Products/CMFPlone/skins/plone_login/logged_out.cpt
+++ b/Products/CMFPlone/skins/plone_login/logged_out.cpt
@@ -6,11 +6,6 @@
i18n:domain="plone">
<head>
- <metal:js fill-slot="javascript_head_slot">
- <script type="text/javascript" src=""
- tal:attributes="src string:${context/portal_url}/login.js">
- </script>
- </metal:js>
<metal:block fill-slot="top_slot"
tal:define="dummy python:request.set('disable_border',1);
disable_column_one python:request.set('disable_plone.leftcolumn',1);
diff --git a/Products/CMFPlone/skins/plone_login/login_failed.cpt b/Products/CMFPlone/skins/plone_login/login_failed.cpt
index 48a9e0a..6a35335 100644
--- a/Products/CMFPlone/skins/plone_login/login_failed.cpt
+++ b/Products/CMFPlone/skins/plone_login/login_failed.cpt
@@ -7,11 +7,6 @@
i18n:domain="plone">
<head>
- <metal:js fill-slot="javascript_head_slot">
- <script type="text/javascript" src=""
- tal:attributes="src string:${context/portal_url}/login.js">
- </script>
- </metal:js>
<metal:block fill-slot="top_slot"
tal:define="dummy python:request.set('disable_border',1);
disable_column_one python:request.set('disable_plone.leftcolumn',1);
diff --git a/Products/CMFPlone/skins/plone_login/login_form.cpt b/Products/CMFPlone/skins/plone_login/login_form.cpt
index 9da9e5a..bbf7c07 100644
--- a/Products/CMFPlone/skins/plone_login/login_form.cpt
+++ b/Products/CMFPlone/skins/plone_login/login_form.cpt
@@ -6,11 +6,6 @@
i18n:domain="plone">
<head>
- <metal:js fill-slot="javascript_head_slot">
- <script type="text/javascript" src=""
- tal:attributes="src string:${context/portal_url}/login.js">
- </script>
- </metal:js>
<metal:block fill-slot="top_slot"
tal:define="dummy python:request.set('disable_border',1);
disable_column_one python:request.set('disable_plone.leftcolumn',1);
@@ -55,9 +50,7 @@
target python:test(target in ('_parent', '_top', '_blank', '_self'), target, None);
ztu modules/ZTUtils;">
- <div class="portalMessage error"
- id="enable_cookies_message"
- style="display:none">
+ <div class="portalMessage error pat-cookietrigger" style="display:none">
<strong i18n:translate="">
Error
</strong>
diff --git a/Products/CMFPlone/skins/plone_login/registered.pt b/Products/CMFPlone/skins/plone_login/registered.pt
index 59ac0df..a8fe7e1 100644
--- a/Products/CMFPlone/skins/plone_login/registered.pt
+++ b/Products/CMFPlone/skins/plone_login/registered.pt
@@ -45,9 +45,7 @@
Click the button to log in immediately.
</p>
- <div class="portalMessage error"
- id="enable_cookies_message"
- style="display:none">
+ <div class="portalMessage error pat-cookietrigger" style="display:none">
<strong i18n:translate="">
Error
</strong>
diff --git a/Products/CMFPlone/static/plone.js b/Products/CMFPlone/static/plone.js
index b79b820..ab9b442 100644
--- a/Products/CMFPlone/static/plone.js
+++ b/Products/CMFPlone/static/plone.js
@@ -34,6 +34,7 @@ require([
'plone-patterns-toolbar',
'mockup-patterns-accessibility',
'mockup-patterns-autotoc',
+ 'mockup-patterns-cookietrigger',
'mockup-patterns-formunloadalert',
'mockup-patterns-preventdoublesubmit',
'mockup-patterns-inlinevalidation',
-------------------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CHANGES.log
Type: application/octet-stream
Size: 64662 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20141114/cd3c5dde/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: build.log
Type: application/octet-stream
Size: 85906 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20141114/cd3c5dde/attachment-0003.obj>
More information about the Testbot
mailing list