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.9.0"

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

[pyproject]
dependencies_ignores = "['z3c.jbot']"
2 changes: 2 additions & 0 deletions news/113.breaking.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Removed Classic-UI browser templates, control panel views, resources, and
related tests. These have been moved to ``plone.app.layout``.
4 changes: 4 additions & 0 deletions news/113.internal.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Package configured and tested against Plone 6.3 only. Updated configuration
with ``plone.meta``, added ``uv.lock`` to ``.gitignore``, applied code
formatting, and fixed ``jbot`` deprecations caused by the templates folder
addition in ``plone.app.layouts``.
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
7 changes: 1 addition & 6 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"Development Status :: 5 - Production/Stable",
"Environment :: Web Environment",
"Framework :: Plone",
"Framework :: Plone :: 6.2",
"Framework :: Plone :: 6.3",
"Framework :: Plone :: Core",
"Framework :: Zope :: 5",
"License :: OSI Approved :: GNU General Public License v2 (GPLv2)",
Expand All @@ -42,20 +42,15 @@
install_requires=[
"lxml",
"plone.app.z3cform",
"plone.autoform>=1.0",
"plone.base",
"plone.registry>=1.0",
"plone.supermodel>=1.1",
"Products.statusmessages",
"Products.GenericSetup",
"plone.z3cform",
"z3c.form",
"Zope",
],
extras_require={
"test": [
"plone.app.testing",
"plone.testing",
]
},
entry_points="""
Expand Down
8 changes: 8 additions & 0 deletions src/plone/app/registry/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
from plone.app.registry.registry import Registry # noqa: F401

jbot_deprecations = {
"plone.app.registry.browser.templates.controlpanel_layout.pt": "plone.app.layout.controlpanel.templates.registry_controlpanel_layout.pt",
"plone.app.registry.browser.templates.delete_layout.pt": "plone.app.layout.controlpanel.templates.registry_delete_layout.pt",
"plone.app.registry.browser.templates.edit_layout.pt": "plone.app.layout.controlpanel.templates.registry_edit_layout.pt",
"plone.app.registry.browser.templates.exportxml.pt": "plone.app.layout.controlpanel.templates.registry_exportxml.pt",
"plone.app.registry.browser.templates.records.pt": "plone.app.layout.controlpanel.templates.registry_records.pt",
}
50 changes: 0 additions & 50 deletions src/plone/app/registry/browser/configure.zcml

This file was deleted.

87 changes: 10 additions & 77 deletions src/plone/app/registry/browser/controlpanel.py
Original file line number Diff line number Diff line change
@@ -1,80 +1,13 @@
from plone.autoform.form import AutoExtensibleForm
from plone.registry.interfaces import IRegistry
from plone.z3cform import layout
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from Products.statusmessages.interfaces import IStatusMessage
from z3c.form import button
from z3c.form import form
from zope.component import getUtility
from zope.component.hooks import getSite
from zope.i18nmessageid import MessageFactory
import zope.deferredimport

_ = MessageFactory("plone")
zope.deferredimport.initialize()

zope.deferredimport.deprecated(
"Please use from plone.app.layout.controlpanels.registry import RegistryEditForm instead.",
RegistryEditForm="plone.app.layout.controlpanels.registry:RegistryEditForm",
)

class RegistryEditForm(AutoExtensibleForm, form.EditForm):
"""Edit a records proxy based on an interface.

To use this, you should use the <records /> element in a registry.xml
GS import step to register records for a particular interface. Then
subclass this form and set the 'schema' class variable to point to
the same interface. You can use plone.autoform form hints to affect the
rendering of the form, or override the update() method as appropriate.

To get the standard control panel layout, use ControlPanelFormWrapper as
the form wrapper, e.g.

from plone.app.registry.browser.form import RegistryEditForm
from plone.app.registry.browser.form import ControlPanelFormWrapper
from my.package.interfaces import IMySettings
form plone.z3cform import layout

class MyForm(RegistryEditForm):
schema = IMySettings

MyFormView = layout.wrap_form(MyForm, ControlPanelFormWrapper)

Then register MyFormView as a browser view.
"""

control_panel_view = "@@overview-controlpanel"
schema_prefix = None

def getContent(self):
return getUtility(IRegistry).forInterface(
self.schema, prefix=self.schema_prefix
)

def updateActions(self):
super().updateActions()
self.actions["save"].addClass("btn btn-primary")
self.actions["cancel"].addClass("btn btn-secondary")

@button.buttonAndHandler(_("Save"), name="save")
def handleSave(self, action):
data, errors = self.extractData()
if errors:
self.status = self.formErrorsMessage
return
self.applyChanges(data)
IStatusMessage(self.request).addStatusMessage(_("Changes saved."), "info")
self.request.response.redirect(self.request.getURL())

@button.buttonAndHandler(_("Cancel"), name="cancel")
def handleCancel(self, action):
IStatusMessage(self.request).addStatusMessage(_("Changes canceled."), "info")
self.request.response.redirect(
f"{getSite().absolute_url()}/{self.control_panel_view}"
)


class ControlPanelFormWrapper(layout.FormWrapper):
"""Use this form as the plone.z3cform layout wrapper to get the control
panel layout.
"""

index = ViewPageTemplateFile("templates/controlpanel_layout.pt")

@property
def control_panel_url(self):
return f"{getSite().absolute_url()}/@@overview-controlpanel"
zope.deferredimport.deprecated(
"Please use from plone.app.layout.controlpanels.registry import ControlPanelFormWrapper instead.",
ControlPanelFormWrapper="plone.app.layout.controlpanels.registry:ControlPanelFormWrapper",
)
24 changes: 6 additions & 18 deletions src/plone/app/registry/browser/delete.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,8 @@
from Products.Five import BrowserView
from Products.statusmessages.interfaces import IStatusMessage
import zope.deferredimport

zope.deferredimport.initialize()

class RecordDeleteView(BrowserView):
def __call__(self):
if self.request.REQUEST_METHOD == "POST":
name = self.request.form.get("name")
if isinstance(name, list) and len(name) > 0:
name = name[0]
if self.request.form.get("form.buttons.delete"):
if name in self.context:
del self.context.records[name]
messages = IStatusMessage(self.request)
messages.add("Successfully deleted field %s" % name, type="info")
elif self.request.form.get("form.buttons.cancel") and name:
messages = IStatusMessage(self.request)
messages.add("Field %s was not deleted" % name, type="info")
return self.request.response.redirect(self.context.absolute_url())
return super().__call__()
zope.deferredimport.deprecated(
"Please use from plone.app.layout.controlpanels.registry_records import RecordDeleteView instead.",
RecordDeleteView="plone.app.layout.controlpanels.registry_records:RecordDeleteView",
)
80 changes: 10 additions & 70 deletions src/plone/app/registry/browser/edit.py
Original file line number Diff line number Diff line change
@@ -1,73 +1,13 @@
from Acquisition import ImplicitAcquisitionWrapper
from plone.z3cform import layout
from Products.statusmessages.interfaces import IStatusMessage
from z3c.form import button
from z3c.form import field
from z3c.form import form
from zope.i18nmessageid import MessageFactory
from zope.interface import implementer
from zope.publisher.interfaces import IPublishTraverse
import zope.deferredimport

_ = MessageFactory("plone")
zope.deferredimport.initialize()

zope.deferredimport.deprecated(
"Please use from plone.app.layout.controlpanels.registry_records import RecordEditForm instead.",
RecordEditForm="plone.app.layout.controlpanels.registry_records:RecordEditForm",
)

class RecordEditForm(form.EditForm):
"""Edit a single record"""

record = None

@property
def action(self):
return f"{self.context.absolute_url()}/edit/{self.record.__name__}"

def getContent(self):
return ImplicitAcquisitionWrapper({"value": self.record.value}, self.context)

def update(self):
self.fields = field.Fields(
self.record.field,
)
super().update()

def updateActions(self):
super().updateActions()
self.actions["save"].addClass("btn btn-primary")
self.actions["cancel"].addClass("btn btn-secondary")

@property
def label(self):
return _("Edit record: ${name}", mapping={"name": self.record.__name__})

@button.buttonAndHandler(_("Save"), name="save")
def handleSave(self, action):
data, errors = self.extractData()
if errors:
self.status = self.formErrorsMessage
return
self.record.value = data["value"]
IStatusMessage(self.request).addStatusMessage(_("Changes saved."), "info")
self.request.response.redirect(self.context.absolute_url())

@button.buttonAndHandler(_("Cancel"), name="cancel")
def handleCancel(self, action):
IStatusMessage(self.request).addStatusMessage(_("Edit cancelled."), "info")
self.request.response.redirect(self.context.absolute_url())


@implementer(IPublishTraverse)
class RecordEditView(layout.FormWrapper):
form = RecordEditForm

def __init__(self, context, request):
super().__init__(context, request)
self.request["disable_border"] = True

def publishTraverse(self, request, name):
path = self.request["TraversalRequestNameStack"] + [name]
path.reverse()
key = "/".join(path)
del self.request["TraversalRequestNameStack"][:]
record = self.context.records[key]
self.record = record
self.form_instance.record = record
return self
zope.deferredimport.deprecated(
"Please use from plone.app.layout.controlpanels.registry_records import RecordEditView instead.",
RecordEditView="plone.app.layout.controlpanels.registry_records:RecordEditView",
)
Loading
Loading