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)