Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .meta.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@ commit-id = "2.8.1.dev0"

[tox]
test_matrix = {"6.2" = ["*"]}

[pyproject]
dependencies_ignores = "['z3c.jbot']"
2 changes: 2 additions & 0 deletions news/3953.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Move Classic-UI template/view code to plone.app.layout
[petschki]
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ Zope = [
]
python-dateutil = ['dateutil']
pytest-plone = ['pytest', 'zope.pytestlayer', 'plone.testing', 'plone.app.testing']
ignore-packages = ['z3c.jbot']

##
# Add extra configuration options in .meta.toml:
Expand Down
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@
"plone.base",
"plone.dexterity",
"Products.GenericSetup",
"Products.statusmessages",
"plone.app.textfield",
"plone.app.uuid",
"plone.registry",
Expand Down
4 changes: 4 additions & 0 deletions src/plone/app/linkintegrity/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
jbot_deprecations = {
"plone.app.linkintegrity.browser.delete_confirmation_info.pt": "plone.app.layout.controlpanels.templates.linkintegrity_delete_confirmation_info.pt", # noqa: E501
"plone.app.linkintegrity.browser.update.pt": "plone.app.layout.controlpanels.templates.linkintegrity_update.pt", # noqa: E501
}
14 changes: 6 additions & 8 deletions src/plone/app/linkintegrity/browser/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,17 @@
xmlns:browser="http://namespaces.zope.org/browser"
>

<!-- Global (layer-less) registration so API consumers (plone.restapi,
plone.api) can always traverse to @@delete_confirmation_info and
call get_breaches() without needing plone.app.layout.
__call__ returns "" so the view is safe to embed in templates too.
plone.app.layout registers an override on IPloneAppLayoutLayer that
renders the full HTML confirmation snippet. -->
<browser:page
name="delete_confirmation_info"
for="*"
class=".info.DeleteConfirmationInfo"
permission="zope2.Public"
/>

<browser:page
name="updateLinkIntegrityInformation"
for="plone.base.interfaces.IPloneSiteRoot"
class=".update.UpdateView"
template="update.pt"
permission="cmf.ManagePortal"
/>

</configure>
135 changes: 0 additions & 135 deletions src/plone/app/linkintegrity/browser/delete_confirmation_info.pt

This file was deleted.

7 changes: 4 additions & 3 deletions src/plone/app/linkintegrity/browser/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
from Products.CMFCore.utils import _checkPermission
from Products.CMFCore.utils import getToolByName
from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.i18n import translate

import logging
Expand All @@ -19,7 +18,7 @@


class DeleteConfirmationInfo(BrowserView):
template = ViewPageTemplateFile("delete_confirmation_info.pt")
template = None
breach_count = {}

def __init__(self, context, request):
Expand All @@ -37,7 +36,9 @@ def __call__(self, items=None):
else:
items = [self.context]
self.breaches = self.get_breaches(items)
return self.template()
if self.template:
return self.template()
return ""

def get_breaches(self, items=None):
"""Return breaches for multiple items.
Expand Down
58 changes: 0 additions & 58 deletions src/plone/app/linkintegrity/browser/update.pt

This file was deleted.

71 changes: 6 additions & 65 deletions src/plone/app/linkintegrity/browser/update.py
Original file line number Diff line number Diff line change
@@ -1,66 +1,7 @@
from Acquisition import aq_inner
from datetime import datetime
from datetime import timedelta
from plone.app.linkintegrity.handlers import modifiedContent
from plone.base import PloneMessageFactory as _
from Products.CMFCore.utils import getToolByName
from Products.Five import BrowserView
from Products.statusmessages.interfaces import IStatusMessage
from transaction import savepoint
from zExceptions import NotFound
import zope.deferredimport

import logging

logger = logging.getLogger(__name__)


class UpdateView(BrowserView):
"""Iterate over all catalogued items and update linkintegrity-information."""

def __call__(self):
context = aq_inner(self.context)
request = aq_inner(self.request)
if "update" in request.form or "delete_all" in request.form:
starttime = datetime.now()
count = self.update()
duration = timedelta(seconds=(datetime.now() - starttime).seconds)
msg = _(
"linkintegrity_update_info",
default="Link integrity information updated for ${count} "
+ "items in ${time} seconds.",
mapping={"count": count, "time": str(duration)},
)
IStatusMessage(request).add(msg, type="info")
msg = "Updated {} items in {} seconds".format(
count,
str(duration),
)
logger.info(msg)
request.RESPONSE.redirect(getToolByName(context, "portal_url")())
elif "cancel" in request.form:
msg = _("Update cancelled.")
IStatusMessage(request).add(msg, type="info")
request.RESPONSE.redirect(getToolByName(context, "portal_url")())
else:
return self.index()

def update(self):
catalog = getToolByName(self.context, "portal_catalog")
count = 0

for brain in catalog():
try:
obj = brain.getObject()
except (AttributeError, NotFound, KeyError):
msg = "Catalog inconsistency: {0} not found!"
logger.error(msg.format(brain.getPath()), exc_info=1)
continue
try:
modifiedContent(obj, "dummy event parameter")
count += 1
except Exception:
msg = "Error updating linkintegrity-info for {0}."
logger.error(msg.format(obj.absolute_url()), exc_info=1)
if count % 1000 == 0:
savepoint(optimistic=True)
return count
zope.deferredimport.initialize()
zope.deferredimport.deprecated(
"Please use from plone.app.layout.controlpanels.linkintegrity import UpdateView", # noqa: E501
UpdateView="plone.app.layout:controlpanels.linkintegrity.UpdateView",
)
12 changes: 12 additions & 0 deletions src/plone/app/linkintegrity/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
xmlns:zcml="http://namespaces.zope.org/zcml"
>

<include package="plone.app.intid" />
Expand All @@ -11,6 +12,17 @@
file="permissions.zcml"
/>

<include
package="z3c.jbot"
file="meta.zcml"
zcml:condition="installed z3c.jbot"
/>

<browser:jbotDeprecated
dictionary=".jbot_deprecations"
zcml:condition="have jbot-deprecations"
/>

<include package=".browser" />

<adapter factory=".retriever.DXGeneral" />
Expand Down
12 changes: 4 additions & 8 deletions src/plone/app/linkintegrity/tests/test_circular.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,7 @@ def test_internal_breaches_are_dropped(self):
self.assertEqual(len(view.get_breaches([doc1])), 1)
self.assertEqual(len(view.get_breaches([doc1, folder1])), 0)

view = folder1.restrictedTraverse("delete_confirmation")
self.assertIn("Potential link breakage", view())
view = folder1.restrictedTraverse("delete_confirmation_info")
self.assertIn("Potential link breakage", view())
view = doc4.restrictedTraverse("delete_confirmation")
self.assertNotIn("Potential link breakage", view())
view = doc4.restrictedTraverse("delete_confirmation_info")
self.assertNotIn("Potential link breakage", view())
# HTML rendering is a layout concern (plone.app.layout); test the API:
view = DeleteConfirmationInfo(self.portal, self.request)
self.assertGreater(len(view.get_breaches([folder1])), 0)
self.assertEqual(len(view.get_breaches([doc4])), 0)
Loading