diff --git a/last_commit.txt b/last_commit.txt index 6879e7e779..cda7002180 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,140 +1,84 @@ -Repository: plone.app.portlets +Repository: plone.app.versioningbehavior Branch: refs/heads/master -Date: 2021-09-24T23:48:44+02:00 -Author: Michael Launay (michaellaunay) -Commit: https://github.com/plone/plone.app.portlets/commit/851b4bda1feed101e4b6ac6c37f4e687120a33d5 - -Fix Plone 5.2.4 migrating troubles - -Old portlet version didn't have no_thumb attribute, so when you finished to migrate them to Plone5.2.4 python3 and run instance you have : -2021-09-23 15:35:38,262 INFO [plone.protect:38][waitress-0] auto rotating keyring _anon -2021-09-23 15:35:40,235 ERROR [portlets:58][waitress-1] Error while rendering <plone.app.portlets.manager.ColumnPortletManagerRenderer object at 0x7f452b6b2520> -Traceback (most recent call last): - File "/home/michaellaunay/plone524/buildout-cache/eggs/cp38/Zope-4.5.5-py3.8.egg/OFS/Traversable.py", line 297, in unrestrictedTraverse - next = obj[name] -TypeError: 'Assignment' object is not subscriptableDuring handling of the above exception, another exception occurred:Traceback (most recent call last): - File "/home/michaellaunay/plone524/buildout-cache/eggs/cp38/Zope-4.5.5-py3.8.egg/OFS/Traversable.py", line 309, in unrestrictedTraverse - raise NotFound(name) -zExceptions.NotFound: no_thumbsDuring handling of the above exception, another exception occurred:Traceback (most recent call last): - File "/home/michaellaunay/plone524/buildout-cache/eggs/cp38/Chameleon-3.9.0-py3.8.egg/chameleon/template.py", line 192, in render - self._render(stream, econtext, rcontext) - File "/home/michaellaunay/plone524/zeocluster/var/cache/0430f070bad760a6150431e1fc100209.py", line 235, in render - __value = _static_139935422494224('path', 'view/data/no_thumbs', econtext=econtext)(_static_139935422494512(econtext, __zt_tmp)) - File "/home/michaellaunay/plone524/buildout-cache/eggs/cp38/zope.tales-5.1-py3.8.egg/zope/tales/expressions.py", line 250, in __call__ - return self._eval(econtext) - File "/home/michaellaunay/plone524/buildout-cache/eggs/cp38/Zope-4.5.5-py3.8.egg/Products/PageTemplates/Expressions.py", line 188, in _eval - ob = self._subexprs[-1](econtext) - File "/home/michaellaunay/plone524/buildout-cache/eggs/cp38/zope.tales-5.1-py3.8.egg/zope/tales/expressions.py", line 153, in _eval - ob = self._traverser(ob, element, econtext) - File "/home/michaellaunay/plone524/buildout-cache/eggs/cp38/Zope-4.5.5-py3.8.egg/Products/PageTemplates/Expressions.py", line 102, in trustedBoboAwareZopeTraverse - object = object.unrestrictedTraverse(name) - File "/home/michaellaunay/plone524/buildout-cache/eggs/cp38/Zope-4.5.5-py3.8.egg/OFS/Traversable.py", line 317, in unrestrictedTraverse - (obj, aq_acquire(self, 'REQUEST')), -AttributeError: REQUEST +Date: 2022-07-05T12:26:05+02:00 +Author: Peter Mathis (petschki) +Commit: https://github.com/plone/plone.app.versioningbehavior/commit/44f598cb4617842427a43470ecce618104917d68 + +Fix test for changed label in Products.CMFEditions + +Files changed: +M plone/app/versioningbehavior/tests/test_functional.py + +b"diff --git a/plone/app/versioningbehavior/tests/test_functional.py b/plone/app/versioningbehavior/tests/test_functional.py\nindex 3c525b4..1fc8bdc 100644\n--- a/plone/app/versioningbehavior/tests/test_functional.py\n+++ b/plone/app/versioningbehavior/tests/test_functional.py\n@@ -73,13 +73,13 @@ def _assert_versions_history_form(self, version_id, obj_id, title, text):\n self.browser.open(\n '%s/%s/versions_history_form?version_id=%s'\n % (self.portal_url, obj_id, version_id))\n- self.assertIn('Working Copy', self.browser.contents)\n+ self.assertIn('Current revision', self.browser.contents)\n \n if version_id == 0:\n self.assertIn(\n '/%s/versions_history_form?version_id=%s' % (obj_id, version_id),\n self.browser.contents)\n- self.assertIn('Working Copy', self.browser.contents)\n+ self.assertIn('Current revision', self.browser.contents)\n self.assertIn('Revert to this revision', self.browser.contents)\n self.assertIn(\n '/%s/@@history?one' % obj_id, self.browser.contents)\n" + +Repository: plone.app.versioningbehavior + + +Branch: refs/heads/master +Date: 2022-07-05T12:26:54+02:00 +Author: Peter Mathis (petschki) +Commit: https://github.com/plone/plone.app.versioningbehavior/commit/0e1c87767aff52822ae6c343cd5313ddaea8f95e + +changenote Files changed: -M plone/app/portlets/portlets/recent.py +A news/64.bugfix -b'diff --git a/plone/app/portlets/portlets/recent.py b/plone/app/portlets/portlets/recent.py\nindex e0178218..f89e615a 100644\n--- a/plone/app/portlets/portlets/recent.py\n+++ b/plone/app/portlets/portlets/recent.py\n@@ -61,6 +61,7 @@ class IRecentPortlet(IPortletDataProvider):\n class Assignment(base.Assignment):\n no_icons = False\n thumb_scale = None\n+ no_thumbs = False\n \n def __init__(self, count=5, no_icons=False, thumb_scale=None, no_thumbs=False):\n self.count = count\n' +b'diff --git a/news/64.bugfix b/news/64.bugfix\nnew file mode 100644\nindex 0000000..46f72d9\n--- /dev/null\n+++ b/news/64.bugfix\n@@ -0,0 +1,2 @@\n+Fix test for changed label in `Products.CMFEditions`.\n+[petschki]\n' -Repository: plone.app.portlets +Repository: plone.app.versioningbehavior Branch: refs/heads/master -Date: 2022-07-04T13:51:00+02:00 -Author: Jens W. Klein (jensens) -Commit: https://github.com/plone/plone.app.portlets/commit/93ee1dee700c8187963f662ad49df16704402ef0 +Date: 2022-07-05T13:09:54+02:00 +Author: Peter Mathis (petschki) +Commit: https://github.com/plone/plone.app.versioningbehavior/commit/b5d0522355e946b004e5fc971a111dc5cbd115a8 -Merge branch 'master' into patch-1 +bump version Files changed: -A plone/app/portlets/browser/templates/footer.pt -A plone/app/portlets/browser/templates/manage_portlets_fallback.pt -A plone/app/portlets/browser/viewlets.py -A plone/app/portlets/dashboard/__init__.py -A plone/app/portlets/dashboard/configure.zcml -A plone/app/portlets/dashboard/dashboard.pt -A plone/app/portlets/dashboard/dashboard.py -A plone/app/portlets/dashboard/user_actions.pt -A plone/app/portlets/dashboard/user_actions.py -M CHANGES.rst -M plone/__init__.py -M plone/app/__init__.py -M plone/app/portlets/assignable.py -M plone/app/portlets/browser/adding.py -M plone/app/portlets/browser/configure.zcml -M plone/app/portlets/browser/editmanager.py -M plone/app/portlets/browser/formhelper.py -M plone/app/portlets/browser/manage.py -M plone/app/portlets/browser/templates/manage-contextual.pt -M plone/app/portlets/browser/templates/manage-group-dashboard.pt -M plone/app/portlets/browser/templates/manage-group.pt -M plone/app/portlets/browser/templates/topbar-manage-portlets.pt -M plone/app/portlets/browser/traversal.py -M plone/app/portlets/browser/utils.py -M plone/app/portlets/checker.py -M plone/app/portlets/configure.zcml -M plone/app/portlets/exportimport/__init__.py -M plone/app/portlets/exportimport/portlets.py -M plone/app/portlets/manager.py -M plone/app/portlets/metaconfigure.py -M plone/app/portlets/metadirectives.py -M plone/app/portlets/portlets/__init__.py -M plone/app/portlets/portlets/actions.py -M plone/app/portlets/portlets/base.py -M plone/app/portlets/portlets/classic.py -M plone/app/portlets/portlets/language.py -M plone/app/portlets/portlets/login.py -M plone/app/portlets/portlets/navigation.py -M plone/app/portlets/portlets/navigation_recurse.pt -M plone/app/portlets/portlets/news.py -M plone/app/portlets/portlets/recent.pt -M plone/app/portlets/portlets/recent.py -M plone/app/portlets/portlets/review.py -M plone/app/portlets/portlets/rss.py -M plone/app/portlets/portlets/search.pt -M plone/app/portlets/portlets/search.py -M plone/app/portlets/storage.py -M plone/app/portlets/tests/test_formextender.py -M setup.cfg M setup.py -D plone/app/portlets/browser/manage-portlets.js -D plone/app/portlets/dashboard.py -b'diff --git a/CHANGES.rst b/CHANGES.rst\nindex 74aae3ee..7db62182 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.rst\n@@ -8,6 +8,67 @@ Changelog\n \n .. towncrier release notes start\n \n+5.0.0b1 (2022-06-23)\n+--------------------\n+\n+Bug fixes:\n+\n+\n+- Styling Links as Buttons in Portlet Management View\n+ [1letter] (#164)\n+\n+\n+5.0.0a10 (2022-04-08)\n+---------------------\n+\n+Bug fixes:\n+\n+\n+- Use @@iconresolver to display icons in navigation portlet.\n+ [pbauer] (#162)\n+\n+\n+5.0.0a9 (2022-04-04)\n+--------------------\n+\n+Breaking changes:\n+\n+\n+- Remove manage-portlets.js, this is part of mockup now [MrTango] (#159)\n+\n+\n+5.0.0a8 (2022-03-23)\n+--------------------\n+\n+New features:\n+\n+\n+- Fixes for latest z3c.form\n+ [petschki] (#161)\n+\n+\n+5.0.0a7 (2021-11-23)\n+--------------------\n+\n+Breaking changes:\n+\n+\n+- Move most (hard dependency) portlet related from `plone.app.layout`:\n+ Dashboard, Portlet related viewlets.\n+ A first step towards a Portlet-as-an-Addon story.\n+ [jensens] (#160)\n+\n+\n+5.0.0a6 (2021-10-16)\n+--------------------\n+\n+Bug fixes:\n+\n+\n+- Add missing i18n:translate tags\n+ [erral] (#158)\n+\n+\n 5.0.0a5 (2021-09-15)\n --------------------\n \ndiff --git a/plone/__init__.py b/plone/__init__.py\nindex 05f0bebb..5284146e 100644\n--- a/plone/__init__.py\n+++ b/plone/__init__.py\n@@ -1,7 +1 @@\n-# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages\n-try:\n- __import__("pkg_resources").declare_namespace(__name__)\n-except ImportError:\n- from pkgutil import extend_path\n-\n- __path__ = extend_path(__path__, __name__)\n+__import__("pkg_resources").declare_namespace(__name__)\ndiff --git a/plone/app/__init__.py b/plone/app/__init__.py\nindex 05f0bebb..5284146e 100644\n--- a/plone/app/__init__.py\n+++ b/plone/app/__init__.py\n@@ -1,7 +1 @@\n-# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages\n-try:\n- __import__("pkg_resources").declare_namespace(__name__)\n-except ImportError:\n- from pkgutil import extend_path\n-\n- __path__ = extend_path(__path__, __name__)\n+__import__("pkg_resources").declare_namespace(__name__)\ndiff --git a/plone/app/portlets/assignable.py b/plone/app/portlets/assignable.py\nindex b6b0471d..902b34b8 100644\n--- a/plone/app/portlets/assignable.py\n+++ b/plone/app/portlets/assignable.py\n@@ -1,4 +1,4 @@\n-from plone.app.portlets.storage import PortletAssignmentMapping\n+from .storage import PortletAssignmentMapping\n from plone.portlets.constants import CONTEXT_ASSIGNMENT_KEY\n from plone.portlets.constants import CONTEXT_CATEGORY\n from plone.portlets.interfaces import ILocalPortletAssignable\ndiff --git a/plone/app/portlets/browser/adding.py b/plone/app/portlets/browser/adding.py\nindex 48340277..656babe3 100644\n--- a/plone/app/portlets/browser/adding.py\n+++ b/plone/app/portlets/browser/adding.py\n@@ -1,9 +1,9 @@\n+from ..interfaces import IPortletPermissionChecker\n+from .interfaces import IPortletAdding\n from Acquisition import aq_base\n from Acquisition import aq_inner\n from Acquisition import aq_parent\n from OFS.SimpleItem import SimpleItem\n-from plone.app.portlets.browser.interfaces import IPortletAdding\n-from plone.app.portlets.interfaces import IPortletPermissionChecker\n from Products.CMFCore.utils import getToolByName\n from Products.Five import BrowserView\n from warnings import warn\ndiff --git a/plone/app/portlets/browser/configure.zcml b/plone/app/portlets/browser/configure.zcml\nindex 8ba32160..653f3487 100644\n--- a/plone/app/portlets/browser/configure.zcml\n+++ b/plone/app/portlets/browser/configure.zcml\n@@ -213,12 +213,6 @@\n \n \n \n- \n- \n-\n \n \n+ \n+ \n+\n+ \n+ \n+\n \ndiff --git a/plone/app/portlets/browser/editmanager.py b/plone/app/portlets/browser/editmanager.py\nindex 80a4851a..5e5842b2 100644\n--- a/plone/app/portlets/browser/editmanager.py\n+++ b/plone/app/portlets/browser/editmanager.py\n@@ -1,14 +1,14 @@\n+from ..interfaces import IDashboard\n+from ..interfaces import IPortletPermissionChecker\n+from .interfaces import IManageColumnPortletsView\n+from .interfaces import IManageContextualPortletsView\n+from .interfaces import IManageDashboardPortletsView\n from AccessControl import Unauthorized\n from Acquisition import aq_inner\n from Acquisition import aq_parent\n from Acquisition import Explicit\n from Acquisition.interfaces import IAcquirer\n from five.customerize.zpt import TTWViewTemplateRenderer\n-from plone.app.portlets.browser.interfaces import IManageColumnPortletsView\n-from plone.app.portlets.browser.interfaces import IManageContextualPortletsView\n-from plone.app.portlets.browser.interfaces import IManageDashboardPortletsView\n-from plone.app.portlets.interfaces import IDashboard\n-from plone.app.portlets.interfaces import IPortletPermissionChecker\n from plone.memoize.view import memoize\n from plone.portlets.constants import CONTENT_TYPE_CATEGORY\n from plone.portlets.constants import CONTEXT_CATEGORY\ndiff --git a/plone/app/portlets/browser/formhelper.py b/plone/app/portlets/browser/formhelper.py\nindex 7740d25a..3a104c73 100644\n--- a/plone/app/portlets/browser/formhelper.py\n+++ b/plone/app/portlets/browser/formhelper.py\n@@ -1,11 +1,11 @@\n+from .. import PloneMessageFactory as _\n+from ..browser.interfaces import IPortletAddForm\n+from ..browser.interfaces import IPortletEditForm\n+from ..interfaces import IPortletPermissionChecker\n from Acquisition import aq_base\n from Acquisition import aq_inner\n from Acquisition import aq_parent\n from Acquisition.interfaces import IAcquirer\n-from plone.app.portlets import PloneMessageFactory as _\n-from plone.app.portlets.browser.interfaces import IPortletAddForm\n-from plone.app.portlets.browser.interfaces import IPortletEditForm\n-from plone.app.portlets.interfaces import IPortletPermissionChecker\n from plone.autoform.form import AutoExtensibleForm\n from Products.CMFCore.utils import getToolByName\n from Products.Five.browser import BrowserView\ndiff --git a/plone/app/portlets/browser/manage-portlets.js b/plone/app/portlets/browser/manage-portlets.js\ndeleted file mode 100644\nindex 755bad58..00000000\n--- a/plone/app/portlets/browser/manage-portlets.js\n+++ /dev/null\n@@ -1,228 +0,0 @@\n-define([\n- \'jquery\',\n- \'pat-base\',\n- \'mockup-utils\',\n- \'mockup-patterns-modal\',\n- \'translate\',\n- \'pat-logger\',\n- \'jquery.form\'\n-], function ($, Base, utils, Modal, _t, logger) {\n- \'use strict\';\n-\n- var log = logger.getLogger(\'pat-manage-portlets\');\n-\n- var ManagePortlets = Base.extend({\n- name: \'manage-portlets\',\n- trigger: \'.pat-manage-portlets\',\n- parser: \'mockup\',\n- messageTimeout: 0,\n- submitTimeout: 0,\n- switchTimeout: 0,\n- isModal: false,\n- dirty: false,\n- init: function(){\n- var that = this;\n- var $modal = that.$el.parents(\'.plone-modal\');\n- if($modal.length === 1){\n- this.isModal = true;\n- /* want to do something on exit from modal now */\n- var modal = $modal.data(\'pattern-plone-modal\');\n- modal.on(\'hide\', function(){\n- if(that.dirty){\n- window.location.reload();\n- }\n- });\n- that.loading = modal.loading;\n- }else{\n- that.loading = utils.loading;\n- }\n- that.bind();\n- },\n- bind: function(){\n- var that = this;\n- that.setupAddDropdown();\n- that.setupSwitchPortletManager();\n- that.setupSavePortletsSettings();\n- that.setupPortletEdit();\n- if(that.isModal){\n- /* if we\'re in a modal, it\'s possible we have a link to\n- parent case, bind the link so we can reload modal */\n- $(\'.portlets-link-to-parent\').off(\'click\').click(function(e){\n- that.loading.show();\n- var $el = $(this);\n- e.preventDefault();\n- $.ajax({\n- url: $el.attr(\'href\'),\n- data: {\n- ajax_load: 1\n- }\n- }).done(function(html){\n- var $body = $(utils.parseBodyTag(html));\n- var $modal = $el.parents(\'.plone-modal-body\');\n- $modal.empty();\n- var $content = $(\'#content\', $body);\n- var $h1 = $(\'h1\', $content);\n- $(\'.plone-modal-header\', $modal.parent()).find(\'h2\').html($h1.html());\n- $h1.remove();\n- $modal.append($content);\n- that.rebind($(\'.pat-manage-portlets\', $content), true);\n- that.loading.hide();\n- });\n- });\n- }\n- },\n- rebind: function($el, suppress){\n- log.info(\'rebind\');\n- if ($.contains(document, this.$el[0])) {\n- // $el is not detached, replace it\n- this.$el.replaceWith($el);\n- }\n- this.$el = $el;\n- this.bind();\n- if(!suppress){\n- this.statusMessage();\n- }\n- this.dirty = true;\n- },\n- statusMessage: function(msg){\n- if(msg === undefined){\n- msg = _t("Portlet changes saved");\n- }\n- var that = this;\n-\n- var $message = $(\'#portlet-message\');\n- if($message.length === 0){\n- $message = $(\'\');\n- if(that.isModal){\n- $(\'.plone-modal-body:visible\').prepend($message);\n- }else{\n- $(\'#content-core\').prepend($message);\n- }\n- }\n- $message.html(\'\' + _t("Info") + \'\' + msg);\n- clearTimeout(that.messageTimeout);\n- $message.fadeTo(500, 1);\n- that.messageTimeout = window.setTimeout(function(){\n- $message.fadeTo(500, 0.6);\n- }, 3000);\n- },\n- showEditPortlet: function(url){\n- log.info(\'show edit portlet in modal\');\n- var that = this;\n- var $a = $(\'\');\n- $(\'body\').append($a);\n- var pattern = new Modal($a, {\n- ajaxUrl: url,\n- actionOptions: {\n- displayInModal: false,\n- reloadWindowOnClose: false,\n- isForm: true,\n- onSuccess: function(modal, html){\n- pattern.hide();\n- var $body = $(utils.parseBodyTag(html));\n- that.rebind($(\'#\' + that.$el.attr(\'id\'), $body).eq(0));\n- that.statusMessage(_t(\'Portlet added\'));\n- }\n- }\n- });\n- pattern.on(\'after-render\', function(){\n- var $el = $(\'#\' + that.$el.attr(\'id\'), pattern.$raw);\n- /* this is a check that the add form doesn\'t just automatically\n- create the portlet without an actual form.\n- If element is found here, we can short circuit and\n- continue on. */\n- if($el.length === 1){\n- /* hacky, trying to prevent modal parts from flickering here */\n- $el = $el.clone();\n- pattern.on(\'shown\', function(){\n- pattern.hide();\n- });\n- that.rebind($el);\n- that.statusMessage(_t(\'Portlet added\'));\n- }\n- });\n- pattern.show();\n- },\n- setupPortletEdit: function(){\n- var that = this;\n- $(\'.managedPortlet .portletHeader > a\', that.$el).click(function(e){\n- e.preventDefault();\n- that.showEditPortlet($(this).attr(\'href\'));\n- });\n- },\n- setupAddDropdown: function(){\n- var that = this;\n- $(\'.add-portlet\', that.$el).change(function(e){\n- e.preventDefault();\n- var $select = $(this);\n- var $form = $select.parents(\'form\');\n- var contextUrl = $select.attr(\'data-context-url\');\n- var url = contextUrl + $select.val() +\n- \'?_authenticator=\' + $(\'[name="_authenticator"]\').val() +\n- \'&referer=\' + $(\'[name="referer"]\', $form).val();\n- that.showEditPortlet(url);\n- });\n- },\n- setupSavePortletsSettings: function(){\n- var that = this;\n- $(\'.portlets-settings, form.portlet-action\', that.$el).ajaxForm({\n- beforeSubmit: function(){\n- that.loading.show();\n- },\n- success: function(html){\n- that.loading.hide();\n- log.info(\'form submit\');\n- var $body = $(utils.parseBodyTag(html));\n- that.rebind($(\'#\' + that.$el.attr(\'id\'), $body).eq(0));\n- }\n- });\n- // Block/unblock inherited portlets (parent, group and content type portlets)\n- $(\'.portlets-settings select\', that.$el).change(function(){\n- log.info(\'select change\');\n- clearTimeout(that.submitTimeout);\n- that.submitTimeout = window.setTimeout(function(){\n- $(\'.portlets-settings\', that.$el).submit();\n- }, 100);\n- });\n- },\n- setupSwitchPortletManager: function(){\n- var that = this;\n- $(\'#main-container\').on(\'change\', \'.switch-portlet-manager\', function(e){\n- e.stopImmediatePropagation();\n- log.info(\'switch portlet manager\');\n- var url_ = $(this).val();\n- clearTimeout(that.switchTimeout);\n- that.switchTimeout = window.setTimeout(function() {\n- that._reloadPortletManager(url_);\n- }, 100);\n- });\n- // Handle back/forward browser buttons\n- $(window).on(\'popstate\', function(e) {\n- e.stopImmediatePropagation();\n- if (e && e.state === undefined) {\n- var url_ = window.location.href;\n- log.info("redirecting to: " + url_);\n- that._reloadPortletManager(url_, true);\n- }\n- });\n- },\n- _reloadPortletManager: function(url_, is_popstate){\n- var that = this;\n- that.loading.show();\n- $.get(url_, {ajax_load: 1}).done(function(html) {\n- var $html = $(utils.parseBodyTag(html));\n- var $content = (\'#content\', $html);\n- $(\'#content\').html($content);\n- that.rebind($(\'.pat-manage-portlets\', $content), true);\n- if (!is_popstate) {\n- window.history.pushState(null, null, url_);\n- } else {\n- window.history.replaceState(null, null, url_);\n- }\n- that.loading.hide();\n- });\n- }\n- });\n-\n- return ManagePortlets;\n-});\ndiff --git a/plone/app/portlets/browser/manage.py b/plone/app/portlets/browser/manage.py\nindex 916bf7b0..0face36a 100644\n--- a/plone/app/portlets/browser/manage.py\n+++ b/plone/app/portlets/browser/manage.py\n@@ -1,17 +1,17 @@\n+from ..interfaces import IPortletPermissionChecker\n+from ..interfaces import ITopbarManagePortlets\n+from ..storage import GroupDashboardPortletAssignmentMapping\n+from ..storage import PortletAssignmentMapping\n+from ..storage import UserPortletAssignmentMapping\n+from .interfaces import IManageContentTypePortletsView\n+from .interfaces import IManageContextualPortletsView\n+from .interfaces import IManageDashboardPortletsView\n+from .interfaces import IManageGroupPortletsView\n+from .interfaces import IManagePortletsView\n from AccessControl import Unauthorized\n from Acquisition import aq_base\n from Acquisition import aq_inner\n from plone.app.portlets import utils\n-from plone.app.portlets.browser.interfaces import IManageContentTypePortletsView\n-from plone.app.portlets.browser.interfaces import IManageContextualPortletsView\n-from plone.app.portlets.browser.interfaces import IManageDashboardPortletsView\n-from plone.app.portlets.browser.interfaces import IManageGroupPortletsView\n-from plone.app.portlets.browser.interfaces import IManagePortletsView\n-from plone.app.portlets.interfaces import IPortletPermissionChecker\n-from plone.app.portlets.interfaces import ITopbarManagePortlets\n-from plone.app.portlets.storage import GroupDashboardPortletAssignmentMapping\n-from plone.app.portlets.storage import PortletAssignmentMapping\n-from plone.app.portlets.storage import UserPortletAssignmentMapping\n from plone.memoize.view import memoize\n from plone.portlets.constants import CONTENT_TYPE_CATEGORY\n from plone.portlets.constants import CONTEXT_CATEGORY\ndiff --git a/plone/app/portlets/browser/templates/footer.pt b/plone/app/portlets/browser/templates/footer.pt\nnew file mode 100644\nindex 00000000..df16ba9d\n--- /dev/null\n+++ b/plone/app/portlets/browser/templates/footer.pt\n@@ -0,0 +1,5 @@\n+
\n+\t
\n+\t\t
\n+\t
\n+
\ndiff --git a/plone/app/portlets/browser/templates/manage-contextual.pt b/plone/app/portlets/browser/templates/manage-contextual.pt\nindex 8674ef90..1cf4829f 100644\n--- a/plone/app/portlets/browser/templates/manage-contextual.pt\n+++ b/plone/app/portlets/browser/templates/manage-contextual.pt\n@@ -14,8 +14,10 @@\n Manage portlets for\n title\n \n+ \n+ \n
\n Return\n@@ -23,13 +25,13 @@\n \n \n- -\n- \n Go to parent folder\n \n \n+ \n \n
\n \n
\n-

Group: ${view/group}

\n+

Group:

\n
\n \n
\n@@ -25,7 +25,7 @@\n
\n \n
\n-
\n+
\n \ndiff --git a/plone/app/portlets/browser/templates/manage-group.pt b/plone/app/portlets/browser/templates/manage-group.pt\nindex 6abad3f9..5d5c7c3c 100644\n--- a/plone/app/portlets/browser/templates/manage-group.pt\n+++ b/plone/app/portlets/browser/templates/manage-group.pt\n@@ -21,13 +21,13 @@\n Up to Groups Overview\n \n \n-

Group: ${view/group}

\n+

Group:

\n \n \n \n \n \n-
\n+
\n