Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Coredev docs #22

Merged
merged 22 commits into from
Mar 27, 2012
Merged

Coredev docs #22

merged 22 commits into from
Mar 27, 2012

Conversation

eleddy
Copy link
Member

@eleddy eleddy commented Mar 27, 2012

moving developer docs into the coredev buildout. Still need to have these validated by more people but want to get read the docs working on master

eleddy added a commit that referenced this pull request Mar 27, 2012
@eleddy eleddy merged commit 2ecdd0b into 4.2 Mar 27, 2012
@jensens jensens deleted the coredev_docs branch October 14, 2014 08:03
tisto referenced this pull request Jan 6, 2015
Branch: refs/heads/master
Date: 2014-12-10T10:32:22+01:00
Author: Tom Gross (tomgross) <itconsense@gmail.com>
Commit: https://github.com/plone/plone.app.upgrade/commit/dc181409b1e45cfd6feb3f47ebb1499a0fa72436

updated egg classifiers

Files changed:
M setup.py

diff --git a/setup.py b/setup.py
index 1dd33a5..ab8b563 100644
--- a/setup.py
+++ b/setup.py
@@ -10,10 +10,12 @@
       classifiers=[
           "Environment :: Web Environment",
           "Framework :: Plone",
+          "Framework :: Plone :: 5.0",
           "Framework :: Zope2",
           "License :: OSI Approved :: GNU General Public License (GPL)",
           "Operating System :: OS Independent",
           "Programming Language :: Python",
+          "Programming Language :: Python :: 2.7",
         ],
       keywords='Plone upgrade migration',
       author='Plone Foundation',


Repository: plone.app.upgrade
Branch: refs/heads/master
Date: 2014-12-10T11:08:00+01:00
Author: Tom Gross (tomgross) <itconsense@gmail.com>
Commit: https://github.com/plone/plone.app.upgrade/commit/3419d3f9144c89f3164eb3c80257a2be8a170e88

remove traces of PloneTestCase

Files changed:
M plone/app/upgrade/tests/base.py
M setup.py

diff --git a/plone/app/upgrade/tests/base.py b/plone/app/upgrade/tests/base.py
index 840416c..f25f530 100644
--- a/plone/app/upgrade/tests/base.py
+++ b/plone/app/upgrade/tests/base.py
@@ -9,10 +9,7 @@
 import transaction
 from zope.site.hooks import setSite
 
-from Testing.ZopeTestCase.sandbox import Sandboxed
-from Products.PloneTestCase.layer import PloneSiteLayer
-from Products.PloneTestCase.ptc import PloneTestCase
-from Products.PloneTestCase.ptc import setupPloneSite
+from plone.app.testing.bbb import PloneTestCase
 
 from Products.CMFCore.interfaces import IActionCategory
 from Products.CMFCore.interfaces import IActionInfo
@@ -20,8 +17,6 @@
 from Products.CMFCore.tests.base.testcase import WarningInterceptor
 from Products.GenericSetup.context import TarballImportContext
 
-setupPloneSite()
-
 
 class MigrationTest(PloneTestCase):
 
@@ -111,21 +106,10 @@ def removeSkinLayer(self, layer, skin='Plone Default'):
             skins.addSkinSelection(skin, ','.join(path))
 
 
-class FunctionalUpgradeLayer(PloneSiteLayer):
-
-    @classmethod
-    def setUp(cls):
-        pass
-
-    @classmethod
-    def tearDown(cls):
-        pass
-
 
-class FunctionalUpgradeTestCase(Sandboxed, PloneTestCase, WarningInterceptor):
+class FunctionalUpgradeTestCase(PloneTestCase, WarningInterceptor):
 
     _setup_fixture = 0
-    layer = FunctionalUpgradeLayer
     site_id = 'test'
 
     def afterSetUp(self):
diff --git a/setup.py b/setup.py
index ab8b563..1a44248 100644
--- a/setup.py
+++ b/setup.py
@@ -30,13 +30,13 @@
         test=[
             'Products.CMFPlacefulWorkflow',
             'Products.CMFQuickInstallerTool',
-            'Products.PloneTestCase',
             'plone.contentrules',
             'plone.app.i18n',
             'plone.app.iterate',
             'plone.app.openid',
             'plone.app.redirector',
             'plone.app.viewletmanager',
+            'plone.app.testing',
             'plone.app.theming',
         ]
       ),


Repository: plone.app.upgrade
Branch: refs/heads/master
Date: 2014-12-11T13:26:23+01:00
Author: Tom Gross (tomgross) <itconsense@gmail.com>
Commit: https://github.com/plone/plone.app.upgrade/commit/f89ec3961373c568f79ede8d07b212a8f724e027

removed all tests for migrations older than 4.3 -&gt; 5.0

Files changed:
M CHANGES.rst
M setup.py
D plone/app/upgrade/v25/tests.py
D plone/app/upgrade/v30/tests.py
D plone/app/upgrade/v31/tests.py
D plone/app/upgrade/v32/tests.py
D plone/app/upgrade/v33/tests.py
D plone/app/upgrade/v40/tests.py
D plone/app/upgrade/v41/tests.py
D plone/app/upgrade/v42/tests.py

diff --git a/CHANGES.rst b/CHANGES.rst
index 66d69fd..f6874cf 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,12 +1,17 @@
 Changelog
 =========
 
-1.3.9 (unreleased)
+2.0 (unreleased)
 ------------------
 
 - Add upgrade steps for markup control panel.
   [thet]
 
+- Ported tests to plone.app.testing
+  [tomgross]
+
+- Removed all tests for migrations older than 4.3 -> 5.0
+  [tomgross]
 
 1.3.8 (2014-11-01)
 ------------------
diff --git a/plone/app/upgrade/v25/tests.py b/plone/app/upgrade/v25/tests.py
deleted file mode 100644
index 036e8b5..0000000
--- a/plone/app/upgrade/v25/tests.py
+++ /dev/null
@@ -1,124 +0,0 @@
-from Products.CMFPlone.UnicodeSplitter import Splitter
-from Products.CMFPlone.UnicodeSplitter import CaseNormalizer
-
-from plone.app.upgrade.tests.base import FunctionalUpgradeTestCase
-from plone.app.upgrade.tests.base import MigrationTest
-from plone.app.upgrade.utils import loadMigrationProfile
-
-from plone.app.upgrade.v25 import fixupPloneLexicon
-from plone.app.upgrade.v25 import setLoginFormInCookieAuth
-from plone.app.upgrade.v25 import addMissingMimeTypes
-
-
-class TestMigrations_v2_5_0(MigrationTest):
-
-    def afterSetUp(self):
-        self.profile = 'profile-plone.app.upgrade.v25:2.5final-2.5.1'
-        self.actions = self.portal.portal_actions
-        self.css = self.portal.portal_css
-
-    def tesFixObjDeleteAction(self):
-        # Prepare delete actions test
-        editActions = ('delete',)
-        for a in editActions:
-            self.removeActionFromTool(a, category='object_buttons')
-        loadMigrationProfile(self.portal, self.profile, ('actions', ))
-        # delete action tests
-        actions = [x.id for x in self.actions.object_buttons.listActions()
-                   if x.id in editActions]
-        # check that all of our deleted actions are now present
-        for a in editActions:
-            self.assertTrue(a in actions)
-        # ensure that they are present only once
-        self.assertEqual(len(editActions), len(actions))
-
-    def testFixupPloneLexicon(self):
-        # Should update the plone_lexicon pipeline
-        lexicon = self.portal.portal_catalog.plone_lexicon
-        lexicon._pipeline = (object(), object())
-        # Test it twice
-        for i in range(2):
-            fixupPloneLexicon(self.portal)
-            self.assertTrue(isinstance(lexicon._pipeline[0], Splitter))
-            self.assertTrue(isinstance(lexicon._pipeline[1], CaseNormalizer))
-
-
-class TestMigrations_v2_5_1(MigrationTest):
-
-    def afterSetUp(self):
-        self.actions = self.portal.portal_actions
-        self.memberdata = self.portal.portal_memberdata
-        self.catalog = self.portal.portal_catalog
-        self.skins = self.portal.portal_skins
-        self.types = self.portal.portal_types
-        self.workflow = self.portal.portal_workflow
-        self.css = self.portal.portal_css
-
-    def testSetLoginFormInCookieAuth(self):
-        setLoginFormInCookieAuth(self.portal)
-        cookie_auth = self.portal.acl_users.credentials_cookie_auth
-        self.assertEqual(cookie_auth.getProperty('login_path'),
-                             'require_login')
-
-    def testSetLoginFormNoCookieAuth(self):
-        # Shouldn't error
-        uf = self.portal.acl_users
-        uf._delOb('credentials_cookie_auth')
-        setLoginFormInCookieAuth(self.portal)
-
-    def testSetLoginFormAlreadyChanged(self):
-        # Shouldn't change the value if it's not the default
-        cookie_auth = self.portal.acl_users.credentials_cookie_auth
-        cookie_auth.manage_changeProperties(login_path='foo')
-        setLoginFormInCookieAuth(self.portal)
-        self.assertTrue(cookie_auth.getProperty('login_path') != 'require_login')
-
-class TestMigrations_v2_5_2(MigrationTest):
-
-    def afterSetUp(self):
-        self.mimetypes = self.portal.mimetypes_registry
-
-    def testMissingMimeTypes(self):
-        # we're testing for 'text/x-web-markdown' and 'text/x-web-textile'
-        missing_types = ['text/x-web-markdown', 'text/x-web-textile']
-        # since we're running a full 2.5.4 instance in this test, the missing
-        # types might in fact already be there:
-        current_types = self.mimetypes.list_mimetypes()
-        types_to_delete = []
-        for mtype in missing_types:
-            if mtype in current_types:
-                types_to_delete.append(mtype)
-        if types_to_delete:
-            self.mimetypes.manage_delObjects(types_to_delete)
-        # now they're gone:
-        self.assertFalse(set(self.mimetypes.list_mimetypes()).issuperset(set(missing_types)))
-        addMissingMimeTypes(self.portal)
-        # now they're back:
-        self.assertTrue(set(self.mimetypes.list_mimetypes()).issuperset(set(missing_types)))
-
-
-class TestFunctionalMigrations(FunctionalUpgradeTestCase):
-
-    def testUpgrade(self):
-        self.importFile(__file__, 'test-base.zexp')
-        oldsite, result = self.migrate()
-
-        mig = oldsite.portal_migration
-        self.assertFalse(mig.needUpgrading())
-
-    def testDCMIStorageUpdated(self):
-        self.importFile(__file__, 'test-base.zexp')
-        oldsite, result = self.migrate()
-
-        dcmi = getattr(oldsite.portal_metadata, 'DCMI', None)
-        self.assertFalse(dcmi is None)
-
-
-def test_suite():
-    from unittest import TestSuite, makeSuite
-    suite = TestSuite()
-    suite.addTest(makeSuite(TestMigrations_v2_5_0))
-    suite.addTest(makeSuite(TestMigrations_v2_5_1))
-    suite.addTest(makeSuite(TestMigrations_v2_5_2))
-    suite.addTest(makeSuite(TestFunctionalMigrations))
-    return suite
diff --git a/plone/app/upgrade/v30/tests.py b/plone/app/upgrade/v30/tests.py
deleted file mode 100644
index 9325d0d..0000000
--- a/plone/app/upgrade/v30/tests.py
+++ /dev/null
@@ -1,1109 +0,0 @@
-from Acquisition import aq_base
-
-from five.localsitemanager.registry import FiveVerifyingAdapterLookup
-
-from plone.contentrules.engine.interfaces import IRuleStorage
-from plone.app.i18n.locales.interfaces import IContentLanguages
-from plone.app.i18n.locales.interfaces import ICountries
-from plone.app.i18n.locales.interfaces import IMetadataLanguages
-from plone.app.portlets import portlets
-from plone.app.redirector.interfaces import IRedirectionStorage
-from plone.portlets.interfaces import IPortletManager
-from plone.portlets.interfaces import IPortletAssignmentMapping
-from plone.portlets.interfaces import ILocalPortletAssignmentManager
-from plone.portlets.constants import CONTEXT_CATEGORY as CONTEXT_PORTLETS
-
-from zope.location.interfaces import ISite
-from zope.component import getGlobalSiteManager
-from zope.component import getSiteManager
-from zope.component import getUtility, getMultiAdapter
-from zope.component.hooks import clearSite
-
-from Products.Archetypes.interfaces import IArchetypeTool
-from Products.Archetypes.interfaces import IReferenceCatalog
-from Products.Archetypes.interfaces import IUIDCatalog
-from Products.CMFActionIcons.interfaces import IActionIconsTool
-from Products.CMFCalendar.interfaces import ICalendarTool
-from Products.CMFCore.ActionInformation import Action
-from Products.CMFCore.ActionInformation import ActionCategory
-from Products.CMFCore.utils import getToolByName
-from Products.CMFCore.utils import getToolInterface
-from Products.CMFCore.Expression import Expression
-from Products.CMFCore.permissions import AccessInactivePortalContent
-from Products.CMFCore.interfaces import IActionsTool
-from Products.CMFCore.interfaces import ICachingPolicyManager
-from Products.CMFCore.interfaces import ICatalogTool
-from Products.CMFCore.interfaces import IContentTypeRegistry
-from Products.CMFCore.interfaces import IDiscussionTool
-from Products.CMFCore.interfaces import IMemberDataTool
-from Products.CMFCore.interfaces import IMembershipTool
-from Products.CMFCore.interfaces import IMetadataTool
-from Products.CMFCore.interfaces import IPropertiesTool
-from Products.CMFCore.interfaces import IRegistrationTool
-from Products.CMFCore.interfaces import ISiteRoot
-from Products.CMFCore.interfaces import ISkinsTool
-from Products.CMFCore.interfaces import ISyndicationTool
-from Products.CMFCore.interfaces import ITypesTool
-from Products.CMFCore.interfaces import IURLTool
-from Products.CMFCore.interfaces import IConfigurableWorkflowTool
-from Products.CMFCore.ActionInformation import ActionInformation
-from Products.CMFDiffTool.interfaces import IDiffTool
-from Products.CMFEditions.interfaces import IArchivistTool
-from Products.CMFEditions.interfaces import IPortalModifierTool
-from Products.CMFEditions.interfaces import IPurgePolicyTool
-from Products.CMFEditions.interfaces.IRepository import IRepositoryTool
-from Products.CMFEditions.interfaces import IStorageTool
-from Products.CMFFormController.interfaces import IFormControllerTool
-from Products.CMFQuickInstallerTool.interfaces import IQuickInstallerTool
-from Products.CMFPlone.interfaces import IPloneSiteRoot
-from Products.CMFPlone.interfaces import IPloneTool
-from Products.CMFPlone.interfaces import ITranslationServiceTool
-from Products.CMFUid.interfaces import IUniqueIdAnnotationManagement
-from Products.CMFUid.interfaces import IUniqueIdGenerator
-from Products.CMFUid.interfaces import IUniqueIdHandler
-from Products.GenericSetup.interfaces import ISetupTool
-from Products.MailHost.interfaces import IMailHost
-from Products.MimetypesRegistry.interfaces import IMimetypesRegistryTool
-from Products.PortalTransforms.interfaces import IPortalTransformsTool
-from Products.PloneLanguageTool.interfaces import ILanguageTool
-from Products.PlonePAS.interfaces.group import IGroupTool
-from Products.PlonePAS.interfaces.group import IGroupDataTool
-from Products.ResourceRegistries.interfaces import ICSSRegistry
-from Products.ResourceRegistries.interfaces import IJSRegistry
-
-from plone.app.upgrade.tests.base import FunctionalUpgradeTestCase
-from plone.app.upgrade.tests.base import MigrationTest
-from plone.app.upgrade.utils import loadMigrationProfile
-
-from plone.app.upgrade.v30.alphas import enableZope3Site
-from plone.app.upgrade.v30.alphas import migrateOldActions
-from plone.app.upgrade.v30.alphas import updateActionsI18NDomain
-from plone.app.upgrade.v30.alphas import updateFTII18NDomain
-from plone.app.upgrade.v30.alphas import convertLegacyPortlets
-from plone.app.upgrade.v30.alphas import registerToolsAsUtilities
-from plone.app.upgrade.v30.alphas import registration
-from plone.app.upgrade.v30.alphas import addReaderAndEditorRoles
-from plone.app.upgrade.v30.alphas import migrateLocalroleForm
-from plone.app.upgrade.v30.alphas import reorderUserActions
-from plone.app.upgrade.v30.alphas import updatePASPlugins
-from plone.app.upgrade.v30.alphas import updateConfigletTitles
-from plone.app.upgrade.v30.alphas import addCacheForResourceRegistry
-from plone.app.upgrade.v30.alphas import removeTablelessSkin
-from plone.app.upgrade.v30.alphas import addObjectProvidesIndex
-from plone.app.upgrade.v30.alphas import restorePloneTool
-from plone.app.upgrade.v30.alphas import installProduct
-
-from plone.app.upgrade.v30.betas import migrateHistoryTab
-from plone.app.upgrade.v30.betas import changeOrderOfActionProviders
-from plone.app.upgrade.v30.betas import cleanupOldActions
-from plone.app.upgrade.v30.betas import cleanDefaultCharset
-from plone.app.upgrade.v30.betas import addAutoGroupToPAS
-from plone.app.upgrade.v30.betas import removeS5Actions
-from plone.app.upgrade.v30.betas import addContributorToCreationPermissions
-from plone.app.upgrade.v30.betas import removeSharingAction
-from plone.app.upgrade.v30.betas import addEditorToSecondaryEditorPermissions
-from plone.app.upgrade.v30.betas import updateEditActionConditionForLocking
-from plone.app.upgrade.v30.betas import addOnFormUnloadJS
-
-from plone.app.upgrade.v30.betas import updateTopicTitle
-from plone.app.upgrade.v30.betas import cleanupActionProviders
-from plone.app.upgrade.v30.betas import hidePropertiesAction
-
-from plone.app.upgrade.v30.rcs import addIntelligentText
-
-from plone.app.upgrade.v30.final_three0x import installNewModifiers
-
-try:
-    from Products.ATContentTypes.interface import IATCTTool
-    HAS_ATCT = True
-except ImportError:
-    HAS_ATCT = False
-
-try:
-    from Products.CMFPlone.interfaces import IFactoryTool
-except:
-    from Products.ATContentTypes.interfaces import IFactoryTool
-
-
-class TestMigrations_v3_0_Actions(MigrationTest):
-
-    def afterSetUp(self):
-        self.actions = self.portal.portal_actions
-        self.types = self.portal.portal_types
-        self.workflow = self.portal.portal_workflow
-        self._migrate_reply_action()
-
-    def _migrate_reply_action(self):
-        # Create dummy old ActionInformation
-        reply = ActionInformation('reply',
-            title='Reply',
-            category='reply_actions',
-            condition='context/replyAllowed',
-            permissions=(AccessInactivePortalContent, ),
-            priority=10,
-            visible=True,
-            action='context/reply'
-        )
-
-        from OFS.SimpleItem import SimpleItem
-        class DummyTool(SimpleItem):
-            pass
-        dummy = DummyTool()
-        dummy._actions = (reply,)
-        self.portal._setObject('dummy', dummy)
-
-    def testMigrateActions(self):
-        # Test it twice
-        for i in range(2):
-            migrateOldActions(self.portal)
-            reply_actions = getattr(self.actions, 'reply_actions', None)
-            self.assertFalse(reply_actions is None)
-            reply = getattr(reply_actions, 'reply', None)
-            self.assertFalse(reply is None)
-            self.assertTrue(isinstance(reply, Action))
-            # Verify all data has been upgraded correctly to the new Action
-            data = reply.getInfoData()[0]
-            self.assertEqual(data['category'], 'reply_actions')
-            self.assertEqual(data['title'], 'Reply')
-            self.assertEqual(data['visible'], True)
-            self.assertEqual(data['permissions'], (AccessInactivePortalContent, ))
-            self.assertEqual(data['available'].text, 'context/replyAllowed')
-            self.assertEqual(data['url'].text, 'context/reply')
-            # Make sure the original action has been removed
-            self.assertEqual(len(self.portal.dummy._actions), 0)
-
-    def testUpdateActionsI18NDomain(self):
-        migrateOldActions(self.portal)
-        reply = self.actions.reply_actions.reply
-        self.assertEqual(reply.i18n_domain, '')
-        # Test it twice
-        for i in range(2):
-            updateActionsI18NDomain(self.portal)
-            self.assertEqual(reply.i18n_domain, 'plone')
-
-    def testUpdateActionsI18NDomainNonAscii(self):
-        migrateOldActions(self.portal)
-        reply = self.actions.reply_actions.reply
-        reply.title = 'Foo\xc3'
-        self.assertEqual(reply.i18n_domain, '')
-        self.assertEqual(reply.title, 'Foo\xc3')
-
-        updateActionsI18NDomain(self.portal)
-
-        self.assertEqual(reply.i18n_domain, '')
-
-    def testHistoryActionID(self):
-        # Test it twice
-        for i in range(2):
-            migrateHistoryTab(self.portal)
-            objects = getattr(self.actions, 'object', None)
-            self.assertFalse('rss' in objects.objectIds())
-
-    def testProviderCleanup(self):
-        self.actions.addActionProvider("portal_membership")
-        self.assertTrue("portal_membership" in self.actions.listActionProviders())
-        # Test it twice
-        for i in range(2):
-            cleanupActionProviders(self.portal)
-            self.assertFalse("portal_membership" in self.actions.listActionProviders())
-
-    def testRemovePropertiesActions(self):
-        ti = self.types.getTypeInfo("Document")
-        if ti.getActionObject("object/properties") is None:
-            ti.addAction("metadata", "name", "action", "condition",
-                    "permission", "object",)
-        # Test it twice
-        for i in range(2):
-            hidePropertiesAction(self.portal)
-            self.assertTrue(ti.getActionObject("object/metadata") is None)
-
-    def tearDown(self):
-        self.portal._delObject('dummy')
-
-
-class TestMigrations_v2_5_x(MigrationTest):
-
-    def afterSetUp(self):
-        self.profile = 'profile-plone.app.upgrade.v30:2.5.x-3.0a1'
-        self.types = self.portal.portal_types
-        self.properties = self.portal.portal_properties
-
-        for legacy_tool in ('portal_discussion', 'portal_actionicons'):
-            if legacy_tool not in self.portal:
-                from OFS.SimpleItem import SimpleItem
-                self.portal._setObject(legacy_tool, SimpleItem())
-
-    def disableSite(self, obj, iface=ISite):
-        # We need our own disableSite method as the CMF portal implements
-        # ISite directly, so we cannot remove it, like the disableSite method
-        # in Five.component would have done
-        from ZPublisher.BeforeTraverse import unregisterBeforeTraverse
-        from Products.Five.component import HOOK_NAME
-        obj = aq_base(obj)
-        if not iface.providedBy(obj):
-            raise TypeError('Object must be a site.')
-        unregisterBeforeTraverse(obj, HOOK_NAME)
-        if hasattr(obj, HOOK_NAME):
-            delattr(obj, HOOK_NAME)
-
-    def testEnableZope3Site(self):
-        # First we remove the site and site manager
-        self.disableSite(self.portal)
-        clearSite(self.portal)
-        self.portal.setSiteManager(None)
-        gsm = getGlobalSiteManager()
-        # Test it twice
-        for i in range(2):
-            enableZope3Site(self.portal)
-            # And see if we have an ISite with a local site manager
-            self.assertTrue(ISite.providedBy(self.portal))
-            sm = getSiteManager(self.portal)
-            self.assertFalse(gsm is sm)
-            lc = sm.utilities.LookupClass
-            self.assertEqual(lc, FiveVerifyingAdapterLookup)
-
-        # Test the lookupclass migration
-        sm.utilities.LookupClass = None
-        # Test it twice
-        for i in range(2):
-            enableZope3Site(self.portal)
-            self.assertEqual(sm.utilities.LookupClass, FiveVerifyingAdapterLookup)
-            self.assertEqual(sm.utilities.__parent__, sm)
-            self.assertEqual(sm.__parent__, self.portal)
-
-    def testUpdateFTII18NDomain(self):
-        doc = self.types.Document
-        doc.i18n_domain = ''
-        # Test it twice
-        for i in range(2):
-            updateFTII18NDomain(self.portal)
-            self.assertEqual(doc.i18n_domain, 'plone')
-
-    def testUpdateFTII18NDomainNonAscii(self):
-        doc = self.types.Document
-        doc.i18n_domain = ''
-        doc.title = 'Foo\xc3'
-        # Update FTI's
-        updateFTII18NDomain(self.portal)
-        # domain should have been updated
-        self.assertEqual(doc.i18n_domain, '')
-
-    def testAddDefaultAndForbiddenContentTypesProperties(self):
-        # Should add the forbidden_contenttypes and default_contenttype property
-        self.removeSiteProperty('forbidden_contenttypes')
-        self.removeSiteProperty('default_contenttype')
-        self.assertFalse(self.properties.site_properties.hasProperty('forbidden_contenttypes'))
-        self.assertFalse(self.properties.site_properties.hasProperty('default_contenttype'))
-        # Test it twice
-        for i in range(2):
-            loadMigrationProfile(self.portal, self.profile, ('propertiestool', ))
-            self.assertTrue(self.properties.site_properties.hasProperty('forbidden_contenttypes'))
-            self.assertTrue(self.properties.site_properties.hasProperty('default_contenttype'))
-            self.assertEqual(self.properties.site_properties.forbidden_contenttypes,
-                ('text/structured', 'text/restructured', 'text/x-rst',
-                'text/plain', 'text/plain-pre', 'text/x-python',
-                'text/x-web-markdown', 'text/x-web-intelligent', 'text/x-web-textile')
-            )
-
-    def testTablelessRemoval(self):
-        st = getToolByName(self.portal, "portal_skins")
-        if "Plone Tableless" not in st.getSkinSelections():
-            st.addSkinSelection('Plone Tableless', 'one,two', make_default=True)
-        # Test it twice
-        for i in range(2):
-            removeTablelessSkin(self.portal)
-            self.assertFalse('Plone Tableless' in st.getSkinSelections())
-            self.assertFalse(st.default_skin == 'Plone Tableless')
-
-    def testLegacyPortletsConverted(self):
-        self.setRoles(('Manager',))
-        leftColumn = getUtility(IPortletManager, name=u'plone.leftcolumn', context=self.portal)
-        rightColumn = getUtility(IPortletManager, name=u'plone.rightcolumn', context=self.portal)
-
-        left = getMultiAdapter((self.portal, leftColumn,), IPortletAssignmentMapping, context=self.portal)
-        right = getMultiAdapter((self.portal, rightColumn,), IPortletAssignmentMapping, context=self.portal)
-
-        for k in left:
-            del left[k]
-        for k in right:
-            del right[k]
-
-        self.portal.left_slots = ['here/portlet_recent/macros/portlet',
-                                  'here/portlet_news/macros/portlet',
-                                  'here/portlet_related/macros/portlet']
-        self.portal.right_slots = ['here/portlet_login/macros/portlet',
-                                   'here/portlet_languages/macros/portlet']
-
-        self.portal.Members.right_slots = []
-
-        # Test it twice
-        for i in range(2):
-            convertLegacyPortlets(self.portal)
-
-            self.assertEqual(self.portal.left_slots, [])
-            self.assertEqual(self.portal.right_slots, [])
-
-            left = getMultiAdapter((self.portal, leftColumn,), IPortletAssignmentMapping, context=self.portal)
-            right = getMultiAdapter((self.portal, rightColumn,), IPortletAssignmentMapping, context=self.portal)
-
-            lp = left.values()
-            self.assertEqual(2, len(lp))
-
-            self.assertTrue(isinstance(lp[0], portlets.recent.Assignment))
-            self.assertTrue(isinstance(lp[1], portlets.news.Assignment))
-
-            rp = right.values()
-            self.assertEqual(1, len(rp))
-            self.assertTrue(isinstance(rp[0], portlets.login.Assignment))
-
-            members = self.portal.Members
-            portletAssignments = getMultiAdapter((members, rightColumn,), ILocalPortletAssignmentManager)
-            self.assertEqual(True, portletAssignments.getBlacklistStatus(CONTEXT_PORTLETS))
-
-    def testLegacyPortletsConvertedNoSlots(self):
-        self.setRoles(('Manager',))
-        leftColumn = getUtility(IPortletManager, name=u'plone.leftcolumn', context=self.portal)
-        rightColumn = getUtility(IPortletManager, name=u'plone.rightcolumn', context=self.portal)
-
-        left = getMultiAdapter((self.portal, leftColumn,), IPortletAssignmentMapping, context=self.portal)
-        right = getMultiAdapter((self.portal, rightColumn,), IPortletAssignmentMapping, context=self.portal)
-
-        for k in left:
-            del left[k]
-        for k in right:
-            del right[k]
-
-        self.portal.left_slots = ['here/portlet_recent/macros/portlet',
-                                  'here/portlet_news/macros/portlet']
-
-        self.portal.Members.right_slots = []
-
-        if hasattr(self.portal.aq_base, 'right_slots'):
-            delattr(self.portal, 'right_slots')
-
-        convertLegacyPortlets(self.portal)
-
-        self.assertEqual(self.portal.left_slots, [])
-
-        left = getMultiAdapter((self.portal, leftColumn,), IPortletAssignmentMapping, context=self.portal)
-        right = getMultiAdapter((self.portal, rightColumn,), IPortletAssignmentMapping, context=self.portal)
-
-        lp = left.values()
-        self.assertEqual(2, len(lp))
-
-        self.assertTrue(isinstance(lp[0], portlets.recent.Assignment))
-        self.assertTrue(isinstance(lp[1], portlets.news.Assignment))
-
-        rp = right.values()
-        self.assertEqual(0, len(rp))
-
-        members = self.portal.Members
-        portletAssignments = getMultiAdapter((members, rightColumn,), ILocalPortletAssignmentManager)
-        self.assertEqual(True, portletAssignments.getBlacklistStatus(CONTEXT_PORTLETS))
-
-    def testLegacyPortletsConvertedBadSlots(self):
-        self.setRoles(('Manager',))
-        leftColumn = getUtility(IPortletManager, name=u'plone.leftcolumn', context=self.portal)
-        rightColumn = getUtility(IPortletManager, name=u'plone.rightcolumn', context=self.portal)
-
-        left = getMultiAdapter((self.portal, leftColumn,), IPortletAssignmentMapping, context=self.portal)
-        right = getMultiAdapter((self.portal, rightColumn,), IPortletAssignmentMapping, context=self.portal)
-
-        for k in left:
-            del left[k]
-        for k in right:
-            del right[k]
-
-        self.portal.left_slots = ['here/portlet_recent/macros/portlet',
-                                  'here/portlet_news/macros/portlet',
-                                  'foobar',]
-        self.portal.right_slots = ['here/portlet_login/macros/portlet']
-
-        self.portal.Members.right_slots = []
-
-        convertLegacyPortlets(self.portal)
-        left = getMultiAdapter((self.portal, leftColumn,), IPortletAssignmentMapping, context=self.portal)
-        right = getMultiAdapter((self.portal, rightColumn,), IPortletAssignmentMapping, context=self.portal)
-
-        self.assertEqual(self.portal.left_slots, [])
-        self.assertEqual(self.portal.right_slots, [])
-
-        lp = left.values()
-        self.assertEqual(2, len(lp))
-
-        self.assertTrue(isinstance(lp[0], portlets.recent.Assignment))
-        self.assertTrue(isinstance(lp[1], portlets.news.Assignment))
-
-        rp = right.values()
-        self.assertEqual(1, len(rp))
-        self.assertTrue(isinstance(rp[0], portlets.login.Assignment))
-
-        members = self.portal.Members
-        portletAssignments = getMultiAdapter((members, rightColumn,), ILocalPortletAssignmentManager)
-        self.assertEqual(True, portletAssignments.getBlacklistStatus(CONTEXT_PORTLETS))
-
-    def testLegacyPortletsConvertedNoMembersFolder(self):
-        self.setRoles(('Manager',))
-        leftColumn = getUtility(IPortletManager, name=u'plone.leftcolumn', context=self.portal)
-        rightColumn = getUtility(IPortletManager, name=u'plone.rightcolumn', context=self.portal)
-
-        left = getMultiAdapter((self.portal, leftColumn,), IPortletAssignmentMapping, context=self.portal)
-        right = getMultiAdapter((self.portal, rightColumn,), IPortletAssignmentMapping, context=self.portal)
-
-        for k in left:
-            del left[k]
-        for k in right:
-            del right[k]
-
-        self.portal.left_slots = ['here/portlet_recent/macros/portlet',
-                                  'here/portlet_news/macros/portlet',
-                                  'foobar',]
-        self.portal.right_slots = ['here/portlet_login/macros/portlet']
-
-        self.portal._delObject('Members')
-
-        convertLegacyPortlets(self.portal)
-        left = getMultiAdapter((self.portal, leftColumn,), IPortletAssignmentMapping, context=self.portal)
-        right = getMultiAdapter((self.portal, rightColumn,), IPortletAssignmentMapping, context=self.portal)
-
-        self.assertEqual(self.portal.left_slots, [])
-        self.assertEqual(self.portal.right_slots, [])
-
-        lp = left.values()
-        self.assertEqual(2, len(lp))
-
-        self.assertTrue(isinstance(lp[0], portlets.recent.Assignment))
-        self.assertTrue(isinstance(lp[1], portlets.news.Assignment))
-
-        rp = right.values()
-        self.assertEqual(1, len(rp))
-        self.assertTrue(isinstance(rp[0], portlets.login.Assignment))
-
-    def testRegisterToolsAsUtilities(self):
-        sm = getSiteManager(self.portal)
-        interfaces = (ISiteRoot, IPloneSiteRoot,
-                      IActionIconsTool, ISyndicationTool,
-                      IMetadataTool, IPropertiesTool, IMailHost,
-                      IUniqueIdAnnotationManagement, IUniqueIdGenerator,
-                      IDiffTool, IMimetypesRegistryTool,
-                      IPortalTransformsTool, IDiscussionTool, )
-        if HAS_ATCT:
-            interfaces += (IATCTTool,)
-        for i in interfaces:
-            sm.unregisterUtility(provided=i)
-        registerToolsAsUtilities(self.portal)
-        for i in interfaces:
-            self.assertFalse(sm.queryUtility(i) is None)
-
-        for i in interfaces:
-            sm.unregisterUtility(provided=i)
-        registerToolsAsUtilities(self.portal)
-        registerToolsAsUtilities(self.portal)
-        for i in interfaces:
-            self.assertFalse(sm.queryUtility(i) is None)
-
-    def testDontRegisterToolsAsUtilities(self):
-        sm = getSiteManager(self.portal)
-        interfaces = (ILanguageTool, IArchivistTool, IPortalModifierTool,
-                      IPurgePolicyTool, IRepositoryTool, IStorageTool,
-                      IFormControllerTool, IReferenceCatalog, IUIDCatalog,
-                      ICalendarTool, IActionsTool, ICatalogTool,
-                      IContentTypeRegistry, ISkinsTool, ITypesTool, IURLTool,
-                      IConfigurableWorkflowTool, IPloneTool, ICSSRegistry,
-                      IJSRegistry, IUniqueIdHandler, IFactoryTool,
-                      IMembershipTool, IGroupTool, IGroupDataTool,
-                      IMemberDataTool, IArchetypeTool, ICachingPolicyManager,
-                      IRegistrationTool, ITranslationServiceTool,
-                      ISetupTool, IQuickInstallerTool,
-                     )
-        for i in interfaces:
-            sm.unregisterUtility(provided=i)
-        registerToolsAsUtilities(self.portal)
-        for i in interfaces:
-            self.assertTrue(sm.queryUtility(i) is None)
-
-        for i in interfaces:
-            sm.unregisterUtility(provided=i)
-        registerToolsAsUtilities(self.portal)
-        registerToolsAsUtilities(self.portal)
-        for i in interfaces:
-            self.assertTrue(sm.queryUtility(i) is None)
-
-    def testToolRegistration(self):
-        for (tool_id, interface) in registration:
-            self.assertEqual(getToolInterface(tool_id), interface)
-
-
-class TestMigrations_v3_0_alpha1(MigrationTest):
-
-    def afterSetUp(self):
-        self.profile = 'profile-plone.app.upgrade.v30:3.0a1-3.0a2'
-        self.actions = self.portal.portal_actions
-
-    def testInstallRedirectorUtility(self):
-        sm = getSiteManager(self.portal)
-        sm.unregisterUtility(provided=IRedirectionStorage)
-        # Test it twice
-        for i in range(2):
-            loadMigrationProfile(self.portal, self.profile, ('componentregistry', ))
-            self.assertFalse(sm.queryUtility(IRedirectionStorage) is None)
-
-    def testAddReaderEditorRoles(self):
-        self.portal._delRoles(['Reader', 'Editor'])
-        # Test it twice
-        for i in range(2):
-            addReaderAndEditorRoles(self.portal)
-            self.assertTrue('Reader' in self.portal.valid_roles())
-            self.assertTrue('Editor' in self.portal.valid_roles())
-            self.assertTrue('Reader' in self.portal.acl_users.portal_role_manager.listRoleIds())
-            self.assertTrue('Editor' in self.portal.acl_users.portal_role_manager.listRoleIds())
-            self.assertTrue('View' in [r['name'] for r in self.portal.permissionsOfRole('Reader') if r['selected']])
-            self.assertTrue('Modify portal content' in [r['name'] for r in self.portal.permissionsOfRole('Editor') if r['selected']])
-
-    def testAddReaderEditorRolesPermissionOnly(self):
-        self.portal.manage_permission('View', [], True)
-        self.portal.manage_permission('Modify portal content', [], True)
-        # Test it twice
-        for i in range(2):
-            addReaderAndEditorRoles(self.portal)
-            self.assertTrue('Reader' in self.portal.valid_roles())
-            self.assertTrue('Editor' in self.portal.valid_roles())
-            self.assertTrue('Reader' in self.portal.acl_users.portal_role_manager.listRoleIds())
-            self.assertTrue('Editor' in self.portal.acl_users.portal_role_manager.listRoleIds())
-            self.assertTrue('View' in [r['name'] for r in self.portal.permissionsOfRole('Reader') if r['selected']])
-            self.assertTrue('Modify portal content' in [r['name'] for r in self.portal.permissionsOfRole('Editor') if r['selected']])
-
-    def testMigrateLocalroleForm(self):
-        fti = self.portal.portal_types['Document']
-        aliases = fti.getMethodAliases()
-        aliases['sharing'] = 'folder_localrole_form'
-        fti.setMethodAliases(aliases)
-        fti.addAction('test', 'Test', 'string:${object_url}/folder_localrole_form', None, 'View', 'object')
-        # Test it twice
-        for i in range(2):
-            migrateLocalroleForm(self.portal)
-            self.assertEqual('@@sharing', fti.getMethodAliases()['sharing'])
-            test_action = fti.listActions()[-1]
-            self.assertEqual('string:${object_url}/@@sharing', test_action.getActionExpression())
-
-    def testReorderUserActions(self):
-        self.actions.user.moveObjectsToTop(['logout', 'undo', 'join'])
-        # Test it twice
-        for i in range(2):
-            reorderUserActions(self.portal)
-            # build a dict that has the position as the value to make it easier
-            # to compare postions in the ordered list of actions
-            n = 0
-            sort = {}
-            for action in self.actions.user.objectIds():
-                sort[action] = n
-                n += 1
-            self.assertTrue(sort['preferences'] < sort['undo'])
-            self.assertTrue(sort['undo'] < sort['logout'])
-            self.assertTrue(sort['login'] < sort['join'])
-
-    def testReorderUserActionsIncompleteActions(self):
-        self.actions.user.moveObjectsToTop(['logout', 'undo', 'join'])
-        self.actions.user._delObject('preferences')
-        # Test it twice
-        for i in range(2):
-            reorderUserActions(self.portal)
-            n = 0
-            sort = {}
-            for action in self.actions.user.objectIds():
-                sort[action] = n
-                n += 1
-            self.assertTrue(sort['undo'] < sort['logout'])
-            self.assertTrue(sort['login'] < sort['join'])
-
-
-class TestMigrations_v3_0_alpha2(MigrationTest):
-
-    def afterSetUp(self):
-        self.profile = 'profile-plone.app.upgrade.v30:3.0a2-3.0b1'
-        self.actions = self.portal.portal_actions
-        self.properties = self.portal.portal_properties
-        self.cp = self.portal.portal_controlpanel
-
-    def testAddVariousProperties(self):
-        PROPERTIES = ('enable_link_integrity_checks', 'enable_sitemap',
-                      'external_links_open_new_window', 'many_groups',
-                      'number_of_days_to_keep', 'webstats_js')
-        for prop in PROPERTIES:
-            self.removeSiteProperty(prop)
-        sheet = self.properties.site_properties
-        # Test it twice
-        for i in range(2):
-            loadMigrationProfile(self.portal, self.profile, ('propertiestool', ))
-            for prop in PROPERTIES:
-                self.assertTrue(sheet.hasProperty(prop))
-
-    def testInstallContentrulesAndLanguageUtilities(self):
-        sm = getSiteManager()
-        INTERFACES = (IRuleStorage, ICountries, IContentLanguages,
-                      IMetadataLanguages)
-        for i in INTERFACES:
-            sm.unregisterUtility(provided=i)
-        # Test it twice
-        for i in range(2):
-            loadMigrationProfile(self.portal, self.profile, ('componentregistry', ))
-            for i in INTERFACES:
-                self.assertFalse(sm.queryUtility(i) is None)
-
-    def testAddEmailCharsetProperty(self):
-        if self.portal.hasProperty('email_charset'):
-            self.portal.manage_delProperties(['email_charset'])
-        # Test it twice
-        for i in range(2):
-            loadMigrationProfile(self.portal, self.profile, ('properties', ))
-            self.assertTrue(self.portal.hasProperty('email_charset'))
-            self.assertEqual(self.portal.getProperty('email_charset'), 'utf-8')
-
-    def testUpdateMemberSecurity(self):
-        pprop = getToolByName(self.portal, 'portal_properties')
-        self.assertEqual(
-                pprop.site_properties.getProperty('allowAnonymousViewAbout'),
-                False)
-
-        pmembership = getToolByName(self.portal, 'portal_membership')
-        self.assertEqual(pmembership.memberareaCreationFlag, False)
-        self.assertEqual(self.portal.getProperty('validate_email'), True)
-
-        app_roles = self.portal.rolesOfPermission(permission='Add portal member')
-        app_perms = self.portal.permission_settings(permission='Add portal member')
-        acquire_check = app_perms[0]['acquire']
-        reg_roles = []
-        for appperm in app_roles:
-            if appperm['selected'] == 'SELECTED':
-                reg_roles.append(appperm['name'])
-        self.assertTrue('Manager' in reg_roles)
-        self.assertTrue('Owner' in reg_roles)
-        self.assertEqual(acquire_check, '')
-
-    def testPASPluginInterfaces(self):
-        pas = self.portal.acl_users
-        from Products.PluggableAuthService.interfaces.plugins import IUserEnumerationPlugin
-        pas.plugins.deactivatePlugin(IUserEnumerationPlugin, 'mutable_properties')
-        updatePASPlugins(self.portal)
-
-        plugin = pas.mutable_properties
-        for intf_id in plugin.listInterfaces():
-            try:
-                intf = pas.plugins._getInterfaceFromName(intf_id)
-                self.assertTrue('mutable_properties' in pas.plugins.listPluginIds(intf))
-            except KeyError:
-                # Ignore unregistered interface types
-                pass
-
-    def testUpdateConfigletTitles(self):
-        collection = self.cp.getActionObject('Plone/portal_atct')
-        language = self.cp.getActionObject('Plone/PloneLanguageTool')
-        navigation = self.cp.getActionObject('Plone/NavigationSettings')
-        types = self.cp.getActionObject('Plone/TypesSettings')
-        users = self.cp.getActionObject('Plone/UsersGroups')
-        users2 = self.cp.getActionObject('Plone/UsersGroups2')
-        # test it twice
-        for i in range(2):
-            updateConfigletTitles(self.portal)
-            self.assertEqual(collection.title, 'Collection')
-            self.assertEqual(language.title, 'Language')
-            self.assertEqual(navigation.title, 'Navigation')
-            self.assertEqual(types.title, 'Types')
-            self.assertEqual(users.title, 'Users and Groups')
-            self.assertEqual(users2.title, 'Users and Groups')
-
-    def testAddCacheForResourceRegistry(self):
-        ram_cache_id = 'ResourceRegistryCache'
-        # first remove the cache manager and make sure it's removed
-        self.portal._delObject(ram_cache_id)
-        self.assertFalse(ram_cache_id in self.portal.objectIds())
-        cssreg = self.portal.portal_css
-        cssreg.ZCacheable_setEnabled(0)
-        cssreg.ZCacheable_setManagerId(None)
-        self.assertFalse(cssreg.ZCacheable_enabled())
-        self.assertTrue(cssreg.ZCacheable_getManagerId() is None)
-        jsreg = self.portal.portal_javascripts
-        jsreg.ZCacheable_setEnabled(0)
-        jsreg.ZCacheable_setManagerId(None)
-        self.assertFalse(jsreg.ZCacheable_enabled())
-        self.assertTrue(jsreg.ZCacheable_getManagerId() is None)
-        # Test it twice
-        for i in range(2):
-            addCacheForResourceRegistry(self.portal)
-            self.assertTrue(ram_cache_id in self.portal.objectIds())
-            self.assertTrue(cssreg.ZCacheable_enabled())
-            self.assertFalse(cssreg.ZCacheable_getManagerId() is None)
-            self.assertTrue(jsreg.ZCacheable_enabled())
-            self.assertFalse(jsreg.ZCacheable_getManagerId() is None)
-
-    def testObjectProvidesIndex(self):
-        catalog = getToolByName(self.portal, 'portal_catalog')
-        if 'object_provides' in catalog.indexes():
-            catalog.delIndex('object_provides')
-        self.assertFalse('object_provides' in catalog.indexes())
-        # Test it twice
-        for i in range(2):
-            addObjectProvidesIndex(self.portal)
-            self.assertTrue('object_provides' in catalog.indexes())
-
-    def testMigratePloneTool(self):
-        tool = self.portal.plone_utils
-        tool.meta_type = 'PlonePAS Utilities Tool'
-        # Test it twice
-        for i in range(2):
-            restorePloneTool(self.portal)
-            tool = self.portal.plone_utils
-            self.assertEqual('Plone Utility Tool', tool.meta_type)
-
-    def testInstallPloneLanguageTool(self):
-        super(self.portal.__class__, self.portal).manage_delObjects(
-            ['portal_languages'])
-        self.uninstallProduct('PloneLanguageTool')
-        qi = getToolByName(self.portal, "portal_quickinstaller")
-        # Test it twice
-        for i in range(2):
-            installProduct('PloneLanguageTool', self.portal)
-            self.assertTrue(qi.isProductInstalled('PloneLanguageTool'))
-            self.assertTrue('portal_languages' in self.portal.keys())
-
-
-class TestMigrations_v3_0(MigrationTest):
-
-    def afterSetUp(self):
-        self.profile = 'profile-plone.app.upgrade.v30:3.0b1-3.0b2'
-        self.actions = self.portal.portal_actions
-        self.skins = self.portal.portal_skins
-        self.types = self.portal.portal_types
-        self.workflow = self.portal.portal_workflow
-        self.properties = getToolByName(self.portal, 'portal_properties')
-
-    def testAddContentRulesAction(self):
-        self.portal.portal_actions.object._delObject('contentrules')
-        # Test it twice
-        for i in range(2):
-            loadMigrationProfile(self.portal, self.profile, ('actions', ))
-            self.assertTrue('contentrules' in self.portal.portal_actions.object.objectIds())
-
-    def testChangeOrderOfActionProviders(self):
-        self.actions.deleteActionProvider('portal_types')
-        self.actions.addActionProvider('portal_types')
-        self.assertEqual(
-            self.actions.listActionProviders(),
-            ('portal_workflow', 'portal_actions', 'portal_types'))
-        # Test it twice
-        for i in range(2):
-            changeOrderOfActionProviders(self.portal)
-            self.assertEqual(
-                self.actions.listActionProviders(),
-                ('portal_workflow', 'portal_types', 'portal_actions'))
-
-    def testCleanupOldActions(self):
-        reply = Action('reply', title='Reply')
-        logged_in = Action('logged_in', title='Logged in')
-        change_ownership = Action('change_ownership', title='Change ownership')
-
-        object_ = self.actions.object
-        object_tabs = getattr(self.actions, 'object_tabs', None)
-        if object_tabs is None:
-            category = 'object_tabs'
-            self.actions._setObject(category, ActionCategory(id=category))
-            object_tabs = self.actions.object_tabs
-        if getattr(self.actions, 'global', None) is None:
-            category = 'global'
-            self.actions._setObject(category, ActionCategory(id=category))
-
-        if not 'reply' in object_.keys():
-            object_._setObject('reply', reply)
-        user = self.actions.user
-        if not 'logged_in' in user.keys():
-            user._setObject('logged_in', logged_in)
-        if not 'change_ownership' in object_tabs.keys():
-            object_tabs._setObject('change_ownership', change_ownership)
-        del object_tabs
-
-        # Test it twice
-        for i in range(2):
-            cleanupOldActions(self.portal)
-            self.assertFalse('reply' in object_.keys())
-            self.assertFalse('logged_in' in user.keys())
-            self.assertFalse('object_tabs' in self.actions.keys())
-            self.assertFalse('global' in self.actions.keys())
-
-    def testCharsetCleanup(self):
-        if not self.portal.hasProperty('default_charset'):
-            self.portal.manage_addProperty('default_charset', '', 'string')
-        # Test it twice
-        for i in range(2):
-            self.portal.manage_changeProperties(default_charset = 'latin1')
-            cleanDefaultCharset(self.portal)
-            self.assertEqual(self.portal.getProperty('default_charset', 'nothere'),
-                    'latin1')
-        # Test it twice
-        for i in range(2):
-            self.portal.manage_changeProperties(default_charset = '')
-            cleanDefaultCharset(self.portal)
-            self.assertEqual(self.portal.getProperty('default_charset', 'nothere'),
-                    'nothere')
-
-    def testAutoGroupCreated(self):
-        pas = self.portal.acl_users
-        ids = pas.objectIds(['Automatic Group Plugin'])
-        if ids:
-            pas.manage_delObjects(ids)
-        addAutoGroupToPAS(self.portal)
-        self.assertEqual(pas.objectIds(['Automatic Group Plugin']),
-                ['auto_group'])
-        plugin = pas.auto_group
-        interfaces = [info['interface'] for info in pas.plugins.listPluginTypeInfo()]
-        for iface in interfaces:
-            if plugin.testImplements(iface):
-                self.assertFalse('auto_group' not in pas.plugins.listPluginIds(iface))
-        self.assertEqual(len(pas.searchGroups(id='AuthenticatedUsers',
-                                              exact_match=True)), 1)
-
-    def testPloneS5(self):
-        pt = getToolByName(self.portal, "portal_types")
-        document = pt.restrictedTraverse('Document')
-        document.addAction('s5_presentation',
-            name='View as presentation',
-            action="string:${object/absolute_url}/document_s5_presentation",
-            condition='python:object.document_s5_alter(test=True)',
-            permission='View',
-            category='document_actions',
-            visible=1,
-            )
-        action_ids = [x.getId() for x in document.listActions()]
-        self.assertTrue("s5_presentation" in action_ids)
-        # Test it twice
-        for i in range(2):
-            removeS5Actions(self.portal)
-            action_ids = [x.getId() for x in document.listActions()]
-            self.assertFalse("s5_presentation" in action_ids)
-
-    def testAddContributorToCreationPermissions(self):
-        self.portal._delRoles(['Contributor',])
-        for p in ['Add portal content', 'Add portal folders', 'ATContentTypes: Add Document',
-                    'ATContentTypes: Add Event',
-                    'ATContentTypes: Add File', 'ATContentTypes: Add Folder',
-                    'ATContentTypes: Add Image', 'ATContentTypes: Add Link',
-                    'ATContentTypes: Add News Item', ]:
-            self.portal.manage_permission(p, ['Manager', 'Owner'], True)
-        # Test it twice
-        for i in range(2):
-            addContributorToCreationPermissions(self.portal)
-            self.assertTrue('Contributor' in self.portal.valid_roles())
-            self.assertTrue('Contributor' in self.portal.acl_users.portal_role_manager.listRoleIds())
-            for p in ['Add portal content', 'Add portal folders', 'ATContentTypes: Add Document',
-                        'ATContentTypes: Add Event',
-                        'ATContentTypes: Add File', 'ATContentTypes: Add Folder',
-                        'ATContentTypes: Add Image', 'ATContentTypes: Add Link',
-                        'ATContentTypes: Add News Item', ]:
-                self.assertTrue(p in [r['name'] for r in
-                                    self.portal.permissionsOfRole('Contributor') if r['selected']])
-
-    def testAddContributerToCreationPermissionsNoStomp(self):
-        self.portal.manage_permission('Add portal content', ['Manager'], False)
-        # Test it twice
-        for i in range(2):
-            addContributorToCreationPermissions(self.portal)
-            roles = sorted([r['name'] for r in self.portal.rolesOfPermission('Add portal content') if r['selected']])
-            self.assertEqual(['Contributor', 'Manager'], roles)
-            self.assertEqual(False, bool(self.portal.acquiredRolesAreUsedBy('Add portal content')))
-
-    def testAddBeta2VersioningPermissionsToNewRoles(self):
-        # This upgrade just uses GS to apply the role changes,
-        # these permissions will not have been installed previously,
-        # so this should be safe
-        for p in ['CMFEditions: Apply version control',
-                  'CMFEditions: Save new version',
-                  'CMFEditions: Access previous versions',
-                  'CMFEditions: Revert to previous versions',
-                  'CMFEditions: Checkout to location']:
-            self.portal.manage_permission(p, ['Manager', 'Owner'], True)
-        # Test it twice
-        for i in range(2):
-            loadMigrationProfile(self.portal,
-                    'profile-plone.app.upgrade.v30:3.0b1-3.0b2',
-                    steps=["rolemap"])
-            for p in ['CMFEditions: Apply version control',
-                      'CMFEditions: Save new version',
-                      'CMFEditions: Access previous versions']:
-                self.assertTrue(p in [r['name'] for r in
-                                    self.portal.permissionsOfRole('Contributor') if r['selected']])
-                self.assertTrue(p in [r['name'] for r in
-                                    self.portal.permissionsOfRole('Editor') if r['selected']])
-            for p in ['CMFEditions: Revert to previous versions',
-                      'CMFEditions: Checkout to location']:
-                self.assertTrue(p in [r['name'] for r in
-                                    self.portal.permissionsOfRole('Editor') if r['selected']])
-
-    def testRemoveSharingAction(self):
-        fti = self.types['Document']
-        fti.addAction(id='local_roles', name='Sharing',
-                      action='string:${object_url}/sharing',
-                      condition=None, permission='Manage properties',
-                      category='object')
-        # Test it twice
-        for i in range(2):
-            removeSharingAction(self.portal)
-            self.assertFalse('local_roles' in [a.id for a in fti.listActions()])
-
-    def testAddEditorToCreationPermissions(self):
-        for p in ['Manage properties', 'Modify view template', 'Request review']:
-            self.portal.manage_permission(p, ['Manager', 'Owner'], True)
-        # Test it twice
-        for i in range(2):
-            addEditorToSecondaryEditorPermissions(self.portal)
-            for p in ['Manage properties', 'Modify view template', 'Request review']:
-                self.assertTrue(p in [r['name'] for r in
-                    self.portal.permissionsOfRole('Editor') if r['selected']])
-
-    def testAddEditorToCreationPermissionsNoStomp(self):
-        self.portal.manage_permission('Manage properties', ['Manager'], False)
-        # Test it twice
-        for i in range(2):
-            addEditorToSecondaryEditorPermissions(self.portal)
-            roles = sorted([r['name'] for r in self.portal.rolesOfPermission('Manage properties') if r['selected']])
-            self.assertEqual(['Editor', 'Manager'], roles)
-            self.assertEqual(False, bool(self.portal.acquiredRolesAreUsedBy('Manage properties')))
-
-    def testUpdateEditActionConditionForLocking(self):
-        lockable_types = ['Document', 'Event', 'File', 'Folder',
-                          'Image', 'Link', 'News Item', 'Topic']
-        for contentType in lockable_types:
-            fti = self.types.getTypeInfo(contentType)
-            for action in fti.listActions():
-                if action.getId() == 'edit':
-                    action.condition = ''
-        # Test it twice
-        for i in range(2):
-            updateEditActionConditionForLocking(self.portal)
-            for contentType in lockable_types:
-                fti = self.types.getTypeInfo(contentType)
-                for action in fti.listActions():
-                    if action.getId() == 'edit':
-                        self.assertEqual(action.condition.text,
-                            "not:object/@@plone_lock_info/is_locked_for_current_user|python:True")
-
-    def testUpdateEditExistingActionConditionForLocking(self):
-        fti = self.types.getTypeInfo('Document')
-        for action in fti.listActions():
-            if action.getId() == 'edit':
-                action.condition = Expression("foo")
-        # Test it twice
-        for i in range(2):
-            updateEditActionConditionForLocking(self.portal)
-            fti = self.types.getTypeInfo('Document')
-            for action in fti.listActions():
-                if action.getId() == 'edit':
-                    self.assertEqual(action.condition.text, 'foo')
-
-    def testAddOnFormUnloadRegistrationJS(self):
-        jsreg = self.portal.portal_javascripts
-        # unregister first
-        jsreg.unregisterResource('unlockOnFormUnload.js')
-        script_ids = jsreg.getResourceIds()
-        self.assertFalse('unlockOnFormUnload.js' in script_ids)
-        # Test it twice
-        for i in range(2):
-            addOnFormUnloadJS(self.portal)
-            script_ids = jsreg.getResourceIds()
-            self.assertTrue('unlockOnFormUnload.js' in script_ids)
-
-    def testUpdateTopicTitle(self):
-        topic = self.types.get('Topic')
-        topic.title = 'Old'
-        # Test it twice
-        for i in range(2):
-            updateTopicTitle(self.portal)
-            self.assertEqual(topic.title, 'Collection')
-
-    def testAddIntelligentText(self):
-        # Before the upgrade, the mime type and transforms of intelligent text
-        # are not available. They *are* here in a fresh site, so we may need
-        # to remove them first for testing. First we remove the transforms,
-        # as they depend on the mimetype being there.
-        missing_transforms = ["web_intelligent_plain_text_to_html",
-                              "html_to_web_intelligent_plain_text"]
-        ptr = self.portal.portal_transforms
-        current_transforms = ptr.objectIds()
-        for trans in missing_transforms:
-            if trans in current_transforms:
-                ptr.unregisterTransform(trans)
-        # Then we remove the mime type
-        mime_type = 'text/x-web-intelligent'
-        mtr = self.portal.mimetypes_registry
-        current_types = mtr.list_mimetypes()
-        if mime_type in current_types:
-            mtr.manage_delObjects((mime_type,))
-        # now all are gone:
-        self.assertFalse(mime_type in mtr.list_mimetypes())
-        self.assertFalse(set(ptr.objectIds()).issuperset(set(missing_transforms)))
-        # Test it twice
-        for i in range(2):
-            addIntelligentText(self.portal)
-            # now all are back:
-            self.assertTrue(mime_type in mtr.list_mimetypes())
-            self.assertTrue(set(ptr.objectIds()).issuperset(set(missing_transforms)))
-
-    def testInstallNewModifiers(self):
-        # ensure the new modifiers are installed
-        modifiers = self.portal.portal_modifier
-        self.assertTrue('AbortVersioningOfLargeFilesAndImages' in
-                                                          modifiers.objectIds())
-        modifiers.manage_delObjects(['AbortVersioningOfLargeFilesAndImages',
-                                     'SkipVersioningOfLargeFilesAndImages'])
-        self.assertFalse('AbortVersioningOfLargeFilesAndImages' in
-                                                          modifiers.objectIds())
-        installNewModifiers(self.portal)
-        self.assertTrue('AbortVersioningOfLargeFilesAndImages' in
-                                                          modifiers.objectIds())
-        self.assertTrue('SkipVersioningOfLargeFilesAndImages' in
-                                                          modifiers.objectIds())
-
-    def testInstallNewModifiersTwice(self):
-        # ensure that we get no errors when run twice
-        installNewModifiers(self.portal)
-        installNewModifiers(self.portal)
-
-    def testInstallNewModifiersDoesNotStompChanges(self):
-        # ensure that reinstalling doesn't kill customizations
-        modifiers = self.portal.portal_modifier
-        modifiers.AbortVersioningOfLargeFilesAndImages.max_size = 1000
-        installNewModifiers(self.portal)
-        self.assertEqual(modifiers.AbortVersioningOfLargeFilesAndImages.max_size,
-                         1000)
-
-    def testInstallNewModifiersNoTool(self):
-        # make sure there are no errors if the tool is missing
-        self.portal._delObject('portal_modifier')
-        installNewModifiers(self.portal)
-
-
-class TestFunctionalMigrations(FunctionalUpgradeTestCase):
-
-    def testBaseUpgrade(self):
-        self.importFile(__file__, 'test-base.zexp')
-        oldsite, result = self.migrate()
-
-        mig = oldsite.portal_migration
-        self.assertFalse(mig.needUpgrading())
-
-    def testFullUpgrade(self):
-        self.importFile(__file__, 'test-full.zexp')
-        oldsite, result = self.migrate()
-
-        mig = oldsite.portal_migration
-        self.assertFalse(mig.needUpgrading())
-
-
-def test_suite():
-    from unittest import TestSuite, makeSuite
-    suite = TestSuite()
-    suite.addTest(makeSuite(TestMigrations_v2_5_x))
-    suite.addTest(makeSuite(TestMigrations_v3_0_Actions))
-    suite.addTest(makeSuite(TestMigrations_v3_0_alpha1))
-    suite.addTest(makeSuite(TestMigrations_v3_0_alpha2))
-    suite.addTest(makeSuite(TestMigrations_v3_0))
-    suite.addTest(makeSuite(TestFunctionalMigrations))
-    return suite
diff --git a/plone/app/upgrade/v31/tests.py b/plone/app/upgrade/v31/tests.py
deleted file mode 100644
index 01005b3..0000000
--- a/plone/app/upgrade/v31/tests.py
+++ /dev/null
@@ -1,118 +0,0 @@
-from borg.localrole.utils import replace_local_role_manager
-from zope.interface import noLongerProvides
-
-from Products.PlonePAS.interfaces.plugins import ILocalRolesPlugin
-
-from plone.app.upgrade.tests.base import FunctionalUpgradeTestCase
-from plone.app.upgrade.tests.base import MigrationTest
-
-from plone.app.upgrade.v31.betas import reinstallCMFPlacefulWorkflow
-
-
-class TestMigrations_v3_1(MigrationTest):
-
-    def afterSetUp(self):
-        self.qi = self.portal.portal_quickinstaller
-        self.wf = self.portal.portal_workflow
-        self.ps = self.portal.portal_setup
-
-    def testReinstallCMFPlacefulWorkflow(self):
-        try:
-            from Products.CMFPlacefulWorkflow.interfaces import IPlacefulMarker
-        except ImportError:
-            return
-        # first the product needs to be installed
-        self.qi.installProduct('CMFPlacefulWorkflow')
-        # Delete existing logs to prevent race condition
-        self.ps.manage_delObjects(self.ps.objectIds())
-        # We remove the new marker, to ensure it's added on reinstall
-        if IPlacefulMarker.providedBy(self.wf):
-            noLongerProvides(self.wf, IPlacefulMarker)
-        reinstallCMFPlacefulWorkflow(self.portal, [])
-        self.assertTrue(IPlacefulMarker.providedBy(self.wf))
-
-    def testReinstallCMFPlacefulWorkflowDoesNotInstall(self):
-        reinstallCMFPlacefulWorkflow(self.portal, [])
-        self.assertFalse(self.qi.isProductInstalled('CMFPlacefulWorkflow'))
-
-    def testReinstallCMFPlacefulWorkflowNoTool(self):
-        self.portal._delObject('portal_quickinstaller')
-        reinstallCMFPlacefulWorkflow(self.portal, [])
-
-    def testReplaceLocalRoleManager(self):
-        # first we replace the local role manager with the one from PlonePAS
-        uf = self.portal.acl_users
-        # deactivate and remove the borg plugin
-        uf.plugins.removePluginById('borg_localroles')
-        uf.manage_delObjects(['borg_localroles'])
-        # activate the standard plugin
-        uf.plugins.activatePlugin(ILocalRolesPlugin, 'local_roles')
-        # Bring things back to normal
-        replace_local_role_manager(self.portal)
-        plugins = uf.plugins.listPlugins(ILocalRolesPlugin)
-        self.assertEqual(len(plugins), 1)
-        self.assertEqual(plugins[0][0], 'borg_localroles')
-
-    def testReplaceLocalRoleManagerTwice(self):
-        # first we replace the local role manager with the one from PlonePAS
-        uf = self.portal.acl_users
-        # deactivate and remove the borg plugin
-        uf.plugins.removePluginById('borg_localroles')
-        uf.manage_delObjects(['borg_localroles'])
-        # activate the standard plugin
-        uf.plugins.activatePlugin(ILocalRolesPlugin, 'local_roles')
-        # run the upgrade twice
-        replace_local_role_manager(self.portal)
-        replace_local_role_manager(self.portal)
-        plugins = uf.plugins.listPlugins(ILocalRolesPlugin)
-        self.assertEqual(len(plugins), 1)
-        self.assertEqual(plugins[0][0], 'borg_localroles')
-
-    def testReplaceLocalRoleManagerNoPlugin(self):
-        # first we replace the local role manager with the one from PlonePAS
-        uf = self.portal.acl_users
-        # deactivate and remove the borg plugin
-        uf.plugins.removePluginById('borg_localroles')
-        uf.manage_delObjects(['borg_localroles'])
-        # dele…
tisto added a commit that referenced this pull request Mar 2, 2015
Branch: refs/heads/master
Date: 2015-01-26T19:50:04+01:00
Author: Jure Cerjak (jcerjak) <jcerjak@termitnjak.si>
Commit: plone/plone.app.collection@67e3724

Read "allow_anon_views_about" from registry instead of properties

Files changed:
M CHANGES.rst
M plone/app/collection/browser/templates/standard_view.pt

diff --git a/CHANGES.rst b/CHANGES.rst
index 169f9c9..9adfd4e 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,7 +4,9 @@ Changelog
 1.1.3 (unreleased)
 ------------------
 
-- Nothing changed yet.
+- Read ``allow_anon_views_about`` setting from the registry instead of portal
+  properties (see plone/Products.CMFPlone#216).
+  [jcerjak]
 
 
 1.1.2 (2014-10-23)
diff --git a/plone/app/collection/browser/templates/standard_view.pt b/plone/app/collection/browser/templates/standard_view.pt
index 052ebf8..408e4d2 100644
--- a/plone/app/collection/browser/templates/standard_view.pt
+++ b/plone/app/collection/browser/templates/standard_view.pt
@@ -33,7 +33,7 @@
                              isAnon context/@@plone_portal_state/anonymous;
                              normalizeString nocall: context/plone_utils/normalizeString;
                              toLocalizedTime nocall: context/@@plone/toLocalizedTime;
-                             show_about python:not isAnon or site_properties.allowAnonymousViewAbout;
+                             show_about python:not isAnon or context.portal_registry['plone.allow_anon_views_about'];
                              navigation_root_url context/@@plone_portal_state/navigation_root_url;
                              pas_member context/@@pas_member;">
         <tal:listing condition="batch">


Repository: plone.app.collection
Branch: refs/heads/master
Date: 2015-02-27T07:50:17+01:00
Author: Timo Stollenwerk () <contact@timostollenwerk.net>
Commit: plone/plone.app.collection@321bd07

Merge branch 'master' into plip10359-security-controlpanel

Conflicts:
	CHANGES.rst

Files changed:
A plone/app/collection/marshaller.py
M CHANGES.rst
M plone/app/collection/collection.py
M plone/app/collection/configure.zcml
M plone/app/collection/tests/test_collection.py
M setup.py

diff --git a/CHANGES.rst b/CHANGES.rst
index 9adfd4e..d42b982 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -8,6 +8,9 @@ Changelog
   properties (see plone/Products.CMFPlone#216).
   [jcerjak]
 
+- Support for import and export of collections using FTP, DAV and GenericSetup
+  [matthewwilkes]
+
 
 1.1.2 (2014-10-23)
 ------------------
diff --git a/plone/app/collection/collection.py b/plone/app/collection/collection.py
index eac3bce..5504a4e 100644
--- a/plone/app/collection/collection.py
+++ b/plone/app/collection/collection.py
@@ -2,7 +2,7 @@
 from OFS.ObjectManager import ObjectManager
 from plone.app.collection.field import QueryField
 from plone.app.contentlisting.interfaces import IContentListing
-from plone.app.widgets.at import QueryStringWidget
+from Products.Archetypes.Widget import QueryStringWidget
 from Products.ATContentTypes.content import document, schemata
 from Products.Archetypes import atapi
 from Products.Archetypes.atapi import (BooleanField,
@@ -20,7 +20,7 @@
 from plone.app.collection import PloneMessageFactory as _
 from plone.app.collection.config import ATCT_TOOLNAME, PROJECTNAME
 from plone.app.collection.interfaces import ICollection
-
+from plone.app.collection.marshaller import CollectionRFC822Marshaller
 
 CollectionSchema = document.ATDocumentSchema.copy() + atapi.Schema((
 
@@ -86,6 +86,9 @@
         ),
 ))
 
+# Use the extended marshaller that understands queries
+CollectionSchema.registerLayer("marshall", CollectionRFC822Marshaller())
+
 CollectionSchema.moveField('query', after='description')
 if 'presentation' in CollectionSchema:
     CollectionSchema['presentation'].widget.visible = False
diff --git a/plone/app/collection/configure.zcml b/plone/app/collection/configure.zcml
index 33ce9dc..d2bda5d 100644
--- a/plone/app/collection/configure.zcml
+++ b/plone/app/collection/configure.zcml
@@ -14,7 +14,7 @@
     name="default"
     title="plone.app.collection"
     directory="profiles/default"
-    description="Adds support for new style collections to Plone"
+    description="Archetypes-based collections"
     provides="Products.GenericSetup.interfaces.EXTENSION"
     />
 
diff --git a/plone/app/collection/marshaller.py b/plone/app/collection/marshaller.py
new file mode 100644
index 0000000..acab0ad
--- /dev/null
+++ b/plone/app/collection/marshaller.py
@@ -0,0 +1,68 @@
+from types import ListType, TupleType
+
+from zope.contenttype import guess_content_type
+
+from AccessControl import ClassSecurityInfo
+from App.class_init import InitializeClass
+from Products.Archetypes.interfaces.base import IBaseUnit
+from Products.Archetypes.utils import mapply
+from Products.Archetypes.Marshall import RFC822Marshaller, parseRFC822, formatRFC822Headers
+
+
+class CollectionRFC822Marshaller(RFC822Marshaller):
+
+    security = ClassSecurityInfo()
+    security.declareObjectPrivate()
+    security.setDefaultAccess('deny')
+
+    def demarshall(self, instance, data, **kwargs):
+        # We don't want to pass file forward.
+        if 'file' in kwargs:
+            if not data:
+                # TODO Yuck! Shouldn't read the whole file, never.
+                # OTOH, if you care about large files, you should be
+                # using the PrimaryFieldMarshaller or something
+                # similar.
+                data = kwargs['file'].read()
+            del kwargs['file']
+        headers, body = parseRFC822(data)
+        
+        query = {}
+        for k, v in headers.items():
+            if not k.startswith("query"):
+                continue
+            else:
+                index = int(k[5])
+                sub_key = k.split("_")[1]
+                query_part = query.get(index, {})
+                query_part[sub_key] = v
+                query[index] = query_part
+                del headers[k]
+        query = [facet[1] for facet in sorted(query.items())]
+        
+        header = formatRFC822Headers(headers.items())
+        data = '%s\n\n%s' % (header, body)
+        
+        try:
+            return RFC822Marshaller.demarshall(self, instance, data, **kwargs)
+        finally:
+            instance.query = query
+
+    def marshall(self, instance, **kwargs):
+        content_type, length, data = RFC822Marshaller.marshall(self, instance, **kwargs)
+        headers, body = parseRFC822(data)
+        
+        headers = headers.items()
+        for i, query in enumerate(instance.query):
+            for key, value in query.items():
+                if isinstance(value, list):
+                    value = "\n".join(value)
+                header_key = 'query%d_%s' % (i, key)
+                headers.append((header_key, value))
+        
+        header = formatRFC822Headers(headers)
+        data = '%s\n\n%s' % (header, body)
+        length = len(data)
+        return (content_type, length, data)
+
+InitializeClass(CollectionRFC822Marshaller)
\ No newline at end of file
diff --git a/plone/app/collection/tests/test_collection.py b/plone/app/collection/tests/test_collection.py
index f1611e7..9599d3e 100644
--- a/plone/app/collection/tests/test_collection.py
+++ b/plone/app/collection/tests/test_collection.py
@@ -7,6 +7,7 @@
 from plone.app.testing import setRoles
 from plone.testing.z2 import Browser
 from transaction import commit
+from Products.Archetypes.Marshall import parseRFC822
 
 import unittest2 as unittest
 
@@ -235,3 +236,94 @@ def test_selectedViewFields(self):
     def test_syndication_enabled_by_default(self):
         syn = getToolByName(self.portal, 'portal_syndication')
         self.assertTrue(syn.isSyndicationAllowed(self.collection))
+
+
+class TestMarshalling(unittest.TestCase):
+
+    layer = PLONEAPPCOLLECTION_INTEGRATION_TESTING
+
+    def test_simple_query_included_in_marshall_results(self):
+        portal = self.layer['portal']
+        login(portal, 'admin')
+        query = [{
+            'i': 'portal_type',
+            'o': 'plone.app.querystring.operation.string.is',
+            'v': 'News Item',
+        }]
+        portal.invokeFactory("Collection",
+                             "collection",
+                             query=query,
+                             title="New Collection")
+        collection = portal['collection']
+        rfc822 = collection.manage_FTPget()
+        data = parseRFC822(rfc822)
+        self.assertIn('query0_i', data[0])
+        self.assertIn('query0_o', data[0])
+        self.assertIn('query0_v', data[0])
+        
+        self.assertEqual(data[0]['query0_i'], query[0]['i'])
+        self.assertEqual(data[0]['query0_o'], query[0]['o'])
+        self.assertEqual(data[0]['query0_v'], query[0]['v'])
+    
+    def test_multiple_query_items_included_in_marshall_results(self):
+        portal = self.layer['portal']
+        login(portal, 'admin')
+        query = [{
+            'i': 'portal_type',
+            'o': 'plone.app.querystring.operation.string.is',
+            'v': 'News Item',
+        },{ 'i': 'Title',
+            'o': 'plone.app.querystring.operation.string.is',
+            'v': 'Test News Item',
+        }]
+        
+        portal.invokeFactory("Collection",
+                             "collection",
+                             query=query,
+                             title="New Collection")
+        collection = portal['collection']
+        rfc822 = collection.manage_FTPget()
+        data = parseRFC822(rfc822)
+        
+        self.assertIn('query0_i', data[0])
+        self.assertIn('query0_o', data[0])
+        self.assertIn('query0_v', data[0])
+        self.assertIn('query1_i', data[0])
+        self.assertIn('query1_o', data[0])
+        self.assertIn('query1_v', data[0])
+        
+        self.assertEqual(data[0]['query0_i'], query[0]['i'])
+        self.assertEqual(data[0]['query0_o'], query[0]['o'])
+        self.assertEqual(data[0]['query0_v'], query[0]['v'])
+        self.assertEqual(data[0]['query1_i'], query[1]['i'])
+        self.assertEqual(data[0]['query1_o'], query[1]['o'])
+        self.assertEqual(data[0]['query1_v'], query[1]['v'])
+    
+    def test_query_gets_set_on_PUT(self):
+        portal = self.layer['portal']
+        login(portal, 'admin')
+        query = [{
+            'i': 'portal_type',
+            'o': 'plone.app.querystring.operation.string.is',
+            'v': 'News Item',
+        }]
+        
+        expected_query = [{
+            'i': 'portal_type',
+            'o': 'plone.app.querystring.operation.string.is',
+            'v': 'LOREM IPSUM DOLOR',
+        }]
+        
+        portal.invokeFactory("Collection",
+                             "collection",
+                             query=query,
+                             title="New Collection")
+        collection = portal['collection']
+        rfc822 = collection.manage_FTPget()
+        # Modify the response to put in a sentinal, to check it's been updated
+        rfc822 = rfc822.replace(query[0]['v'], expected_query[0]['v'])
+        
+        portal.REQUEST.set("BODY", rfc822)
+        collection.PUT(portal.REQUEST, None)
+        self.assertEqual(collection.query, expected_query)
+    
diff --git a/setup.py b/setup.py
index c4d4d8d..9a982fb 100644
--- a/setup.py
+++ b/setup.py
@@ -31,7 +31,7 @@
           'plone.app.widgets',
           'plone.portlet.collection',
           'plone.portlets',
-          'Products.Archetypes',
+          'Products.Archetypes>=1.10.4.dev0',
           'Products.CMFCore',
           'Products.CMFPlone',
           'Products.CMFQuickInstallerTool',


Repository: plone.app.collection
Branch: refs/heads/master
Date: 2015-02-27T14:39:17+01:00
Author: Jure Cerjak (jcerjak) <jcerjak@termitnjak.si>
Commit: plone/plone.app.collection@2da6fa1

restore plone 4 compatibility for 'show about' setting

Files changed:
M CHANGES.rst
M plone/app/collection/browser/templates/standard_view.pt
M plone/app/collection/tests/test_collection.py

diff --git a/CHANGES.rst b/CHANGES.rst
index d42b982..10ee51a 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,8 +4,8 @@ Changelog
 1.1.3 (unreleased)
 ------------------
 
-- Read ``allow_anon_views_about`` setting from the registry instead of portal
-  properties (see plone/Products.CMFPlone#216).
+- Read ``allow_anon_views_about`` setting from the registry, with fallback to
+  portal properties (see plone/Products.CMFPlone#216)
   [jcerjak]
 
 - Support for import and export of collections using FTP, DAV and GenericSetup
diff --git a/plone/app/collection/browser/templates/standard_view.pt b/plone/app/collection/browser/templates/standard_view.pt
index 408e4d2..2d036bc 100644
--- a/plone/app/collection/browser/templates/standard_view.pt
+++ b/plone/app/collection/browser/templates/standard_view.pt
@@ -29,11 +29,14 @@
         <tal:results define="b_start python:request.get('b_start', 0);
                              batch python:context.results(b_start=b_start);
                              site_properties context/portal_properties/site_properties;
+                             portal_registry context/portal_registry|nothing;
                              use_view_action site_properties/typesUseViewActionInListings|python:();
                              isAnon context/@@plone_portal_state/anonymous;
                              normalizeString nocall: context/plone_utils/normalizeString;
                              toLocalizedTime nocall: context/@@plone/toLocalizedTime;
-                             show_about python:not isAnon or context.portal_registry['plone.allow_anon_views_about'];
+                             show_about_bbb site_properties/allowAnonymousViewAbout|nothing;
+                             show_about_registry python:portal_registry and portal_registry.get('plone.allow_anon_views_about');
+                             show_about python:not isAnon or show_about_registry or show_about_bbb;
                              navigation_root_url context/@@plone_portal_state/navigation_root_url;
                              pas_member context/@@pas_member;">
         <tal:listing condition="batch">
diff --git a/plone/app/collection/tests/test_collection.py b/plone/app/collection/tests/test_collection.py
index 9599d3e..b2640ff 100644
--- a/plone/app/collection/tests/test_collection.py
+++ b/plone/app/collection/tests/test_collection.py
@@ -42,6 +42,14 @@ def setUp(self):
             pass
         self.collection = self.portal['col']
 
+    def _set_up_collection(self):
+        self.portal.invokeFactory(
+            'Document',
+            'doc1',
+            title='Collection Test Page'
+        )
+        self.collection.setQuery(query)
+
     def test_addCollection(self):
         self.portal.invokeFactory("Collection",
                                   "col1",
@@ -114,6 +122,160 @@ def test_viewingCollection(self):
         browser.open(self.collection.absolute_url())
         self.assertTrue("Collection Test Page" in browser.contents)
 
+    def test_show_about_no_registry_has_property_noshow(self):
+        """Test the case where we fetch show about information from portal
+        properties (Plone < 5) and show about is False.
+        """
+        # disable show about in site properties
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', False, 'boolean')
+        except:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=False)
+        self.portal.portal_registry = None
+
+        self._set_up_collection()
+
+        # logout and check if author information is hidden
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertFalse("author" in result)
+        self.assertFalse("test-user" in result)
+
+    def test_show_about_no_registry_has_property_show(self):
+        """Test the case where we fetch show about information from portal
+        properties (Plone < 5) and show about is True.
+        """
+        # enable show about in site properties
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', True, 'boolean')
+        except:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=True)
+        self.portal.portal_registry = None
+
+        self._set_up_collection()
+
+        # logout and check if author information is shown
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertTrue("author" in result)
+        self.assertTrue("test-user" in result)
+
+    def test_show_about_has_property_and_registry_noshow(self):
+        """Test the case where we fetch show about information from portal
+        properties, but registry is also present (Plone < 5, with
+        plone.app.registry installed) and show about is False.
+        """
+        # disable show about in site properties, create an empty registry
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', False, 'boolean')
+        except:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=False)
+        self.portal.portal_registry = {}  # mock the registry
+
+        self._set_up_collection()
+
+        # logout and check if author information is hidden
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertFalse("author" in result)
+        self.assertFalse("test-user" in result)
+
+    def test_show_about_has_property_and_registry_show(self):
+        """Test the case where we fetch show about information from portal
+        properties, but registry is also present (Plone < 5, with
+        plone.app.registry installed) and show about is True.
+        """
+        # enable show about in site properties, create an empty registry
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', True, 'boolean')
+        except:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=True)
+        self.portal.portal_registry = {}  # mock the registry
+
+        self._set_up_collection()
+
+        # logout and check if author information is shown
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertTrue("author" in result)
+        self.assertTrue("test-user" in result)
+
+    def test_show_about_has_registry_no_property_noshow(self):
+        """Test the case where we fetch show about information from the
+        registry (Plone >= 5) and show about is False.
+        """
+        # disable show about in the registry, delete 'allowAnonymousViewAbout'
+        # property
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_delProperties(
+                ['allowAnonymousViewAbout'])
+        except:
+            pass
+        self.portal.portal_registry = {'plone.allow_anon_views_about': False}
+
+        self._set_up_collection()
+
+        # logout and check if author information is hidden
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertFalse("author" in result)
+        self.assertFalse("test-user" in result)
+
+    def test_show_about_has_registry_no_property_show(self):
+        """Test the case where we fetch show about information from the
+        registry (Plone >= 5) and show about is True.
+        """
+        # enable show about in the registry, delete 'allowAnonymousViewAbout'
+        # property
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_delProperties(
+                ['allowAnonymousViewAbout'])
+        except:
+            pass
+        self.portal.portal_registry = {'plone.allow_anon_views_about': True}
+
+        self._set_up_collection()
+
+        # logout and check if author information is shown
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertTrue("author" in result)
+        self.assertTrue("test-user" in result)
+
+    def test_show_about_logged_in(self):
+        """Test the case where we show about information if a user is logged in
+        even though show about is set to False
+        """
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', False, 'boolean')
+        except:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=False)
+        self.portal.portal_registry = {'plone.allow_anon_views_about': False}
+
+        self._set_up_collection()
+
+        # check if author information is shown
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertTrue("author" in result)
+        self.assertTrue("test-user" in result)
+
     def test_collection_templates(self):
         data = getData('image.png')
         # add an image that will be listed by the collection
@@ -260,11 +422,11 @@ def test_simple_query_included_in_marshall_results(self):
         self.assertIn('query0_i', data[0])
         self.assertIn('query0_o', data[0])
         self.assertIn('query0_v', data[0])
-        
+
         self.assertEqual(data[0]['query0_i'], query[0]['i'])
         self.assertEqual(data[0]['query0_o'], query[0]['o'])
         self.assertEqual(data[0]['query0_v'], query[0]['v'])
-    
+
     def test_multiple_query_items_included_in_marshall_results(self):
         portal = self.layer['portal']
         login(portal, 'admin')
@@ -276,7 +438,7 @@ def test_multiple_query_items_included_in_marshall_results(self):
             'o': 'plone.app.querystring.operation.string.is',
             'v': 'Test News Item',
         }]
-        
+
         portal.invokeFactory("Collection",
                              "collection",
                              query=query,
@@ -284,21 +446,21 @@ def test_multiple_query_items_included_in_marshall_results(self):
         collection = portal['collection']
         rfc822 = collection.manage_FTPget()
         data = parseRFC822(rfc822)
-        
+
         self.assertIn('query0_i', data[0])
         self.assertIn('query0_o', data[0])
         self.assertIn('query0_v', data[0])
         self.assertIn('query1_i', data[0])
         self.assertIn('query1_o', data[0])
         self.assertIn('query1_v', data[0])
-        
+
         self.assertEqual(data[0]['query0_i'], query[0]['i'])
         self.assertEqual(data[0]['query0_o'], query[0]['o'])
         self.assertEqual(data[0]['query0_v'], query[0]['v'])
         self.assertEqual(data[0]['query1_i'], query[1]['i'])
         self.assertEqual(data[0]['query1_o'], query[1]['o'])
         self.assertEqual(data[0]['query1_v'], query[1]['v'])
-    
+
     def test_query_gets_set_on_PUT(self):
         portal = self.layer['portal']
         login(portal, 'admin')
@@ -307,13 +469,13 @@ def test_query_gets_set_on_PUT(self):
             'o': 'plone.app.querystring.operation.string.is',
             'v': 'News Item',
         }]
-        
+
         expected_query = [{
             'i': 'portal_type',
             'o': 'plone.app.querystring.operation.string.is',
             'v': 'LOREM IPSUM DOLOR',
         }]
-        
+
         portal.invokeFactory("Collection",
                              "collection",
                              query=query,
@@ -322,8 +484,7 @@ def test_query_gets_set_on_PUT(self):
         rfc822 = collection.manage_FTPget()
         # Modify the response to put in a sentinal, to check it's been updated
         rfc822 = rfc822.replace(query[0]['v'], expected_query[0]['v'])
-        
+
         portal.REQUEST.set("BODY", rfc822)
         collection.PUT(portal.REQUEST, None)
         self.assertEqual(collection.query, expected_query)
-    


Repository: plone.app.collection
Branch: refs/heads/master
Date: 2015-02-27T18:30:41+01:00
Author: Jure Cerjak (jcerjak) <jcerjak@termitnjak.si>
Commit: plone/plone.app.collection@8dc58e5

don't do bare excepts

Files changed:
M plone/app/collection/tests/test_collection.py

diff --git a/plone/app/collection/tests/test_collection.py b/plone/app/collection/tests/test_collection.py
index b2640ff..0804004 100644
--- a/plone/app/collection/tests/test_collection.py
+++ b/plone/app/collection/tests/test_collection.py
@@ -1,3 +1,4 @@
+from Products.Archetypes.Marshall import parseRFC822
 from Products.CMFCore.utils import getToolByName
 from plone.app.collection.testing import PLONEAPPCOLLECTION_INTEGRATION_TESTING
 from plone.app.testing import TEST_USER_ID
@@ -7,7 +8,7 @@
 from plone.app.testing import setRoles
 from plone.testing.z2 import Browser
 from transaction import commit
-from Products.Archetypes.Marshall import parseRFC822
+from zExceptions import BadRequest
 
 import unittest2 as unittest
 
@@ -131,7 +132,7 @@ def test_show_about_no_registry_has_property_noshow(self):
         try:
             properties.site_properties.manage_addProperty(
                 'allowAnonymousViewAbout', False, 'boolean')
-        except:
+        except BadRequest:
             properties.site_properties.manage_changeProperties(
                 allowAnonymousViewAbout=False)
         self.portal.portal_registry = None
@@ -153,7 +154,7 @@ def test_show_about_no_registry_has_property_show(self):
         try:
             properties.site_properties.manage_addProperty(
                 'allowAnonymousViewAbout', True, 'boolean')
-        except:
+        except BadRequest:
             properties.site_properties.manage_changeProperties(
                 allowAnonymousViewAbout=True)
         self.portal.portal_registry = None
@@ -176,7 +177,7 @@ def test_show_about_has_property_and_registry_noshow(self):
         try:
             properties.site_properties.manage_addProperty(
                 'allowAnonymousViewAbout', False, 'boolean')
-        except:
+        except BadRequest:
             properties.site_properties.manage_changeProperties(
                 allowAnonymousViewAbout=False)
         self.portal.portal_registry = {}  # mock the registry
@@ -199,7 +200,7 @@ def test_show_about_has_property_and_registry_show(self):
         try:
             properties.site_properties.manage_addProperty(
                 'allowAnonymousViewAbout', True, 'boolean')
-        except:
+        except BadRequest:
             properties.site_properties.manage_changeProperties(
                 allowAnonymousViewAbout=True)
         self.portal.portal_registry = {}  # mock the registry
@@ -222,7 +223,7 @@ def test_show_about_has_registry_no_property_noshow(self):
         try:
             properties.site_properties.manage_delProperties(
                 ['allowAnonymousViewAbout'])
-        except:
+        except BadRequest:
             pass
         self.portal.portal_registry = {'plone.allow_anon_views_about': False}
 
@@ -244,7 +245,7 @@ def test_show_about_has_registry_no_property_show(self):
         try:
             properties.site_properties.manage_delProperties(
                 ['allowAnonymousViewAbout'])
-        except:
+        except BadRequest:
             pass
         self.portal.portal_registry = {'plone.allow_anon_views_about': True}
 
@@ -264,7 +265,7 @@ def test_show_about_logged_in(self):
         try:
             properties.site_properties.manage_addProperty(
                 'allowAnonymousViewAbout', False, 'boolean')
-        except:
+        except BadRequest:
             properties.site_properties.manage_changeProperties(
                 allowAnonymousViewAbout=False)
         self.portal.portal_registry = {'plone.allow_anon_views_about': False}


Repository: plone.app.collection
Branch: refs/heads/master
Date: 2015-03-02T18:07:09+01:00
Author: Timo Stollenwerk (tisto) <tisto@plone.org>
Commit: plone/plone.app.collection@f50678f

Merge pull request #22 from plone/plip10359-security-controlpanel

Plip 10359 - Security Control Panel migration

Files changed:
M CHANGES.rst
M plone/app/collection/browser/templates/standard_view.pt
M plone/app/collection/tests/test_collection.py

diff --git a/CHANGES.rst b/CHANGES.rst
index 734edfa..10ee51a 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,10 @@ Changelog
 1.1.3 (unreleased)
 ------------------
 
+- Read ``allow_anon_views_about`` setting from the registry, with fallback to
+  portal properties (see plone/Products.CMFPlone#216)
+  [jcerjak]
+
 - Support for import and export of collections using FTP, DAV and GenericSetup
   [matthewwilkes]
 
diff --git a/plone/app/collection/browser/templates/standard_view.pt b/plone/app/collection/browser/templates/standard_view.pt
index 052ebf8..2d036bc 100644
--- a/plone/app/collection/browser/templates/standard_view.pt
+++ b/plone/app/collection/browser/templates/standard_view.pt
@@ -29,11 +29,14 @@
         <tal:results define="b_start python:request.get('b_start', 0);
                              batch python:context.results(b_start=b_start);
                              site_properties context/portal_properties/site_properties;
+                             portal_registry context/portal_registry|nothing;
                              use_view_action site_properties/typesUseViewActionInListings|python:();
                              isAnon context/@@plone_portal_state/anonymous;
                              normalizeString nocall: context/plone_utils/normalizeString;
                              toLocalizedTime nocall: context/@@plone/toLocalizedTime;
-                             show_about python:not isAnon or site_properties.allowAnonymousViewAbout;
+                             show_about_bbb site_properties/allowAnonymousViewAbout|nothing;
+                             show_about_registry python:portal_registry and portal_registry.get('plone.allow_anon_views_about');
+                             show_about python:not isAnon or show_about_registry or show_about_bbb;
                              navigation_root_url context/@@plone_portal_state/navigation_root_url;
                              pas_member context/@@pas_member;">
         <tal:listing condition="batch">
diff --git a/plone/app/collection/tests/test_collection.py b/plone/app/collection/tests/test_collection.py
index 9599d3e..0804004 100644
--- a/plone/app/collection/tests/test_collection.py
+++ b/plone/app/collection/tests/test_collection.py
@@ -1,3 +1,4 @@
+from Products.Archetypes.Marshall import parseRFC822
 from Products.CMFCore.utils import getToolByName
 from plone.app.collection.testing import PLONEAPPCOLLECTION_INTEGRATION_TESTING
 from plone.app.testing import TEST_USER_ID
@@ -7,7 +8,7 @@
 from plone.app.testing import setRoles
 from plone.testing.z2 import Browser
 from transaction import commit
-from Products.Archetypes.Marshall import parseRFC822
+from zExceptions import BadRequest
 
 import unittest2 as unittest
 
@@ -42,6 +43,14 @@ def setUp(self):
             pass
         self.collection = self.portal['col']
 
+    def _set_up_collection(self):
+        self.portal.invokeFactory(
+            'Document',
+            'doc1',
+            title='Collection Test Page'
+        )
+        self.collection.setQuery(query)
+
     def test_addCollection(self):
         self.portal.invokeFactory("Collection",
                                   "col1",
@@ -114,6 +123,160 @@ def test_viewingCollection(self):
         browser.open(self.collection.absolute_url())
         self.assertTrue("Collection Test Page" in browser.contents)
 
+    def test_show_about_no_registry_has_property_noshow(self):
+        """Test the case where we fetch show about information from portal
+        properties (Plone < 5) and show about is False.
+        """
+        # disable show about in site properties
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', False, 'boolean')
+        except BadRequest:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=False)
+        self.portal.portal_registry = None
+
+        self._set_up_collection()
+
+        # logout and check if author information is hidden
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertFalse("author" in result)
+        self.assertFalse("test-user" in result)
+
+    def test_show_about_no_registry_has_property_show(self):
+        """Test the case where we fetch show about information from portal
+        properties (Plone < 5) and show about is True.
+        """
+        # enable show about in site properties
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', True, 'boolean')
+        except BadRequest:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=True)
+        self.portal.portal_registry = None
+
+        self._set_up_collection()
+
+        # logout and check if author information is shown
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertTrue("author" in result)
+        self.assertTrue("test-user" in result)
+
+    def test_show_about_has_property_and_registry_noshow(self):
+        """Test the case where we fetch show about information from portal
+        properties, but registry is also present (Plone < 5, with
+        plone.app.registry installed) and show about is False.
+        """
+        # disable show about in site properties, create an empty registry
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', False, 'boolean')
+        except BadRequest:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=False)
+        self.portal.portal_registry = {}  # mock the registry
+
+        self._set_up_collection()
+
+        # logout and check if author information is hidden
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertFalse("author" in result)
+        self.assertFalse("test-user" in result)
+
+    def test_show_about_has_property_and_registry_show(self):
+        """Test the case where we fetch show about information from portal
+        properties, but registry is also present (Plone < 5, with
+        plone.app.registry installed) and show about is True.
+        """
+        # enable show about in site properties, create an empty registry
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', True, 'boolean')
+        except BadRequest:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=True)
+        self.portal.portal_registry = {}  # mock the registry
+
+        self._set_up_collection()
+
+        # logout and check if author information is shown
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertTrue("author" in result)
+        self.assertTrue("test-user" in result)
+
+    def test_show_about_has_registry_no_property_noshow(self):
+        """Test the case where we fetch show about information from the
+        registry (Plone >= 5) and show about is False.
+        """
+        # disable show about in the registry, delete 'allowAnonymousViewAbout'
+        # property
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_delProperties(
+                ['allowAnonymousViewAbout'])
+        except BadRequest:
+            pass
+        self.portal.portal_registry = {'plone.allow_anon_views_about': False}
+
+        self._set_up_collection()
+
+        # logout and check if author information is hidden
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertFalse("author" in result)
+        self.assertFalse("test-user" in result)
+
+    def test_show_about_has_registry_no_property_show(self):
+        """Test the case where we fetch show about information from the
+        registry (Plone >= 5) and show about is True.
+        """
+        # enable show about in the registry, delete 'allowAnonymousViewAbout'
+        # property
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_delProperties(
+                ['allowAnonymousViewAbout'])
+        except BadRequest:
+            pass
+        self.portal.portal_registry = {'plone.allow_anon_views_about': True}
+
+        self._set_up_collection()
+
+        # logout and check if author information is shown
+        logout()
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertTrue("author" in result)
+        self.assertTrue("test-user" in result)
+
+    def test_show_about_logged_in(self):
+        """Test the case where we show about information if a user is logged in
+        even though show about is set to False
+        """
+        properties = getToolByName(self.portal, 'portal_properties')
+        try:
+            properties.site_properties.manage_addProperty(
+                'allowAnonymousViewAbout', False, 'boolean')
+        except BadRequest:
+            properties.site_properties.manage_changeProperties(
+                allowAnonymousViewAbout=False)
+        self.portal.portal_registry = {'plone.allow_anon_views_about': False}
+
+        self._set_up_collection()
+
+        # check if author information is shown
+        result = self.collection.restrictedTraverse('standard_view')()
+        self.assertTrue("author" in result)
+        self.assertTrue("test-user" in result)
+
     def test_collection_templates(self):
         data = getData('image.png')
         # add an image that will be listed by the collection
@@ -260,11 +423,11 @@ def test_simple_query_included_in_marshall_results(self):
         self.assertIn('query0_i', data[0])
         self.assertIn('query0_o', data[0])
         self.assertIn('query0_v', data[0])
-        
+
         self.assertEqual(data[0]['query0_i'], query[0]['i'])
         self.assertEqual(data[0]['query0_o'], query[0]['o'])
         self.assertEqual(data[0]['query0_v'], query[0]['v'])
-    
+
     def test_multiple_query_items_included_in_marshall_results(self):
         portal = self.layer['portal']
         login(portal, 'admin')
@@ -276,7 +439,7 @@ def test_multiple_query_items_included_in_marshall_results(self):
             'o': 'plone.app.querystring.operation.string.is',
             'v': 'Test News Item',
         }]
-        
+
         portal.invokeFactory("Collection",
                              "collection",
                              query=query,
@@ -284,21 +447,21 @@ def test_multiple_query_items_included_in_marshall_results(self):
         collection = portal['collection']
         rfc822 = collection.manage_FTPget()
         data = parseRFC822(rfc822)
-        
+
         self.assertIn('query0_i', data[0])
         self.assertIn('query0_o', data[0])
         self.assertIn('query0_v', data[0])
         self.assertIn('query1_i', data[0])
         self.assertIn('query1_o', data[0])
         self.assertIn('query1_v', data[0])
-        
+
         self.assertEqual(data[0]['query0_i'], query[0]['i'])
         self.assertEqual(data[0]['query0_o'], query[0]['o'])
         self.assertEqual(data[0]['query0_v'], query[0]['v'])
         self.assertEqual(data[0]['query1_i'], query[1]['i'])
         self.assertEqual(data[0]['query1_o'], query[1]['o'])
         self.assertEqual(data[0]['query1_v'], query[1]['v'])
-    
+
     def test_query_gets_set_on_PUT(self):
         portal = self.layer['portal']
         login(portal, 'admin')
@@ -307,13 +470,13 @@ def test_query_gets_set_on_PUT(self):
             'o': 'plone.app.querystring.operation.string.is',
             'v': 'News Item',
         }]
-        
+
         expected_query = [{
             'i': 'portal_type',
             'o': 'plone.app.querystring.operation.string.is',
             'v': 'LOREM IPSUM DOLOR',
         }]
-        
+
         portal.invokeFactory("Collection",
                              "collection",
                              query=query,
@@ -322,8 +485,7 @@ def test_query_gets_set_on_PUT(self):
         rfc822 = collection.manage_FTPget()
         # Modify the response to put in a sentinal, to check it's been updated
         rfc822 = rfc822.replace(query[0]['v'], expected_query[0]['v'])
-        
+
         portal.REQUEST.set("BODY", rfc822)
         collection.PUT(portal.REQUEST, None)
         self.assertEqual(collection.query, expected_query)
-
frisi added a commit that referenced this pull request Mar 9, 2015
Branch: refs/heads/master
Date: 2015-02-26T22:43:13+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@7db068a

undo changes introduced with a537138d8fbfdbacd571886dd3728debe45ea9ee

Conflicts:
	docs/CHANGES.txt

Files changed:
M docs/CHANGES.txt
M src/archetypes/referencebrowserwidget/browser/view.py
M src/archetypes/referencebrowserwidget/tests/test_product.py
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-02-26T22:43:41+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@9a4a82f

only show items that are either referenceable or can be used for browsing

Files changed:
M src/archetypes/referencebrowserwidget/browser/popup.pt
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-02-26T22:44:14+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@f0ab009

add unittest

Files changed:
M src/archetypes/referencebrowserwidget/tests/test_product.py
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-02-26T22:44:26+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@b8a7ffc

filter non-referencable items before creating the batch to not end up having batch navigation pages without any items

Files changed:
M src/archetypes/referencebrowserwidget/browser/popup.pt
M src/archetypes/referencebrowserwidget/browser/view.py
M src/archetypes/referencebrowserwidget/tests/test_product.py
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-02-26T22:46:07+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@c4049ab

add warning to changelog, fix unit-test

Conflicts:
	docs/CHANGES.txt

Files changed:
M CONTRIBUTORS.txt
M docs/CHANGES.txt
M src/archetypes/referencebrowserwidget/tests/test_product.py
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-03-09T11:33:12+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@bb73074

Merge pull request #22 from plone/issue16-allowed_types

take allowed_types into account, but also allow users to browse

Files changed:
M CONTRIBUTORS.txt
M docs/CHANGES.txt
M src/archetypes/referencebrowserwidget/browser/popup.pt
M src/archetypes/referencebrowserwidget/browser/view.py
M src/archetypes/referencebrowserwidget/tests/test_product.py
frisi added a commit that referenced this pull request Mar 9, 2015
Branch: refs/heads/master
Date: 2015-02-26T22:43:13+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@7db068a

undo changes introduced with a537138d8fbfdbacd571886dd3728debe45ea9ee

Conflicts:
	docs/CHANGES.txt

Files changed:
M docs/CHANGES.txt
M src/archetypes/referencebrowserwidget/browser/view.py
M src/archetypes/referencebrowserwidget/tests/test_product.py
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-02-26T22:43:41+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@9a4a82f

only show items that are either referenceable or can be used for browsing

Files changed:
M src/archetypes/referencebrowserwidget/browser/popup.pt
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-02-26T22:44:14+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@f0ab009

add unittest

Files changed:
M src/archetypes/referencebrowserwidget/tests/test_product.py
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-02-26T22:44:26+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@b8a7ffc

filter non-referencable items before creating the batch to not end up having batch navigation pages without any items

Files changed:
M src/archetypes/referencebrowserwidget/browser/popup.pt
M src/archetypes/referencebrowserwidget/browser/view.py
M src/archetypes/referencebrowserwidget/tests/test_product.py
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-02-26T22:46:07+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@c4049ab

add warning to changelog, fix unit-test

Conflicts:
	docs/CHANGES.txt

Files changed:
M CONTRIBUTORS.txt
M docs/CHANGES.txt
M src/archetypes/referencebrowserwidget/tests/test_product.py
Repository: archetypes.referencebrowserwidget
Branch: refs/heads/master
Date: 2015-03-09T11:33:12+01:00
Author: Harald Friessnegger (frisi) <harald@webmeisterei.com>
Commit: plone/archetypes.referencebrowserwidget@bb73074

Merge pull request #22 from plone/issue16-allowed_types

take allowed_types into account, but also allow users to browse

Files changed:
M CONTRIBUTORS.txt
M docs/CHANGES.txt
M src/archetypes/referencebrowserwidget/browser/popup.pt
M src/archetypes/referencebrowserwidget/browser/view.py
M src/archetypes/referencebrowserwidget/tests/test_product.py
vangheem added a commit that referenced this pull request May 27, 2015
Branch: refs/heads/master
Date: 2015-05-27T15:14:59+03:00
Author: David Batranu (david-batranu) <dbatranu@gmail.com>
Commit: plone/plone.app.blob@7fc3196

Fixing permission for download (refs #22)

Files changed:
M src/plone/app/blob/field.py
Repository: plone.app.blob
Branch: refs/heads/master
Date: 2015-05-27T09:17:30-05:00
Author: Nathan Van Gheem (vangheem) <vangheem@gmail.com>
Commit: plone/plone.app.blob@0ff78da

Merge pull request #23 from david-batranu/download-fix

Fixing permission for download (refs #22)

Files changed:
M src/plone/app/blob/field.py
mister-roboto pushed a commit that referenced this pull request Apr 11, 2020
Branch: refs/heads/master
Date: 2020-04-11T16:43:46+02:00
Author: ale-rt (ale-rt) <alessandro.pisa@gmail.com>
Commit: plone/plone.memoize@1c29639

Use the global request

Use the zope global request if available as a fallback if the context does not have it

Fixes #17

Files changed:
A news/17.feature
M plone/memoize/view.py
M plone/memoize/view.rst
M setup.py
Repository: plone.memoize

Branch: refs/heads/master
Date: 2020-04-11T23:16:20+02:00
Author: Alessandro Pisa (ale-rt) <alessandro.pisa@gmail.com>
Commit: plone/plone.memoize@f378dc6

Merge pull request #22 from plone/17-use-global-request

Use the global request

Files changed:
A news/17.feature
M plone/memoize/view.py
M plone/memoize/view.rst
M setup.py
mister-roboto pushed a commit that referenced this pull request Aug 27, 2020
Branch: refs/heads/master
Date: 2020-08-27T02:26:44+02:00
Author: Maurits van Rees (mauritsvanrees) <maurits@vanrees.org>
Commit: plone/plone.behavior@bd3002c

Fixed deprecation warning for ComponentLookupError.

Files changed:
A news/3130.bugfix
M plone/behavior/directives.rst
Repository: plone.behavior

Branch: refs/heads/master
Date: 2020-08-27T13:56:49+02:00
Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl>
Commit: plone/plone.behavior@1d55311

Merge pull request #22 from plone/maurits/fix-warnings

Fixed deprecation warning for ComponentLookupError.

Files changed:
A news/3130.bugfix
M plone/behavior/directives.rst
mister-roboto pushed a commit that referenced this pull request Aug 27, 2020
Branch: refs/heads/master
Date: 2020-08-27T02:26:44+02:00
Author: Maurits van Rees (mauritsvanrees) <maurits@vanrees.org>
Commit: plone/plone.behavior@bd3002c

Fixed deprecation warning for ComponentLookupError.

Files changed:
A news/3130.bugfix
M plone/behavior/directives.rst
Repository: plone.behavior

Branch: refs/heads/master
Date: 2020-08-27T13:56:49+02:00
Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl>
Commit: plone/plone.behavior@1d55311

Merge pull request #22 from plone/maurits/fix-warnings

Fixed deprecation warning for ComponentLookupError.

Files changed:
A news/3130.bugfix
M plone/behavior/directives.rst
mister-roboto pushed a commit that referenced this pull request Aug 28, 2020
Branch: refs/heads/master
Date: 2020-08-28T10:43:48+02:00
Author: Maurits van Rees (mauritsvanrees) <maurits@vanrees.org>
Commit: plone/plone.app.workflow@8c727c0

Fixed deprecation warning for zope.component.interfaces.IComponentRegistry.

Files changed:
A news/3130.bugfix
M plone/app/workflow/exportimport.py
Repository: plone.app.workflow

Branch: refs/heads/master
Date: 2020-08-28T11:38:22+02:00
Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl>
Commit: plone/plone.app.workflow@ff2f197

Merge pull request #22 from plone/maurits/fix-warnings

Fixed deprecation warning for zope.component IComponentRegistry

Files changed:
A news/3130.bugfix
M plone/app/workflow/exportimport.py
mister-roboto pushed a commit that referenced this pull request Sep 2, 2020
Branch: refs/heads/master
Date: 2020-09-01T22:06:50+02:00
Author: Maurits van Rees (mauritsvanrees) <maurits@vanrees.org>
Commit: plone/plone.portlet.collection@dde2638

Fixed deprecation warning for setDefaultRoles.

Files changed:
A news/3130.bugfix
M plone/portlet/collection/__init__.py
Repository: plone.portlet.collection

Branch: refs/heads/master
Date: 2020-09-02T09:29:44+02:00
Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl>
Commit: plone/plone.portlet.collection@294ffe0

Merge pull request #22 from plone/maurits/fix-warnings

Fixed deprecation warning for setDefaultRoles.

Files changed:
A news/3130.bugfix
M plone/portlet/collection/__init__.py
mister-roboto pushed a commit that referenced this pull request Sep 2, 2020
Branch: refs/heads/master
Date: 2020-09-01T22:06:50+02:00
Author: Maurits van Rees (mauritsvanrees) <maurits@vanrees.org>
Commit: plone/plone.portlet.collection@dde2638

Fixed deprecation warning for setDefaultRoles.

Files changed:
A news/3130.bugfix
M plone/portlet/collection/__init__.py
Repository: plone.portlet.collection

Branch: refs/heads/master
Date: 2020-09-02T09:29:44+02:00
Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl>
Commit: plone/plone.portlet.collection@294ffe0

Merge pull request #22 from plone/maurits/fix-warnings

Fixed deprecation warning for setDefaultRoles.

Files changed:
A news/3130.bugfix
M plone/portlet/collection/__init__.py
mister-roboto pushed a commit that referenced this pull request Apr 22, 2021
Branch: refs/heads/master
Date: 2021-04-13T15:32:58+02:00
Author: Victor Fernandez de Alba (sneridagh) <sneridagh@gmail.com>
Commit: plone/plone.registry@8fe646d

Allow plone.schema.JSONField in registry

Files changed:
A news/719.feature
M plone/registry/field.py
M plone/registry/field.rst
M setup.py
Repository: plone.registry

Branch: refs/heads/master
Date: 2021-04-13T17:02:27+02:00
Author: Victor Fernandez de Alba (sneridagh) <sneridagh@gmail.com>
Commit: plone/plone.registry@f94e42b

Fix tests

Files changed:
M plone/registry/field.rst
Repository: plone.registry

Branch: refs/heads/master
Date: 2021-04-21T11:33:04+02:00
Author: Victor Fernandez de Alba (sneridagh) <sneridagh@gmail.com>
Commit: plone/plone.registry@e13ecff

Make plone.schema optional

Files changed:
M plone/registry/field.py
M setup.py
Repository: plone.registry

Branch: refs/heads/master
Date: 2021-04-21T18:39:57+02:00
Author: Victor Fernandez de Alba (sneridagh) <sneridagh@gmail.com>
Commit: plone/plone.registry@9ecbb09

Ale suggestions

Files changed:
M setup.py
Repository: plone.registry

Branch: refs/heads/master
Date: 2021-04-22T11:10:50+02:00
Author: Timo Stollenwerk (tisto) <tisto@users.noreply.github.com>
Commit: plone/plone.registry@75f71a5

Merge pull request #22 from plone/allowjsonfieldstore

Allow plone.schema.JSONField in registry

Files changed:
A news/719.feature
M plone/registry/field.py
M plone/registry/field.rst
M setup.py
mister-roboto pushed a commit that referenced this pull request Apr 22, 2021
Branch: refs/heads/master
Date: 2021-04-13T15:32:58+02:00
Author: Victor Fernandez de Alba (sneridagh) <sneridagh@gmail.com>
Commit: plone/plone.registry@8fe646d

Allow plone.schema.JSONField in registry

Files changed:
A news/719.feature
M plone/registry/field.py
M plone/registry/field.rst
M setup.py
Repository: plone.registry

Branch: refs/heads/master
Date: 2021-04-13T17:02:27+02:00
Author: Victor Fernandez de Alba (sneridagh) <sneridagh@gmail.com>
Commit: plone/plone.registry@f94e42b

Fix tests

Files changed:
M plone/registry/field.rst
Repository: plone.registry

Branch: refs/heads/master
Date: 2021-04-21T11:33:04+02:00
Author: Victor Fernandez de Alba (sneridagh) <sneridagh@gmail.com>
Commit: plone/plone.registry@e13ecff

Make plone.schema optional

Files changed:
M plone/registry/field.py
M setup.py
Repository: plone.registry

Branch: refs/heads/master
Date: 2021-04-21T18:39:57+02:00
Author: Victor Fernandez de Alba (sneridagh) <sneridagh@gmail.com>
Commit: plone/plone.registry@9ecbb09

Ale suggestions

Files changed:
M setup.py
Repository: plone.registry

Branch: refs/heads/master
Date: 2021-04-22T11:10:50+02:00
Author: Timo Stollenwerk (tisto) <tisto@users.noreply.github.com>
Commit: plone/plone.registry@75f71a5

Merge pull request #22 from plone/allowjsonfieldstore

Allow plone.schema.JSONField in registry

Files changed:
A news/719.feature
M plone/registry/field.py
M plone/registry/field.rst
M setup.py
mister-roboto pushed a commit that referenced this pull request Jun 28, 2021
Branch: refs/heads/master
Date: 2020-02-24T23:23:29-06:00
Author: T. Kim Nguyen (tkimnguyen) <tkimnguyen@users.noreply.github.com>
Commit: plone/plone.app.viewletmanager@a5022c0

tweak wording

Instead of relying on "unhide", add "show", to make it easier to find. Also remove mention of our ancient Trac.

Files changed:
M plone/app/viewletmanager/exportimport/storage.py
Repository: plone.app.viewletmanager

Branch: refs/heads/master
Date: 2020-02-24T23:28:51-06:00
Author: T. Kim Nguyen (tkimnguyen) <tkimnguyen@users.noreply.github.com>
Commit: plone/plone.app.viewletmanager@ef11cb3

Create 23.bugfix

Files changed:
A news/23.bugfix
Repository: plone.app.viewletmanager

Branch: refs/heads/master
Date: 2021-06-28T23:08:27+02:00
Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl>
Commit: plone/plone.app.viewletmanager@9850b4f

Merge pull request #22 from plone/tkimnguyen-patch-1

tweak wording

Files changed:
A news/23.bugfix
M plone/app/viewletmanager/exportimport/storage.py
mister-roboto pushed a commit that referenced this pull request Jun 28, 2021
Branch: refs/heads/master
Date: 2020-02-24T23:23:29-06:00
Author: T. Kim Nguyen (tkimnguyen) <tkimnguyen@users.noreply.github.com>
Commit: plone/plone.app.viewletmanager@a5022c0

tweak wording

Instead of relying on "unhide", add "show", to make it easier to find. Also remove mention of our ancient Trac.

Files changed:
M plone/app/viewletmanager/exportimport/storage.py
Repository: plone.app.viewletmanager

Branch: refs/heads/master
Date: 2020-02-24T23:28:51-06:00
Author: T. Kim Nguyen (tkimnguyen) <tkimnguyen@users.noreply.github.com>
Commit: plone/plone.app.viewletmanager@ef11cb3

Create 23.bugfix

Files changed:
A news/23.bugfix
Repository: plone.app.viewletmanager

Branch: refs/heads/master
Date: 2021-06-28T23:08:27+02:00
Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl>
Commit: plone/plone.app.viewletmanager@9850b4f

Merge pull request #22 from plone/tkimnguyen-patch-1

tweak wording

Files changed:
A news/23.bugfix
M plone/app/viewletmanager/exportimport/storage.py
mister-roboto pushed a commit that referenced this pull request Jun 10, 2022
Branch: refs/heads/master
Date: 2022-06-08T09:52:36+02:00
Author: Peter Mathis (petschki) <peter.mathis@kombinat.at>
Commit: plone/plone.z3cform@9802317

Fix traversal to z3c.form.widget.MultiWidget widgets since z3c.form &gt;= 4.x

This is especially needed for collective.z3cform.datagridfield

Files changed:
M src/plone/z3cform/traversal.py
Repository: plone.z3cform

Branch: refs/heads/master
Date: 2022-06-08T09:57:32+02:00
Author: Peter Mathis (petschki) <peter.mathis@kombinat.at>
Commit: plone/plone.z3cform@081e839

changelog

Files changed:
A news/22.bugfix
Repository: plone.z3cform

Branch: refs/heads/master
Date: 2022-06-10T10:09:04+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.z3cform@28401b1

Merge pull request #22 from plone/petschki-widget-traversal

Fix ++widget++ traversal to `z3c.form.widget.MultiWidget`

Files changed:
A news/22.bugfix
M src/plone/z3cform/traversal.py
mister-roboto pushed a commit that referenced this pull request Aug 24, 2022
Branch: refs/heads/master
Date: 2022-03-30T19:18:35+03:00
Author: David Batranu (david-batranu) <david.batranu@eaudeweb.ro>
Commit: plone/plone.session@d6c7d5a

[refs #22] Per-user keyrings, session invalidation

Generate a Keyring for each user id, this makes it possible to
invalidate the keyring on logout, meaning other user sessions using
the same authentication token will become invalid.

This protects against session stealing (copying the __ac cookie) and
creates a working server-side log-out.

Files changed:
M plone/session/plugins/session.py
Repository: plone.session

Branch: refs/heads/master
Date: 2022-04-01T12:05:48+03:00
Author: David Batranu (david-batranu) <david.batranu@eaudeweb.ro>
Commit: plone/plone.session@f453ce9

[refs #22] Adding news, tests, optionally enable.

Files changed:
A news/26.feature.txt
M plone/session/plugins/secret.pt
M plone/session/plugins/session.py
M plone/session/tests/testPAS.py
Repository: plone.session

Branch: refs/heads/master
Date: 2022-05-02T12:12:50+03:00
Author: David Batranu (david-batranu) <david.batranu@eaudeweb.ro>
Commit: plone/plone.session@4114ee0

[refs #22] Trying to remove IDisableCSRFProtection

Tests now pass without IDisableCSRFProtection, unknown why.

Files changed:
M plone/session/plugins/session.py
Repository: plone.session

Branch: refs/heads/master
Date: 2022-08-24T15:37:03+02:00
Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl>
Commit: plone/plone.session@e10c43a

Merge pull request #26 from david-batranu/22_per_user_secret

[fixes #22] Per-user keyrings, session invalidation

Files changed:
A news/26.feature.txt
M plone/session/plugins/secret.pt
M plone/session/plugins/session.py
M plone/session/tests/testPAS.py
mister-roboto pushed a commit that referenced this pull request Oct 3, 2022
Branch: refs/heads/main
Date: 2022-10-03T15:39:19+03:00
Author: MrTango (MrTango) <md@derico.de>
Commit: plone/plone.base@b6effa6

Add inserttable to tinymce toolbar

Files changed:
A news/22.feature
M src/plone/base/interfaces/controlpanel.py
Repository: plone.base

Branch: refs/heads/main
Date: 2022-10-03T20:55:02+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.base@d4630c1

Merge pull request #22 from plone/mrtango-add-inserttable-button-to-tinymce-toolbar

Add inserttable to tinymce toolbar

Files changed:
A news/22.feature
M src/plone/base/interfaces/controlpanel.py
mister-roboto pushed a commit that referenced this pull request Dec 7, 2022
Branch: refs/heads/main
Date: 2022-12-06T21:48:04-08:00
Author: David Glick (davisagli) <david@glicksoftware.com>
Commit: plone/plone.autoinclude@36e1c4e

Revert plone/plone.autoinclude#21

Files changed:
M src/plone/autoinclude/loader.py
M test-packages/example.plone-dash-addon/src/example/plone_dash_addon/tests.py
Repository: plone.autoinclude

Branch: refs/heads/main
Date: 2022-12-06T21:49:37-08:00
Author: David Glick (davisagli) <david@glicksoftware.com>
Commit: plone/plone.autoinclude@0e6c062

changelog

Files changed:
A news/22.bugfix
Repository: plone.autoinclude

Branch: refs/heads/main
Date: 2022-12-06T21:57:13-08:00
Author: David Glick (davisagli) <david@glicksoftware.com>
Commit: plone/plone.autoinclude@96e7f59

fix ci os

Files changed:
M .github/workflows/tests.yml
Repository: plone.autoinclude

Branch: refs/heads/main
Date: 2022-12-06T21:58:46-08:00
Author: David Glick (davisagli) <david@glicksoftware.com>
Commit: plone/plone.autoinclude@bb1d119

lint

Files changed:
M src/plone/autoinclude/loader.py
Repository: plone.autoinclude

Branch: refs/heads/main
Date: 2022-12-06T22:02:35-08:00
Author: David Glick (davisagli) <david@glicksoftware.com>
Commit: plone/plone.autoinclude@3ba90c5

Add Python 3.11 to test matrix

Files changed:
M .github/workflows/tests.yml
M tox.ini
Repository: plone.autoinclude

Branch: refs/heads/main
Date: 2022-12-06T22:05:22-08:00
Author: David Glick (davisagli) <david@glicksoftware.com>
Commit: plone/plone.autoinclude@acd6466

fix test

Files changed:
M test-packages/example.plone-dash-addon/src/example/plone_dash_addon/configure.zcml
Repository: plone.autoinclude

Branch: refs/heads/main
Date: 2022-12-07T19:42:37+01:00
Author: Maurits van Rees (mauritsvanrees) <maurits@vanrees.org>
Commit: plone/plone.autoinclude@bd3481a

Merge pull request #22 from plone/fix-include-with-dashes

Revert plone/plone.autoinclude#21

Files changed:
A news/22.bugfix
M .github/workflows/tests.yml
M src/plone/autoinclude/loader.py
M test-packages/example.plone-dash-addon/src/example/plone_dash_addon/configure.zcml
M test-packages/example.plone-dash-addon/src/example/plone_dash_addon/tests.py
M tox.ini
mister-roboto pushed a commit that referenced this pull request Apr 17, 2023
Branch: refs/heads/master
Date: 2023-04-15T14:52:12+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@a3bc435

Configuring with plone/meta

Files changed:
A .editorconfig
A .meta.toml
A .pre-commit-config.yaml
A news/5cc689e5.internal
A tox.ini
M pyproject.toml
M setup.cfg
D bootstrap.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T14:54:05+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@44c6851

chore: pyupgrade

Files changed:
M Products/MimetypesRegistry/MimeTypeItem.py
M Products/MimetypesRegistry/MimeTypesRegistry.py
M Products/MimetypesRegistry/__init__.py
M Products/MimetypesRegistry/common.py
M Products/MimetypesRegistry/encoding.py
M Products/MimetypesRegistry/interfaces.py
M Products/MimetypesRegistry/mime_types/__init__.py
M Products/MimetypesRegistry/mime_types/magic.py
M Products/MimetypesRegistry/mime_types/mtr_mimetypes.py
M Products/MimetypesRegistry/mime_types/py_mimetypes.py
M Products/MimetypesRegistry/mime_types/smi_mimetypes.py
M Products/MimetypesRegistry/mime_types/suppl_mimetypes.py
M Products/MimetypesRegistry/mime_types/windows_mimetypes.py
M Products/MimetypesRegistry/setuphandlers.py
M Products/MimetypesRegistry/testing.py
M Products/MimetypesRegistry/tests/test_encoding.py
M Products/MimetypesRegistry/tests/test_magic.py
M Products/MimetypesRegistry/tests/test_mimetypes.py
M Products/MimetypesRegistry/tests/utils.py
M Products/__init__.py
M setup.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T14:54:33+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@7f40505

chore: isort

Files changed:
M Products/MimetypesRegistry/MimeTypeItem.py
M Products/MimetypesRegistry/MimeTypesRegistry.py
M Products/MimetypesRegistry/common.py
M Products/MimetypesRegistry/mime_types/__init__.py
M Products/MimetypesRegistry/mime_types/smi_mimetypes.py
M Products/MimetypesRegistry/mime_types/windows_mimetypes.py
M Products/MimetypesRegistry/tests/test_encoding.py
M Products/MimetypesRegistry/tests/test_magic.py
M Products/MimetypesRegistry/tests/test_mimetypes.py
M setup.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T14:55:27+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@e960171

chore: black

Files changed:
M Products/MimetypesRegistry/MimeTypeItem.py
M Products/MimetypesRegistry/MimeTypesRegistry.py
M Products/MimetypesRegistry/__init__.py
M Products/MimetypesRegistry/common.py
M Products/MimetypesRegistry/encoding.py
M Products/MimetypesRegistry/interfaces.py
M Products/MimetypesRegistry/mime_types/magic.py
M Products/MimetypesRegistry/mime_types/mtr_mimetypes.py
M Products/MimetypesRegistry/mime_types/py_mimetypes.py
M Products/MimetypesRegistry/mime_types/smi_mimetypes.py
M Products/MimetypesRegistry/mime_types/suppl_mimetypes.py
M Products/MimetypesRegistry/mime_types/windows_mimetypes.py
M Products/MimetypesRegistry/setuphandlers.py
M Products/MimetypesRegistry/testing.py
M Products/MimetypesRegistry/tests/test_encoding.py
M Products/MimetypesRegistry/tests/test_magic.py
M Products/MimetypesRegistry/tests/test_mimetypes.py
M Products/MimetypesRegistry/tests/utils.py
M Products/__init__.py
M setup.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T14:55:40+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@69ff656

chore: pyupgrade

Files changed:
M Products/MimetypesRegistry/MimeTypesRegistry.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T14:55:54+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@b5ff431

chore: black

Files changed:
M Products/MimetypesRegistry/MimeTypesRegistry.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:05:30+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@5bb5a7a

fix: exclude freedesktop.org.xml

Files changed:
M .pre-commit-config.yaml
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:06:01+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@afb0418

chore: zpretty ZCML/XML

Files changed:
M Products/MimetypesRegistry/configure.zcml
M Products/MimetypesRegistry/profiles/default/componentregistry.xml
M Products/MimetypesRegistry/profiles/default/metadata.xml
M Products/MimetypesRegistry/profiles/default/toolset.xml
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:06:05+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@a8f91e0

chore: zpretty PT

Files changed:
M Products/MimetypesRegistry/www/addMimeType.zpt
M Products/MimetypesRegistry/www/editMimeType.zpt
M Products/MimetypesRegistry/www/listMimeTypes.zpt
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:09:56+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@fe380ff

chore: update trove classifiers

Files changed:
M setup.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:10:02+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@1c435a3

feat: pyroma

Files changed:
M setup.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:18:05+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@a5dfd0d

feat(codespell): ignore freedesktop.org.xml

Files changed:
M .pre-commit-config.yaml
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:45:17+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@8c68399

feat: codespell

Files changed:
M CHANGES.rst
M Products/MimetypesRegistry/MimeTypesRegistry.py
M Products/MimetypesRegistry/mime_types/magic.py
M Products/MimetypesRegistry/tests/test_mimetypes.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:45:18+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@cb43f5f

fix: drop six

Files changed:
M Products/MimetypesRegistry/MimeTypeItem.py
M Products/MimetypesRegistry/MimeTypesRegistry.py
M Products/MimetypesRegistry/encoding.py
M Products/MimetypesRegistry/mime_types/magic.py
M Products/MimetypesRegistry/mime_types/windows_mimetypes.py
M setup.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:45:18+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@fe06e9f

feat: flake8

Files changed:
M Products/MimetypesRegistry/MimeTypesRegistry.py
M Products/MimetypesRegistry/encoding.py
M Products/MimetypesRegistry/mime_types/__init__.py
M Products/MimetypesRegistry/mime_types/magic.py
M Products/MimetypesRegistry/mime_types/mtr_mimetypes.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:45:18+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@b369ddc

feat: declare dependencies

Files changed:
M pyproject.toml
M setup.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-15T15:45:40+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/Products.MimetypesRegistry@c4aa28f

Add news entry

Files changed:
A news/1.breaking
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-17T18:17:23+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/Products.MimetypesRegistry@0258d4d

Update setup.py

Files changed:
M setup.py
Repository: Products.MimetypesRegistry

Branch: refs/heads/master
Date: 2023-04-17T18:17:54+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/Products.MimetypesRegistry@eff5703

Merge pull request #22 from plone/config-with-default-template-367daa9f

Config with default template

Files changed:
A .editorconfig
A .meta.toml
A .pre-commit-config.yaml
A news/1.breaking
A news/5cc689e5.internal
A tox.ini
M CHANGES.rst
M Products/MimetypesRegistry/MimeTypeItem.py
M Products/MimetypesRegistry/MimeTypesRegistry.py
M Products/MimetypesRegistry/__init__.py
M Products/MimetypesRegistry/common.py
M Products/MimetypesRegistry/configure.zcml
M Products/MimetypesRegistry/encoding.py
M Products/MimetypesRegistry/interfaces.py
M Products/MimetypesRegistry/mime_types/__init__.py
M Products/MimetypesRegistry/mime_types/magic.py
M Products/MimetypesRegistry/mime_types/mtr_mimetypes.py
M Products/MimetypesRegistry/mime_types/py_mimetypes.py
M Products/MimetypesRegistry/mime_types/smi_mimetypes.py
M Products/MimetypesRegistry/mime_types/suppl_mimetypes.py
M Products/MimetypesRegistry/mime_types/windows_mimetypes.py
M Products/MimetypesRegistry/profiles/default/componentregistry.xml
M Products/MimetypesRegistry/profiles/default/metadata.xml
M Products/MimetypesRegistry/profiles/default/toolset.xml
M Products/MimetypesRegistry/setuphandlers.py
M Products/MimetypesRegistry/testing.py
M Products/MimetypesRegistry/tests/test_encoding.py
M Products/MimetypesRegistry/tests/test_magic.py
M Products/MimetypesRegistry/tests/test_mimetypes.py
M Products/MimetypesRegistry/tests/utils.py
M Products/MimetypesRegistry/www/addMimeType.zpt
M Products/MimetypesRegistry/www/editMimeType.zpt
M Products/MimetypesRegistry/www/listMimeTypes.zpt
M Products/__init__.py
M pyproject.toml
M setup.cfg
M setup.py
D bootstrap.py
mister-roboto pushed a commit that referenced this pull request May 2, 2023
Branch: refs/heads/master
Date: 2023-05-01T22:47:23Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/plone.app.customerize@bc346ef

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/asottile/pyupgrade: v3.3.1 → v3.3.2](asottile/pyupgrade@v3.3.1...v3.3.2)
- [github.com/psf/black: 23.1.0 → 23.3.0](psf/black@23.1.0...23.3.0)
- [github.com/collective/zpretty: 3.0.3 → 3.0.4](collective/zpretty@3.0.3...3.0.4)
- [github.com/codespell-project/codespell: v2.2.2 → v2.2.4](codespell-project/codespell@v2.2.2...v2.2.4)

Files changed:
M .pre-commit-config.yaml
Repository: plone.app.customerize

Branch: refs/heads/master
Date: 2023-05-02T16:42:23+02:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.app.customerize@6f4be81

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request Oct 4, 2023
Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@b636e84

Configuring with plone/meta

Files changed:
A .flake8
A .github/workflows/meta.yml
A .pre-commit-config.yaml
A news/cfffba8c.internal
M .editorconfig
M .gitignore
M .meta.toml
M pyproject.toml
M tox.ini
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@bc96e95

cleanup: remove unused file

Files changed:
D lint-requirements.txt
D setup.cfg
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@338b491

fix: adjust setup.py

Files changed:
M setup.py
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@5883433

chore: run black

Files changed:
M five/intid/keyreference.py
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@61ce5a0

chore: run zpretty

Files changed:
M five/intid/install.pt
M five/intid/registrations.pt
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@0ca1c13

Add news entry

Files changed:
A news/1.breaking
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@a30efb7

fix: mark strings to not be translated

Files changed:
M five/intid/install.pt
Repository: five.intid

Branch: refs/heads/master
Date: 2023-10-04T17:50:15+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/five.intid@b25a0dc

Merge pull request #22 from plone/config-with-default-template-40a56351

Config with default template

Files changed:
A .flake8
A .github/workflows/meta.yml
A .pre-commit-config.yaml
A news/1.breaking
A news/cfffba8c.internal
M .editorconfig
M .gitignore
M .meta.toml
M five/intid/install.pt
M five/intid/keyreference.py
M five/intid/registrations.pt
M pyproject.toml
M setup.py
M tox.ini
D lint-requirements.txt
D setup.cfg
mister-roboto pushed a commit that referenced this pull request Oct 4, 2023
Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@b636e84

Configuring with plone/meta

Files changed:
A .flake8
A .github/workflows/meta.yml
A .pre-commit-config.yaml
A news/cfffba8c.internal
M .editorconfig
M .gitignore
M .meta.toml
M pyproject.toml
M tox.ini
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@bc96e95

cleanup: remove unused file

Files changed:
D lint-requirements.txt
D setup.cfg
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@338b491

fix: adjust setup.py

Files changed:
M setup.py
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@5883433

chore: run black

Files changed:
M five/intid/keyreference.py
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@61ce5a0

chore: run zpretty

Files changed:
M five/intid/install.pt
M five/intid/registrations.pt
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@0ca1c13

Add news entry

Files changed:
A news/1.breaking
Repository: five.intid

Branch: refs/heads/master
Date: 2023-06-26T11:30:25+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/five.intid@a30efb7

fix: mark strings to not be translated

Files changed:
M five/intid/install.pt
Repository: five.intid

Branch: refs/heads/master
Date: 2023-10-04T17:50:15+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/five.intid@b25a0dc

Merge pull request #22 from plone/config-with-default-template-40a56351

Config with default template

Files changed:
A .flake8
A .github/workflows/meta.yml
A .pre-commit-config.yaml
A news/1.breaking
A news/cfffba8c.internal
M .editorconfig
M .gitignore
M .meta.toml
M five/intid/install.pt
M five/intid/keyreference.py
M five/intid/registrations.pt
M pyproject.toml
M setup.py
M tox.ini
D lint-requirements.txt
D setup.cfg
mister-roboto pushed a commit that referenced this pull request Oct 5, 2023
Branch: refs/heads/master
Date: 2023-06-26T13:13:15+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@938ce92

Configuring with plone/meta

Files changed:
A .flake8
A .github/workflows/meta.yml
A news/cfffba8c.internal
M .editorconfig
M .gitignore
M .meta.toml
M .pre-commit-config.yaml
M pyproject.toml
M tox.ini
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-06-26T13:13:39+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@91cc7c9

cleanup: remove unused file

Files changed:
D setup.cfg
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-06-26T13:14:33+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@cae6967

fix: adjust setup.py

Files changed:
M setup.py
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-06-26T13:15:38+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@b51b1b8

Configuring with plone/meta

Files changed:
M .flake8
M .meta.toml
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-06-26T13:24:08+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@5090f2c

Configuring with plone/meta

Files changed:
M .meta.toml
M pyproject.toml
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-10-04T17:49:25+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.schema@4f79b0c

Merge branch 'master' into config-with-default-template-48350b87

Files changed:
M .pre-commit-config.yaml
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-10-05T09:37:37+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.schema@dd23636

Merge pull request #22 from plone/config-with-default-template-48350b87

Config with default template

[skip ci]

Files changed:
A .flake8
A .github/workflows/meta.yml
A news/cfffba8c.internal
M .editorconfig
M .gitignore
M .meta.toml
M .pre-commit-config.yaml
M pyproject.toml
M setup.py
M tox.ini
D setup.cfg
mister-roboto pushed a commit that referenced this pull request Oct 5, 2023
Branch: refs/heads/master
Date: 2023-06-26T13:13:15+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@938ce92

Configuring with plone/meta

Files changed:
A .flake8
A .github/workflows/meta.yml
A news/cfffba8c.internal
M .editorconfig
M .gitignore
M .meta.toml
M .pre-commit-config.yaml
M pyproject.toml
M tox.ini
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-06-26T13:13:39+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@91cc7c9

cleanup: remove unused file

Files changed:
D setup.cfg
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-06-26T13:14:33+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@cae6967

fix: adjust setup.py

Files changed:
M setup.py
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-06-26T13:15:38+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@b51b1b8

Configuring with plone/meta

Files changed:
M .flake8
M .meta.toml
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-06-26T13:24:08+03:00
Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com>
Commit: plone/plone.schema@5090f2c

Configuring with plone/meta

Files changed:
M .meta.toml
M pyproject.toml
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-10-04T17:49:25+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.schema@4f79b0c

Merge branch 'master' into config-with-default-template-48350b87

Files changed:
M .pre-commit-config.yaml
Repository: plone.schema

Branch: refs/heads/master
Date: 2023-10-05T09:37:37+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.schema@dd23636

Merge pull request #22 from plone/config-with-default-template-48350b87

Config with default template

[skip ci]

Files changed:
A .flake8
A .github/workflows/meta.yml
A news/cfffba8c.internal
M .editorconfig
M .gitignore
M .meta.toml
M .pre-commit-config.yaml
M pyproject.toml
M setup.py
M tox.ini
D setup.cfg
mister-roboto pushed a commit that referenced this pull request May 7, 2024
Branch: refs/heads/master
Date: 2024-05-06T19:54:28Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/plone.rfc822@920c161

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/psf/black: 24.3.0 → 24.4.2](psf/black@24.3.0...24.4.2)
- [github.com/collective/i18ndude: 6.1.0 → 6.2.0](collective/i18ndude@6.1.0...6.2.0)

Files changed:
M .pre-commit-config.yaml
Repository: plone.rfc822

Branch: refs/heads/master
Date: 2024-05-07T21:24:23+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.rfc822@d267e1e

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request May 7, 2024
Branch: refs/heads/master
Date: 2024-05-06T19:54:28Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/plone.rfc822@920c161

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/psf/black: 24.3.0 → 24.4.2](psf/black@24.3.0...24.4.2)
- [github.com/collective/i18ndude: 6.1.0 → 6.2.0](collective/i18ndude@6.1.0...6.2.0)

Files changed:
M .pre-commit-config.yaml
Repository: plone.rfc822

Branch: refs/heads/master
Date: 2024-05-07T21:24:23+02:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.rfc822@d267e1e

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request Jun 4, 2024
Branch: refs/heads/master
Date: 2024-06-03T20:01:28Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/plone.theme@b21d887

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](codespell-project/codespell@v2.2.6...v2.3.0)

Files changed:
M .pre-commit-config.yaml
Repository: plone.theme

Branch: refs/heads/master
Date: 2024-06-04T03:21:52-04:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.theme@8b67505

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request Jun 4, 2024
Branch: refs/heads/master
Date: 2024-06-03T20:01:28Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/plone.theme@b21d887

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](codespell-project/codespell@v2.2.6...v2.3.0)

Files changed:
M .pre-commit-config.yaml
Repository: plone.theme

Branch: refs/heads/master
Date: 2024-06-04T03:21:52-04:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.theme@8b67505

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request Jun 4, 2024
Branch: refs/heads/master
Date: 2024-06-03T20:01:06Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/plone.portlets@53b524f

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](codespell-project/codespell@v2.2.6...v2.3.0)

Files changed:
M .pre-commit-config.yaml
Repository: plone.portlets

Branch: refs/heads/master
Date: 2024-06-04T03:23:34-04:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.portlets@df5fdf1

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request Jun 4, 2024
Branch: refs/heads/master
Date: 2024-06-03T20:01:06Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/plone.portlets@53b524f

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](codespell-project/codespell@v2.2.6...v2.3.0)

Files changed:
M .pre-commit-config.yaml
Repository: plone.portlets

Branch: refs/heads/master
Date: 2024-06-04T03:23:34-04:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.portlets@df5fdf1

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request Jun 4, 2024
Branch: refs/heads/master
Date: 2024-06-03T19:59:41Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/plone.app.intid@b8cb80e

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](codespell-project/codespell@v2.2.6...v2.3.0)

Files changed:
M .pre-commit-config.yaml
Repository: plone.app.intid

Branch: refs/heads/master
Date: 2024-06-04T03:31:27-04:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.app.intid@7c5cdd2

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request Jun 4, 2024
Branch: refs/heads/master
Date: 2024-06-03T19:59:41Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/plone.app.intid@b8cb80e

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](codespell-project/codespell@v2.2.6...v2.3.0)

Files changed:
M .pre-commit-config.yaml
Repository: plone.app.intid

Branch: refs/heads/master
Date: 2024-06-04T03:31:27-04:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/plone.app.intid@7c5cdd2

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request Jun 4, 2024
Branch: refs/heads/master
Date: 2024-06-03T19:59:18Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/Products.statusmessages@7a9901f

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](codespell-project/codespell@v2.2.6...v2.3.0)

Files changed:
M .pre-commit-config.yaml
Repository: Products.statusmessages

Branch: refs/heads/master
Date: 2024-06-04T03:31:45-04:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/Products.statusmessages@648268a

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
mister-roboto pushed a commit that referenced this pull request Jun 4, 2024
Branch: refs/heads/master
Date: 2024-06-03T19:59:18Z
Author: pre-commit-ci[bot] (pre-commit-ci[bot]) <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Commit: plone/Products.statusmessages@7a9901f

[pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](codespell-project/codespell@v2.2.6...v2.3.0)

Files changed:
M .pre-commit-config.yaml
Repository: Products.statusmessages

Branch: refs/heads/master
Date: 2024-06-04T03:31:45-04:00
Author: Jens W. Klein (jensens) <jk@kleinundpartner.at>
Commit: plone/Products.statusmessages@648268a

Merge pull request #22 from plone/pre-commit-ci-update-config

[pre-commit.ci] pre-commit autoupdate

Files changed:
M .pre-commit-config.yaml
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants