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

P6/Py3-only #160

Closed
wants to merge 6 commits into from
Closed
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
2 changes: 2 additions & 0 deletions news/160.1.breaking
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Python 3.7+ only, drop Python 2 support.
[jensens]
2 changes: 2 additions & 0 deletions news/160.2.breaking
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Use Bootstrap 5 classes for buttons.
[jensens]
2 changes: 2 additions & 0 deletions news/160.3.breaking
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Remove long deprecated imports and fallbacks.
[jensens]
2 changes: 2 additions & 0 deletions news/160.4.breaking
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Deprecate unused ``.schema.SchemaCache.subtypes``.
[jensens]
1 change: 0 additions & 1 deletion plone/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
# -*- coding: utf-8 -*-
__import__("pkg_resources").declare_namespace(__name__)
1 change: 0 additions & 1 deletion plone/dexterity/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
# -*- coding: utf-8 -*-
# Kick dynamic module factory
from . import schema # noqa
33 changes: 0 additions & 33 deletions plone/dexterity/bbb.py

This file was deleted.

10 changes: 4 additions & 6 deletions plone/dexterity/behavior.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
# -*- coding: utf-8 -*-
from .interfaces import IDexterityContent
from .schema import SCHEMA_CACHE
from plone.behavior.interfaces import IBehaviorAssignable
from plone.dexterity.interfaces import IDexterityContent
from plone.dexterity.schema import SCHEMA_CACHE
from zope.component import adapter
from zope.interface import implementer


@implementer(IBehaviorAssignable)
@adapter(IDexterityContent)
class DexterityBehaviorAssignable(object):
class DexterityBehaviorAssignable:
"""Support plone.behavior behaviors stored in the FTI"""

def __init__(self, context):
Expand All @@ -21,5 +20,4 @@ def supports(self, behavior_interface):
return False

def enumerateBehaviors(self):
for behavior in SCHEMA_CACHE.behavior_registrations(self.context.portal_type):
yield behavior
yield from SCHEMA_CACHE.behavior_registrations(self.context.portal_type)
1 change: 0 additions & 1 deletion plone/dexterity/browser/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@
# -*- coding: utf-8 -*-
35 changes: 17 additions & 18 deletions plone/dexterity/browser/add.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
# -*- coding: utf-8 -*-
from ..events import AddBegunEvent
from ..events import AddCancelledEvent
from ..i18n import MessageFactory as _
from ..interfaces import IDexterityFTI
from ..utils import addContentToContainer
from ..utils import getAdditionalSchemata
from .base import DexterityExtensibleForm
from Acquisition import aq_base
from Acquisition import aq_inner
from Acquisition.interfaces import IAcquirer
from plone.dexterity.browser.base import DexterityExtensibleForm
from plone.dexterity.events import AddBegunEvent
from plone.dexterity.events import AddCancelledEvent
from plone.dexterity.i18n import MessageFactory as _
from plone.dexterity.interfaces import IDexterityFTI
from plone.dexterity.utils import addContentToContainer
from plone.dexterity.utils import getAdditionalSchemata
from plone.z3cform import layout
from plone.z3cform.interfaces import IDeferSecurityCheck
from Products.statusmessages.interfaces import IStatusMessage
Expand Down Expand Up @@ -37,10 +36,10 @@ class DefaultAddForm(DexterityExtensibleForm, form.AddForm):

portal_type = None
immediate_view = None
success_message = _(u"Item created")
success_message = _("Item created")

def __init__(self, context, request, ti=None):
super(DefaultAddForm, self).__init__(context, request)
super().__init__(context, request)
if ti is not None:
self.ti = ti
self.portal_type = ti.getId()
Expand Down Expand Up @@ -119,10 +118,10 @@ def handleAdd(self, action):
self._finishedAdd = True
IStatusMessage(self.request).addStatusMessage(self.success_message, "info")

@button.buttonAndHandler(_(u"Cancel"), name="cancel")
@button.buttonAndHandler(_("Cancel"), name="cancel")
def handleCancel(self, action):
IStatusMessage(self.request).addStatusMessage(
_(u"Add New Item operation cancelled"), "info"
_("Add New Item operation cancelled"), "info"
)
self.request.response.redirect(self.nextURL())
notify(AddCancelledEvent(self.context))
Expand All @@ -135,25 +134,25 @@ def update(self):
"Subobject type disallowed by IConstrainTypes adapter: %s"
% self.portal_type
)
super(DefaultAddForm, self).update()
super().update()
# fire the edit begun only if no action was executed
if len(self.actions.executedActions) == 0:
notify(AddBegunEvent(self.context))

def updateActions(self):
super(DefaultAddForm, self).updateActions()
super().updateActions()
if "save" in self.actions:
self.actions["save"].addClass("context")
self.actions["save"].addClass("btn btn-primary")

if "cancel" in self.actions:
self.actions["cancel"].addClass("standalone")
self.actions["cancel"].addClass("btn btn-secondary")

@property
def label(self):
portal_type = self.portal_type
fti = getUtility(IDexterityFTI, name=portal_type)
type_name = fti.Title()
return _(u"Add ${name}", mapping={"name": type_name})
return _("Add ${name}", mapping={"name": type_name})


class DefaultAddView(layout.FormWrapper, BrowserPage):
Expand All @@ -168,7 +167,7 @@ class DefaultAddView(layout.FormWrapper, BrowserPage):
form = DefaultAddForm

def __init__(self, context, request, ti):
super(DefaultAddView, self).__init__(context, request)
super().__init__(context, request)
self.ti = ti

# Set portal_type name on newly created form instance
Expand Down
9 changes: 4 additions & 5 deletions plone/dexterity/browser/base.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
# -*- coding: utf-8 -*-
from ..i18n import MessageFactory as _
from ..interfaces import IDexterityFTI
from ..utils import getAdditionalSchemata
from plone.autoform.form import AutoExtensibleForm
from plone.dexterity.i18n import MessageFactory as _
from plone.dexterity.interfaces import IDexterityFTI
from plone.dexterity.utils import getAdditionalSchemata
from zope.component import getUtility


class DexterityExtensibleForm(AutoExtensibleForm):
"""Mixin class for Dexterity forms that support updatable fields"""

default_fieldset_label = _("label_schema_default", default=u"Default")
default_fieldset_label = _("label_schema_default", default="Default")

@property
def description(self):
Expand Down
33 changes: 16 additions & 17 deletions plone/dexterity/browser/edit.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
from plone.dexterity.browser.base import DexterityExtensibleForm
from plone.dexterity.events import EditBegunEvent
from plone.dexterity.events import EditCancelledEvent
from plone.dexterity.events import EditFinishedEvent
from plone.dexterity.i18n import MessageFactory as _
from plone.dexterity.interfaces import IDexterityEditForm
from plone.dexterity.interfaces import IDexterityFTI
from ..events import EditBegunEvent
from ..events import EditCancelledEvent
from ..events import EditFinishedEvent
from ..i18n import MessageFactory as _
from ..interfaces import IDexterityEditForm
from ..interfaces import IDexterityFTI
from .base import DexterityExtensibleForm
from plone.registry.interfaces import IRegistry
from plone.z3cform import layout
from Products.CMFCore.utils import getToolByName
Expand All @@ -19,9 +18,9 @@

class DefaultEditForm(DexterityExtensibleForm, form.EditForm):

success_message = _(u"Changes saved")
success_message = _("Changes saved")

@button.buttonAndHandler(_(u"Save"), name="save")
@button.buttonAndHandler(_("Save"), name="save")
def handleApply(self, action):
data, errors = self.extractData()
if errors:
Expand All @@ -32,9 +31,9 @@ def handleApply(self, action):
self.request.response.redirect(self.nextURL())
notify(EditFinishedEvent(self.context))

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

Expand All @@ -52,20 +51,20 @@ def nextURL(self):

def update(self):
self.portal_type = self.context.portal_type
super(DefaultEditForm, self).update()
super().update()

# fire the edit begun only if no action was executed
if len(self.actions.executedActions) == 0:
notify(EditBegunEvent(self.context))

def updateActions(self):
super(DefaultEditForm, self).updateActions()
super().updateActions()

if "save" in self.actions:
self.actions["save"].addClass("context")
self.actions["save"].addClass("btn btn-primary")

if "cancel" in self.actions:
self.actions["cancel"].addClass("standalone")
self.actions["cancel"].addClass("btn btn-secondary")

@property
def fti(self):
Expand All @@ -74,7 +73,7 @@ def fti(self):
@property
def label(self):
type_name = self.fti.Title()
return _(u"Edit ${name}", mapping={"name": type_name})
return _("Edit ${name}", mapping={"name": type_name})


DefaultEditView = layout.wrap_form(DefaultEditForm)
Expand Down
5 changes: 2 additions & 3 deletions plone/dexterity/browser/fti.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
# -*- coding: utf-8 -*-
from plone.dexterity.fti import DexterityFTI
from ..fti import DexterityFTI
from Products.CMFCore.browser.typeinfo import FactoryTypeInformationAddView


class FTIAddView(FactoryTypeInformationAddView):
"""Add view for the Dexterity FTI type"""

klass = DexterityFTI
description = u"Factory Type Information for Dexterity Content Types"
description = "Factory Type Information for Dexterity Content Types"
27 changes: 7 additions & 20 deletions plone/dexterity/browser/traversal.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,13 @@
# -*- coding: utf-8 -*-
from ..filerepresentation import FolderDataResource
from ..interfaces import DAV_FOLDER_DATA_ID
from ..interfaces import IDexterityContent
from Acquisition import aq_inner
from Acquisition import aq_parent
from Acquisition.interfaces import IAcquirer
from plone.dexterity import bbb
from plone.dexterity.filerepresentation import FolderDataResource
from plone.dexterity.interfaces import DAV_FOLDER_DATA_ID
from plone.dexterity.interfaces import IDexterityContent
from webdav.NullResource import NullResource
from zope.component import adapter
from zope.publisher.interfaces.browser import IBrowserRequest


try:
from repoze.zope2.publishtraverse import DefaultPublishTraverse
except ImportError:
from ZPublisher.BaseRequest import DefaultPublishTraverse

if bbb.HAS_WEBDAV:
from webdav.NullResource import NullResource
else:
NullResource = bbb.NullResource
from ZPublisher.BaseRequest import DefaultPublishTraverse


@adapter(IDexterityContent, IBrowserRequest)
Expand Down Expand Up @@ -48,9 +37,7 @@ def publishTraverse(self, request, name):
):
return FolderDataResource(DAV_FOLDER_DATA_ID, context).__of__(context)

defaultTraversal = super(DexterityPublishTraverse, self).publishTraverse(
request, name
)
defaultTraversal = super().publishTraverse(request, name)

# If this is a WebDAV PUT/PROPFIND/PROPPATCH request, don't acquire
# things. If we did, we couldn't create a new object with PUT, for
Expand Down Expand Up @@ -85,4 +72,4 @@ def browserDefault(self, request):
):
return self.context, ()

return super(DexterityPublishTraverse, self).browserDefault(request)
return super().browserDefault(request)
5 changes: 2 additions & 3 deletions plone/dexterity/browser/view.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
from ..interfaces import IDexterityFTI
from ..utils import getAdditionalSchemata
from plone.autoform.view import WidgetsView
from plone.dexterity.interfaces import IDexterityFTI
from plone.dexterity.utils import getAdditionalSchemata
from zope.component import getUtility


Expand Down
Loading