diff --git a/src/plone/z3cform/converter.py b/src/plone/z3cform/converter.py
index 497db6c..350975b 100644
--- a/src/plone/z3cform/converter.py
+++ b/src/plone/z3cform/converter.py
@@ -1,9 +1,9 @@
+import ZPublisher.HTTPRequest
import cgi
+import z3c.form.converter
+import z3c.form.interfaces
import zope.publisher.browser
-import ZPublisher.HTTPRequest
-import z3c.form.interfaces
-import z3c.form.converter
class FileUploadDataConverter(z3c.form.converter.FileUploadDataConverter):
"""Although ZPublisher's and zope.publisher's FileUpload
diff --git a/src/plone/z3cform/crud/__init__.py b/src/plone/z3cform/crud/__init__.py
index 792d600..e69de29 100644
--- a/src/plone/z3cform/crud/__init__.py
+++ b/src/plone/z3cform/crud/__init__.py
@@ -1 +0,0 @@
-#
diff --git a/src/plone/z3cform/crud/crud.py b/src/plone/z3cform/crud/crud.py
index d5a27b1..717d555 100644
--- a/src/plone/z3cform/crud/crud.py
+++ b/src/plone/z3cform/crud/crud.py
@@ -1,22 +1,19 @@
-import sys
-
from ZODB.POSException import ConflictError
-from zope import interface
-import zope.event
-import zope.lifecycleevent
-import zope.publisher.browser
+from plone.batching import Batch
+from plone.batching.browser import BatchView
+from plone.z3cform import MessageFactory as _
+from plone.z3cform.widget import singlecheckboxwidget_factory
from z3c.form import button
from z3c.form import field
from z3c.form import form
-import z3c.form.widget
from z3c.form.interfaces import DISPLAY_MODE, INPUT_MODE, NOVALUE
+from zope import interface
from zope.browserpage import viewpagetemplatefile
-
-from plone.batching import Batch
-from plone.batching.browser import BatchView
-
-from plone.z3cform.widget import singlecheckboxwidget_factory
-from plone.z3cform import MessageFactory as _
+import sys
+import z3c.form.widget
+import zope.event
+import zope.lifecycleevent
+import zope.publisher.browser
class ICrudForm(interface.Interface):
@@ -98,7 +95,8 @@ def get_items(self):
def add(self, data):
raise NotImplementedError
- def remove(self, (id, item)):
+ def remove(self, xxx_todo_changeme1):
+ (id, item) = xxx_todo_changeme1
raise NotImplementedError
def before_update(self, item, data):
@@ -109,11 +107,11 @@ def link(self, item, field):
class CrudBatchView(BatchView):
-
prefix = ''
def make_link(self, pagenumber):
- return "%s?%spage=%s" % (self.request.getURL(), self.prefix, pagenumber)
+ return "%s?%spage=%s" % (
+ self.request.getURL(), self.prefix, pagenumber)
class EditSubForm(form.EditForm):
@@ -199,7 +197,7 @@ class EditForm(form.Form):
label = _(u"Edit")
template = viewpagetemplatefile.ViewPageTemplateFile('crud-table.pt')
- #exposes the edit sub form for your own derivatives
+ # exposes the edit sub form for your own derivatives
editsubform_factory = EditSubForm
@property
@@ -223,9 +221,9 @@ def _update_subforms(self):
@property
def batch(self):
items = self.context.get_items()
- batch_size = self.context.batch_size or sys.maxint
+ batch_size = self.context.batch_size or sys.maxsize
page = int(self.request.get('%spage' % self.prefix, 0))
- return Batch.fromPagenumber(items, batch_size, page+1)
+ return Batch.fromPagenumber(items, batch_size, page + 1)
def render_batch_navigation(self):
bv = CrudBatchView(self.context, self.request)
@@ -265,10 +263,11 @@ def handle_edit(self, action):
# If there were changes, we'll update the view widgets
# again, so that they'll actually display the changes
- for widget in subform.widgets.values():
+ for widget in subform.widgets.values():
if widget.mode == DISPLAY_MODE:
widget.update()
- zope.event.notify(z3c.form.widget.AfterWidgetUpdateEvent(widget))
+ zope.event.notify(
+ z3c.form.widget.AfterWidgetUpdateEvent(widget))
self.status = status
@button.buttonAndHandler(_('Delete'), name='delete')
@@ -288,7 +287,8 @@ def handle_delete(self, action):
self.status = _(u'Unable to remove one or more items.')
break
- # We changed the amount of entries, so we update the subforms again.
+ # We changed the amount of entries, so we update the subforms
+ # again.
self._update_subforms()
else:
self.status = _(u"Please select items to delete.")
@@ -303,6 +303,7 @@ def selected_items(self):
tuples.append((subform.content_id, subform.content))
return tuples
+
class AddForm(form.Form):
template = viewpagetemplatefile.ViewPageTemplateFile('crud-add.pt')
@@ -327,13 +328,15 @@ def handle_add(self, action):
return
try:
item = self.context.add(data)
- except zope.schema.ValidationError, e:
+ except zope.schema.ValidationError as e:
self.status = e
else:
zope.event.notify(zope.lifecycleevent.ObjectCreatedEvent(item))
self.status = _(u"Item added successfully.")
+
class NullForm(object):
+
def __init__(self, context, request):
self.context = context
self.request = request
@@ -345,6 +348,7 @@ def render(self):
return ''
__call__ = render
+
class CrudForm(AbstractCrudForm, form.Form):
template = viewpagetemplatefile.ViewPageTemplateFile('crud-master.pt')
description = u''
diff --git a/src/plone/z3cform/fieldsets/extensible.py b/src/plone/z3cform/fieldsets/extensible.py
index ba3c485..357f157 100644
--- a/src/plone/z3cform/fieldsets/extensible.py
+++ b/src/plone/z3cform/fieldsets/extensible.py
@@ -1,18 +1,16 @@
-from zope.interface import implements
-from zope.component import getAdapters
-
+from plone.z3cform import MessageFactory as _
+from plone.z3cform.fieldsets import utils
from plone.z3cform.fieldsets.interfaces import IExtensibleForm
from plone.z3cform.fieldsets.interfaces import IFormExtender
-
from z3c.form.group import GroupForm
+from zope.component import getAdapters
+from zope.interface import implements
-from plone.z3cform.fieldsets import utils
-
-from plone.z3cform import MessageFactory as _
def order_key(adapter_tuple):
return adapter_tuple[1].order
+
class FormExtender(object):
"""Base class for IFormExtender adapters with convenience APIs
"""
@@ -41,12 +39,19 @@ def remove(self, field_name, prefix=None):
return utils.remove(self.form, field_name, prefix=prefix)
- def move(self, field_name, before=None, after=None, prefix=None, relative_prefix=None):
+ def move(
+ self,
+ field_name,
+ before=None,
+ after=None,
+ prefix=None,
+ relative_prefix=None):
"""Move the field with the given name before or after another field.
"""
utils.move(self.form, field_name, before=before, after=after,
- prefix=prefix, relative_prefix=relative_prefix)
+ prefix=prefix, relative_prefix=relative_prefix)
+
class ExtensibleForm(GroupForm):
implements(IExtensibleForm)
@@ -59,6 +64,10 @@ def update(self):
super(ExtensibleForm, self).update()
def updateFields(self):
- extenders = getAdapters((self.context, self.request, self), IFormExtender)
+ extenders = getAdapters(
+ (self.context,
+ self.request,
+ self),
+ IFormExtender)
for name, extender in sorted(extenders, key=order_key):
extender.update()
diff --git a/src/plone/z3cform/fieldsets/group.py b/src/plone/z3cform/fieldsets/group.py
index 333b33f..d0767a9 100644
--- a/src/plone/z3cform/fieldsets/group.py
+++ b/src/plone/z3cform/fieldsets/group.py
@@ -7,7 +7,6 @@
@implementer(IDescriptiveGroup)
class Group(group.Group):
-
__name__ = u""
label = u""
description = u""
diff --git a/src/plone/z3cform/fieldsets/interfaces.py b/src/plone/z3cform/fieldsets/interfaces.py
index 5688649..dc521ae 100644
--- a/src/plone/z3cform/fieldsets/interfaces.py
+++ b/src/plone/z3cform/fieldsets/interfaces.py
@@ -1,7 +1,8 @@
-from zope.interface import Interface
+from z3c.form.interfaces import IFields
+from z3c.form.interfaces import IGroup
from zope import schema
+from zope.interface import Interface
-from z3c.form.interfaces import IFields, IGroup, IGroupForm
class IFormExtender(Interface):
"""A component that can add, modify, sort and group fields in a form.
@@ -9,10 +10,11 @@ class IFormExtender(Interface):
This should be a named multi adapter from (context, request, form).
"""
- order = schema.Int(title=u"Order",
- description=u"Use this property to order the sorter. " +
- u"Low numbers are executed before high ones.",
- required=True)
+ order = schema.Int(
+ title=u"Order",
+ description=u"Use this property to order the sorter. " +
+ u"Low numbers are executed before high ones.",
+ required=True)
def update():
"""Modify the form in place. Supported operations include:
@@ -22,6 +24,7 @@ def update():
- modify the 'fields' property of a given group
"""
+
class IDescriptiveGroup(IGroup):
"""Extension to z3c.form's Group class that can separate out a name,
a label and a description.
@@ -29,37 +32,45 @@ class IDescriptiveGroup(IGroup):
__name__ = schema.TextLine(title=u"Name of this group")
- label = schema.TextLine(title=u"Fieldset title",
- description=u"The __name__ will be used if this is not given",
- required=False)
+ label = schema.TextLine(
+ title=u"Fieldset title",
+ description=u"The __name__ will be used if this is not given",
+ required=False)
description = schema.Text(title=u"Fieldset description",
required=False)
+
class IGroupFactory(Interface):
"""An object that can be used to create a z3c.form.group.Group.
"""
__name__ = schema.TextLine(title=u"Name of this group")
- label = schema.TextLine(title=u"Fieldset title",
- description=u"The __name__ will be used if this is not given",
- required=False)
+ label = schema.TextLine(
+ title=u"Fieldset title",
+ description=u"The __name__ will be used if this is not given",
+ required=False)
description = schema.Text(title=u"Fieldset description",
required=False)
fields = schema.Object(title=u"Fields in this form", schema=IFields)
+
class IExtensibleForm(Interface):
"""A special version of the IGroupForm that is extensible via
IFormExtender adapters.
"""
- groups = schema.List(title=u'Groups',
- value_type=schema.Object(title=u"Group", schema=IGroupFactory))
+ groups = schema.List(
+ title=u'Groups',
+ value_type=schema.Object(
+ title=u"Group",
+ schema=IGroupFactory))
- default_fieldset_label = schema.TextLine(title=u"Label of the default fieldset")
+ default_fieldset_label = schema.TextLine(
+ title=u"Label of the default fieldset")
def updateFields():
"""Called during form update to allow updating of self.fields
diff --git a/src/plone/z3cform/fieldsets/utils.py b/src/plone/z3cform/fieldsets/utils.py
index cf902be..14482af 100644
--- a/src/plone/z3cform/fieldsets/utils.py
+++ b/src/plone/z3cform/fieldsets/utils.py
@@ -1,7 +1,7 @@
+from plone.z3cform.fieldsets.group import GroupFactory
from z3c.form.field import Fields
from z3c.form.util import expandPrefix
-from plone.z3cform.fieldsets.group import GroupFactory
def add(form, *args, **kwargs):
"""Add one or more fields. Keyword argument 'index' can be used to
@@ -29,8 +29,9 @@ def add(form, *args, **kwargs):
else:
field_names = source.fields.keys()
source.fields = source.fields.select(*field_names[:index]) + \
- new_fields + \
- source.fields.select(*field_names[index:])
+ new_fields + \
+ source.fields.select(*field_names[index:])
+
def remove(form, field_name, prefix=None):
"""Get rid of a field. The omitted field will be returned.
@@ -50,7 +51,14 @@ def remove(form, field_name, prefix=None):
group.fields = group.fields.omit(field_name)
return field
-def move(form, field_name, before=None, after=None, prefix=None, relative_prefix=None):
+
+def move(
+ form,
+ field_name,
+ before=None,
+ after=None,
+ prefix=None,
+ relative_prefix=None):
"""Move the field with the given name before or after another field.
"""
if prefix:
@@ -111,7 +119,8 @@ def move(form, field_name, before=None, after=None, prefix=None, relative_prefix
if index is None:
raise KeyError("Field %s not found" % relative)
- add(form, field, group=group, index=index+offset)
+ add(form, field, group=group, index=index + offset)
+
def find_source(form, group=None):
if group is not None:
diff --git a/src/plone/z3cform/interfaces.py b/src/plone/z3cform/interfaces.py
index d17b224..6ce23c5 100644
--- a/src/plone/z3cform/interfaces.py
+++ b/src/plone/z3cform/interfaces.py
@@ -1,8 +1,8 @@
-from zope.interface import Interface, Attribute
+from z3c.form.interfaces import IForm
from zope import schema
-
+from zope.interface import Interface, Attribute
from zope.pagetemplate.interfaces import IPageTemplate
-from z3c.form.interfaces import IForm
+
class IFormWrapper(Interface):
"""Form wrapper class.
@@ -28,19 +28,20 @@ def render():
form = Attribute("The form class. Should be set at class level")
form_instance = schema.Object(
- title = u"Instance of the form being rendered",
- description = u"Set by the wrapper code during __init__()",
- readonly = True,
- schema = IForm
- )
+ title=u"Instance of the form being rendered",
+ description=u"Set by the wrapper code during __init__()",
+ readonly=True,
+ schema=IForm
+ )
index = schema.Object(
- title = u"Page template instance",
- description = (u"If not set, a template will be found "
- u"via an adapter lookup"),
+ title=u"Page template instance",
+ description=(u"If not set, a template will be found "
+ u"via an adapter lookup"),
required = False,
schema = IPageTemplate
- )
+ )
+
class IWrappedForm(Interface):
"""Marker interface applied to wrapped forms during rendering.
@@ -48,6 +49,7 @@ class IWrappedForm(Interface):
This allows different handling of templates, for example.
"""
+
class IDeferSecurityCheck(Interface):
"""Marker interface applied to the request during traversal.
diff --git a/src/plone/z3cform/layout.py b/src/plone/z3cform/layout.py
index 405e7c9..6752c7f 100644
--- a/src/plone/z3cform/layout.py
+++ b/src/plone/z3cform/layout.py
@@ -1,17 +1,12 @@
from Acquisition import aq_inner
-import z3c.form.interfaces
-
-import zope.interface
-import zope.component
-
from Products.Five import BrowserView
-
-from zope.pagetemplate.interfaces import IPageTemplate
-
from Products.Five.browser.pagetemplatefile import BoundPageTemplate
-
from plone.z3cform import interfaces
from plone.z3cform import z2
+from zope.pagetemplate.interfaces import IPageTemplate
+import z3c.form.interfaces
+import zope.component
+import zope.interface
class FormWrapper(BrowserView):
@@ -25,8 +20,8 @@ class FormWrapper(BrowserView):
"""
zope.interface.implements(interfaces.IFormWrapper)
- form = None # override this with a form class.
- index = None # override with a page template, or rely on an adapter
+ form = None # override this with a form class.
+ index = None # override with a page template, or rely on an adapter
request_layer = z3c.form.interfaces.IFormLayer
def __init__(self, context, request):
@@ -44,7 +39,9 @@ def update(self):
"""
if not z3c.form.interfaces.ISubForm.providedBy(self.form_instance):
- zope.interface.alsoProvides(self.form_instance, interfaces.IWrappedForm)
+ zope.interface.alsoProvides(
+ self.form_instance,
+ interfaces.IWrappedForm)
z2.switch_on(self, request_layer=self.request_layer)
self.form_instance.update()
diff --git a/src/plone/z3cform/patch.py b/src/plone/z3cform/patch.py
index 0a8a8de..300d810 100644
--- a/src/plone/z3cform/patch.py
+++ b/src/plone/z3cform/patch.py
@@ -2,15 +2,14 @@
GroupForm.update(). We need to call z2.processInputs() before the request is
used, because z3c.form expects them to have been converted to unicode first.
"""
-
+from plone.z3cform.z2 import processInputs
from z3c.form.form import BaseForm
from z3c.form.group import GroupForm
-from plone.z3cform.z2 import processInputs
-
_original_BaseForm_update = BaseForm.update
_original_GroupForm_update = GroupForm.update
+
def BaseForm_update(self):
# This monkey patch ensures that processInputs() is called before
# z3c.form does any work on the request. This is because z3c.form expects
@@ -20,6 +19,7 @@ def BaseForm_update(self):
processInputs(self.request)
_original_BaseForm_update(self)
+
def GroupForm_update(self):
# This monkey patch ensures that processInputs() is called before
# z3c.form does any work on the request. This is because z3c.form expects
@@ -29,6 +29,7 @@ def GroupForm_update(self):
processInputs(self.request)
_original_GroupForm_update(self)
+
def apply_patch():
BaseForm.update = BaseForm_update
GroupForm.update = GroupForm_update
diff --git a/src/plone/z3cform/templates.py b/src/plone/z3cform/templates.py
index 8b4e9cb..be07508 100644
--- a/src/plone/z3cform/templates.py
+++ b/src/plone/z3cform/templates.py
@@ -4,35 +4,36 @@
The default templates draw from a macro page template which you can use by
itself to render parts of it.
"""
-
from Acquisition import IAcquirer, ImplicitAcquisitionWrapper
-
+from z3c.form import util
+from zope.pagetemplate.interfaces import IPageTemplate
import os
-import zope.publisher.browser
-
-import z3c.form.interfaces
+import plone.z3cform
+import plone.z3cform.layout
import z3c.form.form
+import z3c.form.interfaces
import z3c.form.widget
-
-from z3c.form import util
-from zope.pagetemplate.interfaces import IPageTemplate
+import zope.publisher.browser
try:
# chameleon-compatible page templates
from five.pt.pagetemplate import ViewPageTemplateFile
- from five.pt.pagetemplate import ViewPageTemplateFile as ZopeTwoPageTemplateFile
+ from five.pt.pagetemplate import ViewPageTemplateFile as ZopeTwoPageTemplateFile # noqa
except ImportError:
# standard Zope page templates
- from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile as ZopeTwoPageTemplateFile
+ from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile as ZopeTwoPageTemplateFile # noqa
from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
-import plone.z3cform
-import plone.z3cform.layout
-path = lambda p: os.path.join(os.path.dirname(plone.z3cform.__file__), 'templates', p)
+path = lambda p: os.path.join(
+ os.path.dirname(
+ plone.z3cform.__file__),
+ 'templates',
+ p)
# Zope 2-compatible form and widget template factory classes.
+
class FormTemplateFactory(z3c.form.form.FormTemplateFactory):
"""Form template factory that will use Chameleon if installed (via
five.pt), or the Zope 2 ViewPageTemplateFile from Products.Five if not.
@@ -42,13 +43,21 @@ class FormTemplateFactory(z3c.form.form.FormTemplateFactory):
that instead.
"""
- def __init__(self, filename, contentType='text/html', form=None, request=None):
- self.template = ViewPageTemplateFile(filename, content_type=contentType)
+ def __init__(
+ self,
+ filename,
+ contentType='text/html',
+ form=None,
+ request=None):
+ self.template = ViewPageTemplateFile(
+ filename,
+ content_type=contentType)
zope.component.adapter(
util.getSpecification(form),
util.getSpecification(request))(self)
zope.interface.implementer(IPageTemplate)(self)
+
class ZopeTwoFormTemplateFactory(z3c.form.form.FormTemplateFactory):
"""Form template factory for Zope 2 page templates.
@@ -56,8 +65,15 @@ class ZopeTwoFormTemplateFactory(z3c.form.form.FormTemplateFactory):
form wrapper view.
"""
- def __init__(self, filename, contentType='text/html', form=None, request=None):
- self.template = ZopeTwoPageTemplateFile(filename, content_type=contentType)
+ def __init__(
+ self,
+ filename,
+ contentType='text/html',
+ form=None,
+ request=None):
+ self.template = ZopeTwoPageTemplateFile(
+ filename,
+ content_type=contentType)
zope.component.adapter(
util.getSpecification(form),
util.getSpecification(request))(self)
@@ -70,6 +86,7 @@ def __call__(self, form, request):
else:
return template
+
class ZopeTwoWidgetTemplateFactory(z3c.form.widget.WidgetTemplateFactory):
"""A variant of z3c.form's widget.WidgetTemplateFactory which uses Zope 2
page templates. This should only be necessary if you strictly need the
@@ -77,9 +94,11 @@ class ZopeTwoWidgetTemplateFactory(z3c.form.widget.WidgetTemplateFactory):
"""
def __init__(self, filename, contentType='text/html', context=None,
- request=None, view=None, field=None, widget=None
- ):
- self.template = ViewPageTemplateFile(filename, content_type=contentType)
+ request=None, view=None, field=None, widget=None
+ ):
+ self.template = ViewPageTemplateFile(
+ filename,
+ content_type=contentType)
zope.component.adapter(
util.getSpecification(context),
util.getSpecification(request),
@@ -90,6 +109,7 @@ def __init__(self, filename, contentType='text/html', context=None,
# View containing common macros
+
class Macros(zope.publisher.browser.BrowserView):
def __getitem__(self, key):
@@ -97,22 +117,24 @@ def __getitem__(self, key):
# Default templates for the wrapped layout view use case
-layout_factory = ZopeTwoFormTemplateFactory(path('layout.pt'),
- form=plone.z3cform.interfaces.IFormWrapper
- )
+layout_factory = ZopeTwoFormTemplateFactory(
+ path('layout.pt'),
+ form=plone.z3cform.interfaces.IFormWrapper)
-wrapped_form_factory = FormTemplateFactory(path('wrappedform.pt'),
- form=plone.z3cform.interfaces.IWrappedForm,
- )
+wrapped_form_factory = FormTemplateFactory(
+ path('wrappedform.pt'),
+ form=plone.z3cform.interfaces.IWrappedForm,
+)
# Default templates for the standalone form use case
-standalone_form_factory = ZopeTwoFormTemplateFactory(path('form.pt'),
- form=z3c.form.interfaces.IForm
- )
+standalone_form_factory = ZopeTwoFormTemplateFactory(
+ path('form.pt'),
+ form=z3c.form.interfaces.IForm)
# Default templates for subforms
-subform_factory = FormTemplateFactory(path('subform.pt'),
- form=z3c.form.interfaces.ISubForm
- )
+subform_factory = FormTemplateFactory(
+ path('subform.pt'),
+ form=z3c.form.interfaces.ISubForm
+)
diff --git a/src/plone/z3cform/testing.zcml b/src/plone/z3cform/testing.zcml
index 8d12a55..1cf62a0 100644
--- a/src/plone/z3cform/testing.zcml
+++ b/src/plone/z3cform/testing.zcml
@@ -5,12 +5,11 @@
xmlns:plone="http://namespaces.plone.org/plone"
i18n_domain="plone.z3cform">
-
-
-
+
+
+
-
-
+
+
-
diff --git a/src/plone/z3cform/tests.py b/src/plone/z3cform/tests.py
index d772239..1f92eca 100644
--- a/src/plone/z3cform/tests.py
+++ b/src/plone/z3cform/tests.py
@@ -1,16 +1,14 @@
-import doctest
-import unittest
-
-from plone.testing import Layer, z2, zca
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from plone.testing import Layer, z2, zca
+from z3c.form.interfaces import IFormLayer
from zope import component
from zope import interface
from zope.component import testing
from zope.configuration import xmlconfig
from zope.publisher.browser import TestRequest
-from z3c.form.interfaces import IFormLayer
-
+import doctest
import plone.z3cform.templates
+import unittest
class TestRequest(TestRequest):
@@ -29,12 +27,12 @@ def log(event):
def setup_defaults():
# Set up z3c.form defaults
- import os.path
- import zope.schema
- from zope.pagetemplate.interfaces import IPageTemplate
from z3c.form import browser, button, converter, datamanager, error, field
from z3c.form import interfaces, validator, widget
from z3c.form.browser import text
+ from zope.pagetemplate.interfaces import IPageTemplate
+ import os.path
+ import zope.schema
def getPath(filename):
return os.path.join(os.path.dirname(browser.__file__), filename)
@@ -61,12 +59,19 @@ def getPath(filename):
IPageTemplate, name=interfaces.DISPLAY_MODE)
component.provideAdapter(
- widget.WidgetTemplateFactory(getPath('checkbox_input.pt'), 'text/html'),
- (None, None, None, None, interfaces.ICheckBoxWidget),
- IPageTemplate, name=interfaces.INPUT_MODE)
+ widget.WidgetTemplateFactory(
+ getPath('checkbox_input.pt'),
+ 'text/html'),
+ (None,
+ None,
+ None,
+ None,
+ interfaces.ICheckBoxWidget),
+ IPageTemplate,
+ name=interfaces.INPUT_MODE)
component.provideAdapter(
widget.WidgetTemplateFactory(
- getPath('checkbox_display.pt'), 'text/html'),
+ getPath('checkbox_display.pt'), 'text/html'),
(None, None, None, None, interfaces.ICheckBoxWidget),
IPageTemplate, name=interfaces.DISPLAY_MODE)
# Submit Field Widget
@@ -131,7 +136,7 @@ def tearDown(self):
P3F_FIXTURE = P3FLayer()
FUNCTIONAL_TESTING = z2.FunctionalTesting(bases=(P3F_FIXTURE, ),
- name="plone.z3cform:Functional")
+ name="plone.z3cform:Functional")
def test_suite():
@@ -151,12 +156,12 @@ def test_suite():
layout_txt, inputs_txt, fieldsets_txt, traversal_txt,
doctest.DocFileSuite(
- 'crud/README.txt',
- setUp=testing.setUp, tearDown=testing.tearDown,
- ),
+ 'crud/README.txt',
+ setUp=testing.setUp, tearDown=testing.tearDown,
+ ),
doctest.DocTestSuite(
- 'plone.z3cform.crud.crud',
- setUp=testing.setUp, tearDown=testing.tearDown,
- ),
- ])
+ 'plone.z3cform.crud.crud',
+ setUp=testing.setUp, tearDown=testing.tearDown,
+ ),
+ ])
diff --git a/src/plone/z3cform/textlines/__init__.py b/src/plone/z3cform/textlines/__init__.py
index 4a6b425..8b644c6 100644
--- a/src/plone/z3cform/textlines/__init__.py
+++ b/src/plone/z3cform/textlines/__init__.py
@@ -1 +1 @@
-from plone.z3cform.textlines.textlines import TextLinesFieldWidget
\ No newline at end of file
+from plone.z3cform.textlines.textlines import TextLinesFieldWidget # noqa
diff --git a/src/plone/z3cform/textlines/textlines.py b/src/plone/z3cform/textlines/textlines.py
index 269007e..6395ca9 100644
--- a/src/plone/z3cform/textlines/textlines.py
+++ b/src/plone/z3cform/textlines/textlines.py
@@ -21,20 +21,17 @@
import zope.schema.interfaces
try:
-
# z3c.form 2.0 or later
-
- from z3c.form.interfaces import ITextLinesWidget
- from z3c.form.browser.textlines import TextLinesWidget
from z3c.form.browser.textlines import TextLinesFieldWidget
from z3c.form.browser.textlines import TextLinesFieldWidgetFactory
+ from z3c.form.browser.textlines import TextLinesWidget
from z3c.form.converter import TextLinesConverter
+ from z3c.form.interfaces import ITextLinesWidget
except ImportError:
# backport for z3c.form 1.9
-
from z3c.form import interfaces
from z3c.form import widget
from z3c.form import converter
@@ -47,12 +44,10 @@ class TextLinesWidget(textarea.TextAreaWidget):
"""Input type sequence widget implementation."""
zope.interface.implementsOnly(ITextLinesWidget)
-
def TextLinesFieldWidget(field, request):
"""IFieldWidget factory for TextLinesWidget."""
return widget.FieldWidget(field, TextLinesWidget(request))
-
@zope.interface.implementer(interfaces.IFieldWidget)
def TextLinesFieldWidgetFactory(field, value_type, request):
"""IFieldWidget factory for TextLinesWidget."""
@@ -66,14 +61,14 @@ class TextLinesConverter(converter.BaseDataConverter):
def toWidgetValue(self, value):
"""Convert from text lines to HTML representation."""
- # if the value is the missing value, then an empty list is produced.
+ # if the value is the missing value, then an empty list is
+ # produced.
if value is self.field.missing_value:
return u''
return u'\n'.join(unicode(v) for v in value)
def toFieldValue(self, value):
"""See interfaces.IDataConverter"""
- widget = self.widget
collectionType = self.field._type
if isinstance(collectionType, tuple):
collectionType = collectionType[-1]
@@ -86,6 +81,7 @@ def toFieldValue(self, value):
# additional
+
class TextLinesSetConverter(TextLinesConverter):
"""Data converter for ITextLinesWidget operating on a set."""
@@ -99,6 +95,7 @@ def toWidgetValue(self, value):
return u''
return u'\n'.join(unicode(v) for v in sorted(value))
+
class TextLinesFrozenSetConverter(TextLinesConverter):
"""Data converter for ITextLinesWidget operating on a frozenset."""
diff --git a/src/plone/z3cform/traversal.py b/src/plone/z3cform/traversal.py
index b113712..793a152 100644
--- a/src/plone/z3cform/traversal.py
+++ b/src/plone/z3cform/traversal.py
@@ -1,23 +1,18 @@
-from zope.interface import implements
+from Acquisition import aq_base
+from Acquisition import aq_inner
+from plone.z3cform import z2
+from plone.z3cform.interfaces import IDeferSecurityCheck
+from plone.z3cform.interfaces import IFormWrapper
+from z3c.form import util
+from z3c.form.interfaces import IForm
+from zope.component import adapts
from zope.interface import alsoProvides
+from zope.interface import implements
from zope.interface import noLongerProvides
-from zope.component import adapts
-
+from zope.publisher.interfaces.browser import IBrowserRequest
from zope.traversing.interfaces import ITraversable
from zope.traversing.interfaces import TraversalError
-from zope.publisher.interfaces.browser import IBrowserRequest
-
-from z3c.form.interfaces import IForm
-from z3c.form import util
-
-from plone.z3cform.interfaces import IFormWrapper
-from plone.z3cform.interfaces import IDeferSecurityCheck
-from plone.z3cform import z2
-
-from Acquisition import aq_base
-from Acquisition import aq_inner
-
class FormWidgetTraversal(object):
"""Allow traversal to widgets via the ++widget++ namespace. The context
@@ -61,7 +56,8 @@ def traverse(self, name, ignored):
noLongerProvides(self.request, IDeferSecurityCheck)
# If name begins with form.widgets., remove it
- form_widgets_prefix = util.expandPrefix(form.prefix)+util.expandPrefix(form.widgets.prefix)
+ form_widgets_prefix = util.expandPrefix(
+ form.prefix) + util.expandPrefix(form.widgets.prefix)
if name.startswith(form_widgets_prefix):
name = name[len(form_widgets_prefix):]
@@ -70,48 +66,57 @@ def traverse(self, name, ignored):
parts = name.split('.')
while len(parts) > 0:
part = parts.pop(0)
- if type(getattr(target,'widgets',None)) is list: # i.e. a z3c.form.widget.MultiWidget
+ # i.e. a z3c.form.widget.MultiWidget
+ if isinstance(getattr(target, 'widgets', None), list):
try:
# part should be integer index in list, look it up
target = target.widgets[int(part)]
except IndexError:
- raise TraversalError("'"+part+"' not in range")
+ raise TraversalError("'" + part + "' not in range")
except ValueError:
- #HACK: part isn't integer. Iterate through widgets to
+ # HACK: part isn't integer. Iterate through widgets to
# find matching name. This is required for
# DataGridField, which appends 'AA' and 'TT' rows to
# it's widget list.
full_name = util.expandPrefix(target.prefix) + part
filtered = [w for w in target.widgets
- if w.name == full_name]
+ if w.name == full_name]
if len(filtered) == 1:
target = filtered[0]
else:
- raise TraversalError("'"+part+"' not valid index")
- elif hasattr(target,'widgets'): # Either base form, or subform
+ raise TraversalError("'" + part + "' not valid index")
+ elif hasattr(target, 'widgets'): # Either base form, or subform
# Check to see if we can find a "Behaviour.widget"
new_target = None
if len(parts) > 0:
- new_target = self._form_traverse(target,part+'.'+parts[0])
+ new_target = self._form_traverse(
+ target,
+ part +
+ '.' +
+ parts[0])
if new_target is not None:
# Remove widget name from stack too
parts.pop(0)
else:
# Find widget in form without behaviour prefix
- new_target = self._form_traverse(target,part)
+ new_target = self._form_traverse(target, part)
target = new_target
- elif hasattr(target,'subform'): # subform-containing widget, only option is to go into subform
- if part=='widgets':
+ # subform-containing widget, only option is to go into subform
+ elif hasattr(target, 'subform'):
+ if part == 'widgets':
target = target.subform
else:
target = None
else:
- raise TraversalError('Cannot traverse through '+target.__repr__())
+ raise TraversalError(
+ 'Cannot traverse through ' +
+ target.__repr__())
# Could not traverse from target to part
- if target is None: raise TraversalError(part)
+ if target is None:
+ raise TraversalError(part)
# Make the parent of the widget the traversal parent.
# This is required for security to work in Zope 2.12
@@ -121,7 +126,7 @@ def traverse(self, name, ignored):
raise TraversalError(name)
# Look for name within a form
- def _form_traverse(self,form,name):
+ def _form_traverse(self, form, name):
if name in form.widgets:
return form.widgets.get(name)
# If there are no groups, give up now
diff --git a/src/plone/z3cform/widget.py b/src/plone/z3cform/widget.py
index 18f12e5..d34ce60 100644
--- a/src/plone/z3cform/widget.py
+++ b/src/plone/z3cform/widget.py
@@ -1,12 +1,11 @@
from zope.schema import vocabulary
-
-import zope.interface
+import z3c.form.browser.checkbox
+import z3c.form.interfaces
+import z3c.form.term
import zope.component
+import zope.interface
import zope.schema.interfaces
-import z3c.form.term
-import z3c.form.browser.checkbox
-import z3c.form.interfaces
class SingleCheckBoxWidget(z3c.form.browser.checkbox.SingleCheckBoxWidget):
@@ -21,22 +20,29 @@ def updateTerms(self):
self.terms = z3c.form.term.Terms()
self.terms.terms = vocabulary.SimpleVocabulary((
vocabulary.SimpleTerm(True, 'selected', u''),
- ))
+ ))
return self.terms
def extract(self, default=z3c.form.interfaces.NOVALUE, setErrors=True):
# The default implementation returns [] here.
if (self.name not in self.request and
- self.name+'-empty-marker' in self.request):
+ self.name + '-empty-marker' in self.request):
return default
else:
try:
- return super(SingleCheckBoxWidget, self).extract(default, setErrors=setErrors)
+ return super(
+ SingleCheckBoxWidget,
+ self).extract(
+ default,
+ setErrors=setErrors)
except TypeError:
# for z3c.form <= 1.9.0
return super(SingleCheckBoxWidget, self).extract(default)
-@zope.component.adapter(zope.schema.interfaces.IBool, z3c.form.interfaces.IFormLayer)
+
+@zope.component.adapter(
+ zope.schema.interfaces.IBool,
+ z3c.form.interfaces.IFormLayer)
@zope.interface.implementer(z3c.form.interfaces.IFieldWidget)
def SingleCheckBoxFieldWidget(field, request):
return z3c.form.widget.FieldWidget(field, SingleCheckBoxWidget(request))
diff --git a/src/plone/z3cform/z2.py b/src/plone/z3cform/z2.py
index 10e8ed3..2795bd3 100644
--- a/src/plone/z3cform/z2.py
+++ b/src/plone/z3cform/z2.py
@@ -1,16 +1,15 @@
from zope import interface
-
+from zope.i18n.interfaces import IUserPreferredCharsets
from zope.publisher.browser import isCGI_NAME
from zope.publisher.interfaces.browser import IBrowserApplicationRequest
-
-from zope.i18n.interfaces import IUserPreferredCharsets
-
import z3c.form.interfaces
+
class IFixedUpRequest(interface.Interface):
"""Marker interface used to ensure we don't fix up the request twice
"""
+
class IProcessedRequest(interface.Interface):
"""Marker interface used to ensure we don't process the request inputs
twice.
@@ -18,6 +17,7 @@ class IProcessedRequest(interface.Interface):
# Safer versions of the functions in Products.Five.browser.decode
+
def processInputs(request, charsets=None):
"""Process the values in request.form to decode strings to unicode, using
the passed-in list of charsets. If none are passed in, look up the user's
@@ -52,6 +52,7 @@ def processInputs(request, charsets=None):
interface.alsoProvides(request, IProcessedRequest)
+
def _decode(text, charsets):
for charset in charsets:
try:
@@ -61,6 +62,7 @@ def _decode(text, charsets):
pass
return text
+
def switch_on(view, request_layer=z3c.form.interfaces.IFormLayer):
"""Fix up the request and apply the given layer. This is mainly useful
in Zope < 2.10 when using a wrapper layout view.
@@ -68,9 +70,9 @@ def switch_on(view, request_layer=z3c.form.interfaces.IFormLayer):
request = view.request
- if (not IFixedUpRequest.providedBy(request) and
+ if (
+ not IFixedUpRequest.providedBy(request) and
not IBrowserApplicationRequest.providedBy(request)
):
-
interface.alsoProvides(request, IFixedUpRequest)
interface.alsoProvides(request, request_layer)