Skip to content

Instantly share code, notes, and snippets.

@kcleong
Created April 25, 2018 08:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kcleong/f16ff7bb24ff21e6257d485d0ba6ba76 to your computer and use it in GitHub Desktop.
Save kcleong/f16ff7bb24ff21e6257d485d0ba6ba76 to your computer and use it in GitHub Desktop.
Dexterity edit form which disables constraint checks for certain fields
"""
Dexterity edit form which disables constraint checks for certain fields
use at your own risk as the error handling is manipulated!
configure.zcml:
<browser:page
for="plone.dexterity.interfaces.IDexterityContent"
layer="plone.addon.interfaces.IPloneAddonLayer"
name="edit"
class=".edit.DefaultEditView"
permission="cmf.ModifyPortalContent"
/>
"""
from plone.dexterity.browser.edit import DefaultEditForm
from plone.dexterity.interfaces import IDexterityEditForm
from plone.z3cform import layout
from wageindicator.addon.content.site import Site
from zope.interface import classImplements
from zope.schema.interfaces import ConstraintNotSatisfied
import logging
logger = logging.getLogger(__name__)
FIELDS = (
'image_reference',
'link_reference',
'cta_image',
)
class AddonEditForm(DefaultEditForm):
def extractData(self):
""" Override the error which is returned when a object outside a
subsite is referenced.
"""
def get_object(value):
return value.context.args[0]
data, errors = super(AddonEditForm, self).extractData()
ignore_errors = {}
for index, error_value in enumerate(errors):
name = error_value.field.getName()
if name in FIELDS and \
type(error_value.error) == ConstraintNotSatisfied:
context = get_object(error_value)
if Site.resolve(context):
continue # ignore if the object is in the WI site
ignore_errors[index] = error_value
if ignore_errors:
errors = list(errors)
for index, error_value in ignore_errors.items():
errors.pop(index)
name = error_value.field.getName()
data[name] = get_object(error_value)
logger.info(
'Ignoring constraint error for {0} field'.format(name)
)
errors = tuple(errors)
return data, errors
DefaultEditView = layout.wrap_form(AddonEditForm)
classImplements(DefaultEditView, IDexterityEditForm)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment