=================
plone.app.z3cform
=================
A Plone specific integration and HTML mark-up for z3c.form.
This is a Plone core package.
.. contents:: Table of Contents
Introduction
==============
This Plone package is aimed for developers who want to create forms in Python code.
Please read the documentation for `z3c.form`_, which contains important information about using z3c.form in Zope 2 in general.
For the most part, that package contains the "active" parts that you need to know about, and this package provides "passive" overrides that make the forms integrate with Plone.
Features
========
The following Plone and z3c.form integration is added
* Plone *main_template.pt* integration
* Plone specific widget frame
* Date/time pickers
* WYSIWYG widget (TinyMCE visual editor with Plone support)
* CRUD forms
Out of the box form templates
=============================
The form and widget templates are applied in the following order
* *plone.app.z3cform* specific
* *plone.z3cform* specific
* *z3c.form* specific
*plone.app.z3cform* package overrides the ``@@ploneform-macros`` view from `plone.z3cform`_, using standard Plone markup for form fields, fieldsets, etc.
All the macros described in `plone.z3cform`_ are still available.
In addition, you can use the ``widget_rendering`` macro to render all the default widgets, but none of the fieldsets (groups) or the fieldset headers (which would be rendered with the ``fields`` macro).
Each widget is rendered using the ``@@ploneform-render-widget`` view, which by default includes the widget's label, required indicator, description, errors, and the result of ``widget.render()``.
This view may be overridden for particular widget types in order to customize this widget chrome.
Customizing form behavior
=========================
Form method
-----------
If your form instance defines a property called ``method`` it allows you to set whether form is HTTP POST or HTTP GET.
The default is POST.
This translates to ``<form method="post">`` attribute.
Example::
class HolidayServiceSearchForm(form.Form):
""" Example search form of which results can be bookmarked.
Bookmarking is possible because we use HTTP GET method.
"""
method = "get"
Form action
-----------
Form ``action`` property defines HTTP target where the form is posted.
The default is the same page where the form was rendered, ``request.getURL()``.
Example::
class HolidayServiceSearchForm(form.Form):
def action(self):
""" Redefine <form action=''> attribute.
We use URL fragment to define the <a> anchor
were we directly scroll at the results when the form is posted,
skipping unnecessary form fields part. The user can scroll
back there if he/she wants modify the parameters.
"""
# Context item URL + form view name + link fragment.
# This works for HTTP GET forms only.
# Note that we cannot use request.getURL() as it might contain
# 1) prior fragment 2) GET query parameters messing up the UrL
return self.context.absolute_url() + "/holidayservice_view" + "#searched"
Fieldsets and tabs
------------------
You can fieldsets to your form if you subclass the form from z3c.form.group.GroupForm.
The default behavior of Plone is to turn these fieldsets to tabs
(as seen on any *Edit* view of content item).
You can disable this behavior for your form::
class ReportForm(z3c.form.group.GroupForm, z3c.form.form.Form):
# Disable turn fieldsets to tabs behavior
enable_form_tabbing = False
Unload protection
-----------------
The default behaviour on Plone is to add a confirm box if you leave a form you have modified without having submitted it.
You can disable this behavior for your form::
class SearchForm(z3c.form.group.GroupForm, z3c.form.form.Form):
# Disable unload protection behavior
enable_unload_protection = False
Autofocus
---------
The default behaviour on Plone Forms is to use the formautofocus pattern to focus the "first" input field.
You can disable this behavior for your form::
class SearchForm(z3c.form.group.GroupForm, z3c.form.form.Form):
# Disable autofocus behavior
enable_autofocus = False
CSRF Protection
===============
A common vulnerability affecting web forms is cross-site request forgery (CSRF).
This attack occurs when the user of your site visits a third-party site that uses Javascript to post to a URL on your site without the user's knowledge, taking advantage of the user's active session.
plone.app.z3cform can protect against this type of attack by adding a unique token as a hidden input when rendering the form, and checking to make sure it is present as a request parameter when form actions are executed.
To turn on this protection, enable the form's enableCSRFProtection attribute.
Example::
class PasswordForm(form.Form):
"""Form to set the user's password."""
enableCSRFProtection = True
Form main template override
===========================
Forms are framed by *FormWrapper* views.
It places rendered form inside Plone page frame.
The default *FormWrapper* is supplied automatically, but you can override it.
Below is a placeholder example with few `<select>` inputs.
Example ``reporter.py``::
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile as FiveViewPageTemplateFile
from zope.i18nmessageid import MessageFactory
from zope.schema.vocabulary import SimpleTerm
from zope.schema.vocabulary import SimpleVocabulary
import plone.app.z3cform
import plone.z3cform.templates
import z3c.form
import zope.interface
import zope.schema
_ = MessageFactory('your.addon')
def make_terms(items):
""" Create zope.schema terms for vocab from tuples """
terms = [SimpleTerm(value=pair[0], token=pair[0], title=pair[1]) for pair in items]
return terms
output_type_vocab = SimpleVocabulary(make_terms([("list", "Patient list"), ("summary", "Summary")]))
class IReportSchema(zope.interface.Interface):
""" Define reporter form fields """
outputType = zope.schema.Choice(
title=u"Output type",
description=u"How do you want the output",
source=output_type_vocab)
country = zope.schema.Choice(
title=u"Country",
required=False,
description=u"Which country to report",
vocabulary="allowed_countries")
hospital = zope.schema.Choice(
title=u"Hospital",
required=False,
description=u"Which hospital to report",
vocabulary="allowed_hospitals")
class ReportForm(z3c.form.form.Form):
""" A form to output a HTML report from chosen parameters """
fields = z3c.form.field.Fields(IReportSchema)
ignoreContext = True
output = None
@z3c.form.button.buttonAndHandler(_('Make Report'), name='report')
def report(self, action):
data, errors = self.extractData()
if errors:
self.status = "Please correct errors"
return
# Create sample item which we can consume in the page template
self.output = dict(country="foobar")
self.status = _(u"Report complete")
# IF you want to customize form frame you need to make a custom FormWrapper view around it
# (default plone.z3cform.layout.FormWrapper is supplied automatically with form.py templates)
report_form_frame = plone.z3cform.layout.wrap_form(ReportForm, index=FiveViewPageTemplateFile("templates/reporter.pt"))
Example ``configure.zcml``::
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="your.addon">
<browser:page
for="*"
name="reporter"
class=".reporter.report_form_frame"
permission="zope2.View"
/>
</configure>
Example ``templates/reporter.html``::
<html metal:use-macro="context/main_template/macros/master"
i18n:domain="sits.reporttool">
<body>
<metal:block fill-slot="main">
<h1 class="documentFirstHeading" tal:content="view/label | nothing" />
<div id="content-core">
<div id="form-input">
<span tal:replace="structure view/contents" />
</div>
<div id="form-output" tal:condition="view/form_instance/output">
Chosen country: <b tal:content="view/form_instance/output/country" />
</div>
</div>
</metal:block>
</body>
</html>
Widget frame override
=====================
You can override widget templates as instructed for ``z3c.form``.
``plone.app.z3cform`` renders `a frame around each widget <https://github.com/plone/plone.app.z3cform/blob/master/plone/app/z3cform/templates/widget.pt>`_
which usually consists of
* Label
* Required marker
* Description
You might want to customize this widget frame for your own form.
Below is an example how to do it.
Copy `widget.pt <https://github.com/plone/plone.app.z3cform/blob/master/plone/app/z3cform/templates/widget.pt>`_ to your own package and customize it in way you wish
Add the following to ``configure.zcml``
::
<browser:page
name="ploneform-render-widget"
for=".demo.IDemoWidget"
class="plone.app.z3cform.templates.RenderWidget"
permission="zope.Public"
template="demo-widget.pt"
/>
Create a new marker interface in Python code
::
from zope.interface import Interface
class IDemoWidget(Interface):
pass
Then apply this marker interface to all of your widgets in ``form.update()``
::
from zope.interface import alsoProvides
class MyForm(...):
...
def update(self):
super(MyForm, self).update()
for widget in form.widgets.values():
alsoProvides(widget, IDemoWidget)
Hide fields that have no value
==============================
The ``.empty`` css class marks the fields that have no value.
If you don't want to display these fields in view mode, add the following css in your theme.
::
.template-view .empty.field {
display: none;
}
Add additional parameters to widgets
====================================
You can add additional parameters to widgets defined in this package via the `plone.autoform.widgets.ParameterizedWidget`.
::
from plone.app.z3c.form.widget import DateWidget
MyDateWidget = ParameterizedWidget(DateWidget, wrapper_css_class='event_start')
or via directives
::
from plone.app.z3c.form.widget import DateWidget
@provider(IFormFieldProvider)
class IMyEventBehavior(model.Schema):
...
widget('event_start', DateWidget, wrapper_css_class='event_start')
event_start = schema.TextLine(
title=_(u'label_event_start'),
description=_(u'help_event_start'),
required=True,
)
Testing
=======
To test ``plone.app.z3form`` it is recommended to use `plone.app.testing <https://pypi.python.org/pypi/plone.app.testing/>`_ function test layer which will do ``plone.app.z3cform`` setup for you.
Read ``plone.app.z3cform`` manual for further instructions.
If you still need to test forms on lower level in unit tests you need to enable ``plone.app.z3cform`` support manually.
Below is an example::
import unittest
from zope.interface import alsoProvides
from zope.publisher.browser import setDefaultSkin
from z3c.form.interfaces import IFormLayer
class TestFilteringIntegration(unittest.TestCase):
""" Test that filtering options work on the form """
layer = MY_TEST_LAYER_WITH_PLONE
def setUp(self):
super(TestFilteringIntegration, self).setUp()
request = self.layer["request"]
setDefaultSkin(request)
alsoProvides(request, IFormLayer) #suitable for testing z3c.form views
def test_report_form_filtering(self):
reporter = ReportForm(self.layer["portal"], self.layer["request"])
reporter.update()
Troubleshooting
===============
Here are some common errors you might encounter with plone.app.z3cform.
ComponentLookupError in updateWidgets()
---------------------------------------
::
Traceback (innermost last):
Module ZPublisher.Publish, line 119, in publish
Module ZPublisher.mapply, line 88, in mapply
Module ZPublisher.Publish, line 42, in call_object
Module plone.z3cform.layout, line 64, in __call__
Module plone.z3cform.layout, line 54, in update
Module getpaid.expercash.browser.views, line 63, in update
Module z3c.form.form, line 208, in update
Module z3c.form.form, line 149, in update
Module z3c.form.form, line 128, in updateWidgets
Module zope.component._api, line 103, in getMultiAdapter
ComponentLookupError: ((<getpaid.expercash.browser.views.CheckoutForm object at 0xdb052ac>, <HTTPRequest, URL=http://localhost:8080/test/@@getpaid-checkout-wizard>, <PloneSite at /test>), <InterfaceClass z3c.form.interfaces.IWidgets>, u'')
plone.app.z3cform layers are not in place (configuration ZCML is not read).
You probably forgot to include plone.app.z3cform in your product's configuration.zcml. See *Installation* above.
.. _z3c.form: http://pypi.python.org/pypi/z3c.form
.. _Plone: http://plone.org
.. _plone.z3cform: http://pypi.python.org/pypi/plone.z3cform
Inline validation
=================
First, let's set up some infrastructure:
>>> from zope.interface import alsoProvides
>>> from plone.testing.zope import makeTestRequest
>>> from zope.annotation.interfaces import IAttributeAnnotatable
>>> from z3c.form.interfaces import IFormLayer
>>> app = layer['app']
>>> def make_request(form=None, lang='en'):
... request = makeTestRequest({'HTTP_ACCEPT_LANGUAGE': lang})
... if form is None:
... form = {}
... request.form.update(form)
... alsoProvides(request, IFormLayer)
... alsoProvides(request, IAttributeAnnotatable)
... return request
Then we create a simple z3c form
>>> from zope import interface, schema
>>> from z3c.form import form, field, button
>>> from plone.z3cform.layout import FormWrapper
>>> class MySchema(interface.Interface):
... age = schema.Int(title=u"Age")
>>> from __future__ import print_function
>>> class MyForm(form.Form):
... fields = field.Fields(MySchema)
... ignoreContext = True # don't use context to get widget data
...
... @button.buttonAndHandler(u'Apply')
... def handleApply(self, action):
... data, errors = self.extractData()
... print(data['age']) # ... or do stuff
>>> class MyFormWrapper(FormWrapper):
... form = MyForm
... label = u"Please enter your age"
>>> from zope.component import provideAdapter
>>> from zope.publisher.interfaces.browser import IBrowserRequest
>>> from zope.interface import Interface
>>> provideAdapter(adapts=(Interface, IBrowserRequest),
... provides=Interface,
... factory=MyFormWrapper,
... name=u"test-form")
Let's verify that worked:
>>> from zope.component import getMultiAdapter
>>> from zope.interface import Interface, implementer
>>> from Acquisition import Implicit
>>> @implementer(Interface)
... class Bar(Implicit):
... def restrictedTraverse(self, name):
... # fake traversal to the form
... if name.startswith('@@'):
... return getMultiAdapter((self, self._REQUEST), Interface, name[2:])
... else:
... return getattr(self, name)
...
>>> context = Bar()
>>> request = make_request()
>>> context._REQUEST = request # evil test fake
>>> formWrapper = getMultiAdapter((context, request), name=u"test-form")
>>> formWrapper
<Products.Five...MyFormWrapper object ...>
>>> formWrapper.form
<class 'plone.app.z3cform.tests.example.MyForm'>
>>> del context, request
Inline validation
-----------------
Inline validation is invoked via the @@z3cform_validate_field view.
>>> context = Bar()
>>> request = make_request(form={'form.widgets.age': 'Title'})
>>> context._REQUEST = request
>>> form = MyForm(context, request)
>>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field")
This is wired up with jQuery. When the user leaves a form control with inline
validation enabled, it will be called with the following parameters:
>>> z3cform_validate_field(fname=u'form.widgets.age')
'{"errmsg": "The entered value is not a valid integer literal."}'
>>> request = make_request(form={'form.widgets.age': '20'})
>>> context._REQUEST = request
>>> form = MyForm(context, request)
>>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field")
>>> z3cform_validate_field(fname=u'form.widgets.age')
'{"errmsg": ""}'
If the field name (fname) is not provided by the client, the validation
should return without issue:
>>> z3cform_validate_field()
'{"errmsg": ""}'
>>> z3cform_validate_field(fname=None)
'{"errmsg": ""}'
Inline validation with groups
-----------------------------
We use plone.app.z3cform.tests.example.MyGroupFormWrapper and validate the
field 'name' that's part of a group. Inline validation is invoked via the
@@z3cform_validate_field view.
>>> request = make_request(form={'form.widgets.name': ''})
>>> context._REQUEST = request
>>> from plone.app.z3cform.tests.example import MyGroupFormWrapper
>>> form = MyGroupFormWrapper(context, request)
>>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field")
The validation view takes an Attribute fset with ether the numeric index or
the name of the group.
>>> z3cform_validate_field(fname=u'form.widgets.name', fset="0")
'{"errmsg": "Required input is missing."}'
>>> z3cform_validate_field(fname=u'form.widgets.name', fset="mygroup")
'{"errmsg": "Required input is missing."}'
>>> request = make_request(form={'form.widgets.name': u'Name'})
>>> context._REQUEST = request
>>> form = MyGroupFormWrapper(context, request)
>>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field")
>>> z3cform_validate_field(fname=u'form.widgets.name', fset="0")
'{"errmsg": ""}'
>>> z3cform_validate_field(fname=u'form.widgets.name', fset="mygroup")
'{"errmsg": ""}'
Inline-Validation and Translation of ErrorSnippets
--------------------------------------------------
We use plone.app.z3cform.tests.example.MyGroupFormWrapper and validate the
field 'name' that's part of a group. Inline validation is invoked via the
@@z3cform_validate_field view.
>>> request = make_request(form={'form.widgets.name': ''}, lang='de',)
>>> context._REQUEST = request
>>> form = MyGroupFormWrapper(context, request)
>>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field")
The validation view takes an Attribute fieldset with the index of the group.
The error is only shown when warning_only is explicitly switched off (matching
the behavior of archetypes.)
>>> z3cform_validate_field(fname=u'form.widgets.name', fset="0")
'{"errmsg": "Erforderliche Eingabe fehlt."}'
Forms embedded inside normal views
-----------------------------------
It's possible to embed z3c.form Forms inside a normal BrowserView via viewlets,
portlets or tiles.
Currently the name of the form to be validated is gotten from the URL. For embedded
forms this can't work since the URL only has the containing view's name.
Until a lasting solution is found, we just make sure that validation
doesn't raise an exception if it receives a normal browerview as the supposed
form.
>>> from zope.publisher.browser import BrowserView
>>> class MyNormalView(BrowserView):
... """ """
>>> provideAdapter(adapts=(Interface, IBrowserRequest),
... provides=Interface,
... factory=MyNormalView,
... name=u"my-view")
Let's verify that it gets called...
>>> context = Bar()
>>> request = make_request()
>>> view = getMultiAdapter((context, request), name=u"my-view")
>>> view
<MyNormalView object ...>
Inline validation is invoked via the @@z3cform_validate_field view. But
in this case no validation output should be returned.
>>> context = Bar()
>>> request = make_request(form={'form.widgets.age': 'Title'})
>>> z3cform_validate_field = getMultiAdapter((view, request), name=u"z3cform_validate_field")
>>> z3cform_validate_field(fname=u'form.widgets.age')
'{"errmsg": ""}'
Changelog
=========
.. You should *NOT* be adding new change log entries to this file.
You should create a file in the news directory instead.
For helpful instructions, please see:
https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst
.. towncrier release notes start
4.7.1 (2024-11-25)
------------------
Bug fixes:
- Fix pattern options for `LinkWidget`.
[petschki] (#213)
4.7.0 (2024-09-24)
------------------
New features:
- Implement new `ContentBrowserWidget` for `pat-contentbrowser` pattern.
The deprecated `RelatedItemsWidget` and `pat-relateditems` pattern is still available
and imports should not break. But the default widget and converter adapter registration for
z3c.relationfield is changed to the new widget.
Since `plone.app.relationfield` defines the widget with `plone.autoform` schema
hints nothing changes until the package is updated to the new widget.
[petschki] (#197)
4.6.1 (2024-05-30)
------------------
Internal:
- Date/time widget: Fix data converter adaption.
Get the data converter for the date and datetime widgets via adaption and remove the _converter attribute hack.
This aligns the code to z3c.form standards and allows to override the data converter which was previously not easily possible.
[thet] (#204)
4.6.0 (2024-04-22)
------------------
New features:
- Use label_css_class attribute from widget if available in checkbox_input & radio_input
[MrTango] (#202)
4.5.0 (2024-03-19)
------------------
New features:
- Add support for the "accept" attribute on file inputs.
If the widget's field - if there is one - has the "accept" attribute set (the
`NamedImage` field has `image/*` set by default) then this is rendered as an
`accept` attribute on the file input.
This would restrict the allowed file types before uploading while still being
checked on the server side.
Fixes: https://github.com/plone/plone.formwidget.namedfile/issues/66
Depends on:
- https://github.com/plone/plone.namedfile/pull/158
- https://github.com/plone/plone.formwidget.namedfile/pull/67
[thet] (#198)
Bug fixes:
- Fix `SelectFieldWidget` factory call.
[petschki] (#192)
4.4.1 (2024-02-27)
------------------
Bug fixes:
- Add missing ``pattern_options`` multiadapter to new PatternFormElement base class.
[petschki] (#190)
- Implement missing PasswordWidget adapter.
[petschki] (#193)
4.4.0 (2023-10-18)
------------------
New features:
- Add `row` container to enable column layouts for fields with `wrapper_css_class`.
[petschki] (#158)
- Implement new ``z3c.form`` extensible attributes feature and cleanup
widget templates using Chameleon interpolation.
[petschki] (#181)
Bug fixes:
- Add missing widget configuration for `plone.schema.jsonfield.IJSONField`.
[petschki] (#185)
4.3.0 (2023-07-14)
------------------
New features:
- Introduce new Email-Widget which is used for `plone.schema.email.IEmail` fields.
It uses the input type `email`.
[jensens] (#173)
Bug fixes:
- Fix OrdereSelectWidget browser validation when the input is required.
[petschki] (#178)
- Ignore form validation when `ignoreRequiredOnExtract` is set.
[petschki] (#179)
Internal:
- Update configuration files.
[plone devs] (cfffba8c)
4.2.1 (2023-06-16)
------------------
Bug fixes:
- Add `required` to orderedselect widget.
[petschki - original PR by szakitibi] (#170)
4.2.0 (2023-05-22)
------------------
New features:
- Move storage utility to plone.namedfile
to break a dependency cycle between the two.
[gforcada] (#3764)
Bug fixes:
- Remove invalid unicode control characters for `TextareaWidget`
[petschki] (#167)
4.1.0 (2023-04-26)
------------------
New features:
- Merge utils and base classes from ``plone.app.widgets`` and do not depend
on it anymore. [petschki] (#19)
4.0.3 (2023-04-14)
------------------
Bug fixes:
- Fixes transitive circular dependency to plone.schema.
Inherit own Browserlayer from new intermediate browserlayer in plone.schema.
[jensens] (#163)
- Add ``test`` extra with the same contents as the ``tests`` extra.
The ``tests`` extra will be removed in Plone 7.
[maurits] (#164)
Internal:
- Update configuration files.
[plone devs] (3b8337e6)
4.0.2 (2023-03-23)
------------------
Bug fixes:
- Fix relative URLs validation in link widget
[laulaz] (#160)
Internal:
- Update configuration files.
[plone devs] (243ca9ec)
4.0.1 (2023-01-26)
------------------
Bug fixes:
- Include ``required`` attribute for ``<textarea>`` fields.
[frapell] (#156)
4.0.0 (2022-11-30)
------------------
Bug fixes:
- Final release.
[gforcada] (#600)
4.0.0b1 (2022-08-30)
--------------------
New features:
- Add `default_time` attribute/argument to Date- and DatetimeWidget to allow the converter to set a custom time when nothing was given. [jensens] (#151)
- Customizable DateWidget formatter length.
[petschki] (#154)
Bug fixes:
- Allow non-default fieldset labels to be translated
[mtrebron] (#87)
- Fix CSS classname for statusmessage.
[petschki] (#149)
- Leftovers of Py 2 removed (with pyupgrade and manual edits). then run black & isort.
Do not depend on CMFPlone any longer (circular dependency), but on plone.base.
[jensens] (#150)
- Allow DateFieldWidget to be used on schema.datetime. See #151. [jensens] (#151)
- Removed formatting hack for dates before 1900.
This was fixed in Python 3.2.
[jensens] (#152)
4.0.0a10 (2022-05-24)
---------------------
Bug fixes:
- Re-enable form validation. [thet] (#147)
4.0.0a9 (2022-04-04)
--------------------
New features:
- Use browser native date and datetime-local input
together with patternslib date-picker
[petschki] (#134)
- Use better types for inputs.
[thet] (#134)
- Remove inlinevalidation from templates.
[thet] (#134)
- Implement TimeWidget which renders <input type="time" />
[petschki] (#134)
- Use pat-validation in forms.
[thet] (#134)
Bug fixes:
- time widget supports 'name' and 'value' attributes now. [iham] (#134)
- Register `AddView` to the correct browserlayer
[petschki] (#142)
4.0.0a8 (2022-03-23)
--------------------
New features:
- Fixed for latest z3c.form
[petschki] (#146)
4.0.0a7 (2022-03-09)
--------------------
Bug fixes:
- Add ``name`` attribute to form, if ``view.form_name`` is defined.
See `easyform issue 325 <https://github.com/collective/collective.easyform/issues/325>`_.
[maurits] (#325)
4.0.0a6 (2022-01-19)
--------------------
Bug fixes:
- re-enable HTML rendering in form description
[petschki] (#138)
4.0.0a5 (2022-01-07)
--------------------
Bug fixes:
- Remove erroneous extra curly bracket in class name of the widget wrapper.
[thet] (#136)
4.0.0a4 (2021-11-26)
--------------------
New features:
- Enable multiple wysiwyg editors (use default editor registry setting) [duchenean, gotcha] (#45)
- Enable formautofocus for Plone forms.
Allow disabling for specific forms with ``enable_autofocus = False``.
[jmevissen] (#135)
4.0.0a3 (2021-10-13)
--------------------
Bug fixes:
- Fix form-error alert for BS5 (including invariants errors). [jensens] (#129)
- Fix widget display mode for Bootstrap 5. [jensens] (#130)
4.0.0a2 (2021-09-01)
--------------------
New features:
- Add support for more widget options when working with relation fields. (#125)
4.0.0a1 (2021-04-21)
--------------------
Breaking changes:
- Update form widget implementation for Plone 6 with Bootstrap markup
[petschki, balavec, agitator] (#127)
New features:
- - Added Exception for ValueError if value is (None,) and term_value can't be set [wkbkhard] (#121) (#121)
Bug fixes:
- Clean up rst documentation titles, spacing, add .vscode and .idea to gitignore.
[balavec] (#0)
3.2.2 (2020-08-21)
------------------
Bug fixes:
- Fixed repeat syntax in multi input to also work in Zope 4.5.
[maurits] (#116)
3.2.1 (2020-06-30)
------------------
Bug fixes:
- Fix message type like Error not translated in add form.
This closes https://github.com/plone/Products.CMFPlone/issues/3126
[vincentfretin] (#115)
3.2.0 (2020-04-20)
------------------
New features:
- Add display template for RelatedItemsWidget. No longer only render uuids.
[pbauer] (#111)
3.1.3 (2019-10-12)
------------------
Bug fixes:
- - Fix LinkWidget selected tab on edit #108
[mamico] (#108)
3.1.2 (2019-08-29)
------------------
Bug fixes:
- Fix wrong default for method attribute in pt
[mamico] (#107)
3.1.1 (2019-06-27)
------------------
Bug fixes:
- - Fixes: Keywords broken plone/Products.CMFPlone#2885
[jensens] (#105)
3.1.0 (2019-05-01)
------------------
New features:
- Add display template for AjaxSelectWidget showing the actual vocabularies term title.
[jensens]
- ``IFieldPermissionChecker`` was moved here from plone.app.widgets.
[jensens]
Bug fixes:
- Fixes AjaxSelectWidget to respect tokens different from values in vocabularies.
This includes changes in both, the converter and the widget itself.
A test was added too.
``get_ajaxselect_options`` from ``plone.app.widgets.utils`` is assimilated by the widget now too simplify the whole code,
so the one in the other package is dead code now and will be deprecated there.
[jensens]
- LinkFieldWidget: added converter method toFieldValue [ksuess]
3.0.9 (2019-01-08)
------------------
Bug fixes:
- a11y: added role attribute for portalMessage
[nzambello]
3.0.8 (2018-11-29)
------------------
New features:
- Add support for rendering <optgroup> elements from
zope.schema.interfaces.ITreeVocabulary hierarchical terms.
[rpatterson]
3.0.7 (2018-11-07)
------------------
Bug fixes:
- Fix deprecation warning
(https://github.com/plone/Products.CMFPlone/issues/2605) [ale-rt]
3.0.6 (2018-09-27)
------------------
Bug fixes:
- Prepare for Python 2 / 3 compatibility
[pbauer, MatthewWilkes, ale-rt]
3.0.5 (2018-06-19)
------------------
Bug fixes:
- Cleanup code analysis problems.
[jensens]
- Fix SingleCheckBoxBoolWidget description to render structure
[allusa]
- Prepare for Python 2 / 3 compatibility
[pbauer, MatthewWilkes, ale-rt]
- Render mimetype selection box correctly for a ``RichTextWidget`` which also
brings back the TinyMCE.
[sallner]
- Allow RelatedItems widget to be used in subforms
[tomgross]
3.0.4 (2018-02-04)
------------------
Bug fixes:
- Fix test failures from https://github.com/plone/plone.app.widgets/pull/177
[thet]
- Prepare for Python 2 / 3 compatibility
[pbauer]
3.0.3 (2017-11-24)
------------------
New features:
- Link widget: add ``placeholder`` attributes for external and email link input fields.
[thet]
Bug fixes:
- Fix: Add missing i18n-domains to templates.
[jensens]
- Use RichTextValue's output_relative_to(self.context) in RichTextWidget so the ITransform doesn't use siteroot.
[jaroel]
- Fix in link widget data converter for ``toWidgetValue`` to return an empty structure when the field value is empty instead of returning the portal root object.
Fixes: https://github.com/plone/Products.CMFPlone/issues/2163
[thet]
- Keep "internal" links with query strings as external links, otherwise
the query string is lost
[tomgross]
- Allow an additional CSS class for widgets in this package
[tomgross]
- Document customization of widgets
[tomgross]
3.0.2 (2017-09-06)
------------------
Bug fixes:
- Test fixes for changes in plone.app.widgets querystring options.
[thet]
3.0.1 (2017-07-03)
------------------
New features:
- Add new and enhanced link widget.
[tomgross, thet]
Bug fixes:
- Fix broken ``get_tinymce_options`` when called with non-contentish contexts like form or field contexts.
[thet]
- Related Items Widget: In search mode, when no basePath was set, search site-wide.
Fixes: https://github.com/plone/mockup/issues/769
[thet]
- Fixes #64: SingleCheckBoxFieldWidget does not render value in view mode.
In order to fix this issue the hacky view was removed.
It is replaced by a new widget to render a single checkbox with bool values.
An appropriate data converter was added as well.
[jensens]
3.0 (2017-03-28)
----------------
Breaking changes:
- Removed ``plone.app.z3cform.object`` and
``plone.app.z3cform.objectsubform`` because z3c.form 3.3 removed the
underlying code.
See https://github.com/zopefoundation/z3c.form/pull/38 for upstream changes.
[maurits]
New features:
- Add new class ``view-name-VIEWNAME`` to form element indicating the view name w/o old kss prefix.
New class's replaces ``++`` in view by ``-`` in order to produce valid class (CSS selectable) names.
[jensens]
Bug fixes:
- Catch TypeError occurring on conflicting subrequests in inline validation
[tomgross]
- Clean up: code-style, zca-decorators, replace lambda.
[jensens]
2.2.1 (2017-02-12)
------------------
New features:
- Do not show the "Clear" button for required Date or DateTime fields.
[thet]
Bug fixes:
- Test fixes for plone.app.widgets 2.1.
[thet]
- remove deprecated __of__ for browserviews
[pbauer]
2.2 (2017-01-02)
----------------
Breaking changes:
- Test fixes for plone.app.widgets 2.1.
While this is not a breaking change functionality or API wise, the tests do only pass with plone.app.widgets 2.1.
[thet]
Bug fixes:
- Fix RelatedItemsDataConverter with relation lists, where in an iteration a wrong value was checked to be existent.
Fixes failures in situations, where a ``None`` value was part of the relation list.
[thet]
- Fix RelatedItemsDataConverter with choice lists, where choices are UUID
strings of selected relations, but conversion failed, because Choice
field has None as its value_type
[datakurre]
2.1.2 (2016-12-02)
------------------
Bug fixes:
- Remove ZopeTestCase.
[ivanteoh, maurits]
- In select widget, accept items as property or method.
This avoids breaking on some z3c.form versions.
See https://github.com/zopefoundation/z3c.form/issues/44
[maurits]
2.1.1 (2016-09-16)
------------------
Bug fixes:
- Enable unload protection by using pattern class ``pat-formunloadalert`` instead ``enableUnloadProtection``.
[thet]
2.1 (2016-08-12)
----------------
New features:
- Related items data converter supports explicit value_type specified in
field when using collections of UUID values. This is backward-compatible
with previous conversion to field values, supports str/unicode value(s),
whichever is specified by field.
[seanupton]
- Support functions as values in the ``pattern_options`` dictionary, which gets then serialized to JSON.
Before that, walk recursively through ``pattern_options`` and call all functions with the widgets context.
This allows for context-specific, runtime evaluated pattern option values.
[thet]
- Don't overwrite widget default css classes when rendering pattern widgets.
This allows setting a css class via the ``klass`` keyword in plone.autoform widget directives.
[thet]
2.0.0 (2016-04-29)
------------------
Incompatibilities:
- Deprecated "plone.app.z3cform.object" and moved to
"plone.app.z3cform.objectsubform" in order to avoid built in names
as module names, which may result in difficult to debug errors.
[jensens]
- Made existing soft deprecation (by comment) of plone.app.z3cform.layout
explicit by deprecating using zope.deferredimport.
[jensens]
- removed plone.app.z3cform.queryselect since this was deprecated already
and removal planned (!) already for Plone 4.1
[jensens]
New:
- make widget available to wysiwyg_support template
[gotcha]
Fixes:
- Reduce dependency on plone.app.widgets in tests.
[thet]
- Enhance test in order to show problem in RelatedItemsWidget with
navigation-roots
[jensens]
- Cleanup: pep8, uth8-headers, zca-decorators, ...
[jensens]
1.2.0 (2016-02-25)
------------------
New:
- Add metal slot for inserting stuff below fields
[fredvd]
Fixes:
- Fix ajax selection for add forms
[tomgross]
- Use doctest instead of zope.testing.doctest
[pbauer]
- Fix related items widget tests to include root path support.
Fix options merging for TinyMCE widget.
[alecm]
- Fixed test for plone.app.widgets.
[Gagaro]
- Used assertDictEqual instead of assertEqual for RelatedItemsWidgetTests.test_widget
[Gagaro]
1.1.8 (2016-01-08)
------------------
Fixes:
- Fixed tests for newer CMFPlone. [Gagaro, ebrehault, vangheem]
1.1.7 (2015-11-26)
------------------
Fixes:
- Don't allow adding new terms in the AjaxAutocompleteWidget
when it's used with a Choice field.
[davisagli]
- Remove installation of plone.app.widgets default profile. In Plone 5 with
plone.app.widgets >= 2.0, the profile is only a dummy profile for BBB
compatibility.
[thet]
1.1.6 (2015-10-27)
------------------
Fixes:
- Check if user can add keywords for AjaxSelectWidget.
[Gagaro]
1.1.5 (2015-09-20)
------------------
- Don't check portal_registry for default_charset, we only accept
utf-8.
[esteele]
- Allow time options to be customized for DatetimeWidget.
[thet]
- Wrap context to allow tools to be found in text widget.
[cguardia]
1.1.4 (2015-09-16)
------------------
- Remove unittest2 dependency.
[gforcada]
1.1.3 (2015-07-18)
------------------
- Also mock getToolByName for some tests.
[vangheem]
1.1.2 (2015-05-11)
------------------
- grab selected editor from user
[vangheem]
1.1.1 (2015-05-04)
------------------
- Use the more specific browser layer ``IPloneFormLayer`` for adapter
registrations. This avoids double registration errors.
[thet]
1.1.0 (2015-03-21)
------------------
- Integrate plone.app.widgets.
[vangheem]
1.0.2 (unreleased)
------------------
- Fix inline-validation warning error
[jbirdwell]
1.0.1 (2014-10-23)
------------------
- Handle an error where group.__name__ being None caused fieldsets to be given
the id 'fieldset-none', which causes issues the inline validation.
[esteele]
1.0 (2014-02-26)
----------------
- Remove dependency on collective.z3cform.datetimewidget and instead use
plone.app.widgets.
[garbas, thet]
0.7.6 (2014-01-27)
------------------
- Translate fieldset labels correctly.
[maurits]
- We can add enable_unload_protection = False on a Form to disable unload protection.
[thomasdesvenain]
- Add '.empty' css class to fields that have no value.
[cedricmessiant]
- Indicate 'error' status when reporting errors from group forms.
[davisagli]
- Replace deprecated test assert statements.
[timo]
- Solve #13567: InlineValidation broken for MultiWidget.
[sunew]
0.7.5 (2013-10-09)
------------------
- Fix an issue with the inline validator, KSS was giving values for
fieldset attr than can't be converted to an integer.
[jpgimenez]
- Inline validation supports fieldset names instead of integer-indexed naming.
[seanupton]
- Use group __name__, not label value to have stable fieldset_name used in
DOM id, and for inline validation.
[seanupton]
- Inline validation robustness if no field name is passed by client request.
[seanupton]
- Support for IDict in the MultiWidget. Makes it compatible with z3c.form 3.0 (released 2013-06-24)
[djay]
- Give fieldset legends ids based on their name, for compatibility with
Archetypes.
[davisagli]
- Fixed checkbox inline validation.
[kroman0]
0.7.4 (2013-08-13)
------------------
- Display 'required' span only on input mode.
[cedricmessiant]
0.7.3 (2013-05-23)
------------------
- Added possibility to use z3c.form's ContentProviders [gbastien, jfroche, gotcha]
0.7.2 (2013-03-05)
------------------
- Add a macro and slot to the @@ploneform-render-widget templates
so it's possible to override the widget rendering without
changing the markup surrounding it.
[davisagli]
- Restored support for contents without acquisition chain
[keul]
0.7.1 (2013-01-01)
------------------
- Overrode ObjectSubForm for IObject field in order to provide get_closest_content
method. Now it is possible to guess the closest content from a Multiwidget subform.
[gborelli]
- Added utils.closest_content from plone.formwidget.contenttree.utils
[gborelli]
- Primarily use form name for 'kssattr-formname' form attribute.
[vipod]
- Rename the 'fieldset.current' hidden input to 'fieldset' for consistency
with Archetypes.
[davisagli]
0.7.0 (2012-10-16)
------------------
- Support inline validation without depending on KSS.
[davisagli]
- Fix a case where the widget broke if its form's content was a dict.
[davisagli]
0.6.1 (2012-08-30)
------------------
- Fix the single checkbox widget to cope with widgets with a __call__ method.
[davisagli]
0.6.0 (2012-05-25)
------------------
- Remove hard-coded ■ (box) markers from required labels to match
changes made in sunburst/public.css and archetypes. Fixes double required
markers in Plone 4.2rc1.
- Pull form help inside label tag and make it a span rather than a div. The
purpose is to improve accessibility by making the semantic connection between
label and help. Related to http://dev.plone.org/ticket/7212
- Use ViewPageTemplateFile from zope.browserpage.
[hannosch]
0.5.8 (2012-05-07)
------------------
- Prevent empty error divs from being generated if errors are already associated
with a field.
[davidjb]
0.5.7 - 2011-11-26
------------------
- Corrected formatting for errors on the FieldWidgets object (i.e. from
invariants). This closes http://code.google.com/p/dexterity/issues/detail?id=238
[davisagli]
- Added the ``i18n:domain`` attribute in the first ``div`` of ``widget.pt`` in order to make the
"required" tooltip translatable. Fixes http://dev.plone.org/plone/ticket/12209
[rafaelbco]
0.5.6 - 2011-06-30
------------------
- Make sure group errors get styled like field errors.
[davisagli]
- Include group and field descriptions as structure.
[davisagli]
0.5.5 - 2011-06-26
------------------
- Make it possible to add a custom CSS class to a form by setting its
``css_class`` attribute.
[davisagli]
- Match plone.z3cform's template in including the form description as
structure.
[davisagli]
0.5.4 - 2011-05-04
------------------
- Customize templates for multi and object widgets for more consistent styling.
[elro]
- Remove dependency on zope.app.component.
[davisagli]
- Add MANIFEST.in.
[WouterVH]
- Raise LookupError when terms are not found (e.g. they are no longer visible due to security)
[lentinj]
0.5.3 - 2011-01-22
------------------
- Fix test setup in Zope 2.10.
[davisagli]
0.5.2 - 2011-01-18
------------------
- Don't use collective.testcaselayer based IntegrationTestLayer as it leads to
PicklingError on Plone 4.1.
[elro]
- Change inline validation to match archetypes behavior - add a warning class and
omit the error message.
[elro]
0.5.1 - 2010-11-02
------------------
- Make sure form.extractData() does not raise an AttributeError if the method is
called before the form is available (first page load).
[timo]
- This package now uses the plone i18n domain.
[vincentfretin]
- Added option to override <form action="">.
[miohtama]
- Updated README regarding form action and method.
[miohtama]
0.5.0 - 2010-04-20
------------------
- Render errors from group form widget manager validators. Fixes
http://code.google.com/p/dexterity/issues/detail?id=96
[davisagli]
- Default to showing the default fieldset, rather than the first non-default
fieldset.
[davisagli]
- Replace the required field indicator image with a unicode box, refs
http://dev.plone.org/plone/ticket/10352
[davisagli, limi]
- Replaced the existing radiobutton-based boolean widget with the standard
single checkbox Plone version.
[limi]
- Add @@ploneform-render-widget view, so that the widget chrome can be
customized for particular widget types.
[davisagli]
- Added slots to the ``titlelessform`` macro. See ``README.txt`` in
``plone.z3cform`` for details.
[optilude, davisagli]
- Cleaned up templates to match Plone 4 conventions.
[optilude]
- Made templates and inline validation work with standalone forms as supported
by plone.z3cform 0.6 and later.
[optilude]
- Installed a browser layer IPloneFormLayer with this package's extension
profile. This inherits from z3c.form's IFormLayer, allowing the default
widgets to work. You should always install this package in
portal_quickinstaller before using z3c.form forms in Plone.
[optilude]
- Made the textlines widget the default for sequence types with text/ascii
line value types. The default widget from z3c.form is too confusing.
[optilude]
- Use form method defined in form class. This allows HTTP GET forms.
Before method was hardcoded to "post" in the template. [miohtama]
0.4.9 - 2010-01-08
------------------
- Remove unused (and broken on Plone 4) lookup of the current user's WYSIWYG
editor preference. The wysiwyg_support template does this for us.
[davisagli]
0.4.8 - 2009-10-23
------------------
- Made the KSS validator use publish traversal instead of OFS traversal to find
the form. This makes it usable with forms reached by custom IPublishTraverse
adapters.
[davisagli]
- Added enable_form_tabbing option to not transform fieldsets into tabs.
[vincentfretin]
- Added an id to the generated form.
[vincentfretin]
- Fixed issue in macros.pt: fieldset.current hidden input was never generated.
[vincentfretin]
0.4.7 - 2009-09-25
------------------
- Set plone i18n domain for "Info" and "Error" messages in macros.pt so they are translated.
[vincentfretin]
0.4.6 - 2009-07-26
------------------
- Include plone.z3cform's overrides.zcml from our own overrides.zcml.
[optilude]
- Updated to collective.z3cform.datetimewidget>=0.1a2 to fix a ZCML conflict
with z3c.form.
[davisagli]
0.4.5 - 2009-05-25
------------------
- Made the KSS form support conditional on both kss.core and Archetypes being
installed.
[hannosch]
- Use the date/time widgets from collective.z3cform.datetimewidget as the default
widget for Date and Datetime fields.
[davisagli]
0.4.4 - 2009-05-03
------------------
- Made the KSS validator use traversal instead of getMultiAdapter() to find
the form. This makes it work on add forms.
See http://code.google.com/p/dexterity/issues/detail?id=27
[optilude]
0.4.3 - 2009-04-17
------------------
- Added a display template for the WYSIWYG widget.
[optilude]
- Make the ?fieldset.current query string variable work. Set it to the id
of a fieldset other than default to pre-select a different fieldset, e.g.
.../@@formview?fieldset.current=3
[optilude]
- Hide the 'default' fieldset if there's nothing to show there.
[optilude]
- Provide 'portal' variable in wysiwyg template, as its used by some editors.
[davisagli]
0.4.2 - 2008-09-04
------------------
- Make the WYSIWYG widget work also for non-Acquisition wrapped
content.
0.4.1 - 2008-08-21
------------------
- Removed maximum version dependency on zope.component. This should be left
to indexes, known good sets or explicit version requirements in buildouts.
If you work with zope.component >= 3.5 you will also need five.lsm >= 0.4.
[hannosch]
- Make use of new plone.z3cform support for looking up the layout template by
adapter. This means that forms now no longer need to depend on
plone.app.z3cform unless they want to use Plone-specific widgets.
0.4.0 - 2008-07-31
------------------
- Add inline validation support with KSS
- Require zope.component <= 3.4.0 to prevent compatibility issues with
five.localsitemanager, of which a buggy version (0.3) is pinned by
plone.recipe.plone 3.1.4. Upgrade to this version if you're seeing::
...
Module five.localsitemanager.registry, line 176, in registeredUtilities
ValueError: too many values to unpack
0.3.2 - 2008-07-25
------------------
- Fixed a bug in macros.pt where 'has_groups' and 'show_default_label'
for fieldsets were set in the 'form' macro, rendering the 'field'
macro unusable by itself.
0.3.1 - 2008-07-24
------------------
- Fixed a bug where we would use the form macros defined in
plone.z3cform instead of our own.
0.3 - 2008-07-24
----------------
- Create this package from Plone-specific bits that have been factored
out of plone.z3cform.
Raw data
{
"_id": null,
"home_page": "https://pypi.org/project/plone.app.z3cform",
"name": "plone.app.z3cform",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "zope plone form widget template",
"author": "Plone Foundation",
"author_email": "plone-developers@lists.sourceforge.net",
"download_url": "https://files.pythonhosted.org/packages/08/5f/7fd68a471c6316b6093ad0d46bdcb26969446547b3f0ec0a1821e31815bc/plone_app_z3cform-4.7.1.tar.gz",
"platform": null,
"description": "=================\nplone.app.z3cform\n=================\n\nA Plone specific integration and HTML mark-up for z3c.form.\n\nThis is a Plone core package.\n\n.. contents:: Table of Contents\n\nIntroduction\n==============\n\nThis Plone package is aimed for developers who want to create forms in Python code.\n\nPlease read the documentation for `z3c.form`_, which contains important information about using z3c.form in Zope 2 in general. \nFor the most part, that package contains the \"active\" parts that you need to know about, and this package provides \"passive\" overrides that make the forms integrate with Plone.\n\nFeatures\n========\n\nThe following Plone and z3c.form integration is added\n\n* Plone *main_template.pt* integration\n* Plone specific widget frame\n* Date/time pickers\n* WYSIWYG widget (TinyMCE visual editor with Plone support)\n* CRUD forms\n\nOut of the box form templates\n=============================\n\nThe form and widget templates are applied in the following order\n\n* *plone.app.z3cform* specific\n* *plone.z3cform* specific\n* *z3c.form* specific\n\n*plone.app.z3cform* package overrides the ``@@ploneform-macros`` view from `plone.z3cform`_, using standard Plone markup for form fields, fieldsets, etc.\n\nAll the macros described in `plone.z3cform`_ are still available. \nIn addition, you can use the ``widget_rendering`` macro to render all the default widgets, but none of the fieldsets (groups) or the fieldset headers (which would be rendered with the ``fields`` macro).\n\nEach widget is rendered using the ``@@ploneform-render-widget`` view, which by default includes the widget's label, required indicator, description, errors, and the result of ``widget.render()``. \nThis view may be overridden for particular widget types in order to customize this widget chrome.\n\nCustomizing form behavior\n=========================\n\nForm method\n-----------\n\nIf your form instance defines a property called ``method`` it allows you to set whether form is HTTP POST or HTTP GET. \nThe default is POST. \nThis translates to ``<form method=\"post\">`` attribute.\n\nExample::\n\n class HolidayServiceSearchForm(form.Form):\n \"\"\" Example search form of which results can be bookmarked.\n\n Bookmarking is possible because we use HTTP GET method.\n \"\"\"\n\n method = \"get\"\n\nForm action\n-----------\n\nForm ``action`` property defines HTTP target where the form is posted. \nThe default is the same page where the form was rendered, ``request.getURL()``.\n\nExample::\n\n class HolidayServiceSearchForm(form.Form):\n\n def action(self):\n \"\"\" Redefine <form action=''> attribute.\n\n We use URL fragment to define the <a> anchor\n were we directly scroll at the results when the form is posted,\n skipping unnecessary form fields part. The user can scroll\n back there if he/she wants modify the parameters.\n \"\"\"\n\n # Context item URL + form view name + link fragment.\n # This works for HTTP GET forms only.\n # Note that we cannot use request.getURL() as it might contain\n # 1) prior fragment 2) GET query parameters messing up the UrL\n return self.context.absolute_url() + \"/holidayservice_view\" + \"#searched\"\n\nFieldsets and tabs\n------------------\n\nYou can fieldsets to your form if you subclass the form from z3c.form.group.GroupForm.\nThe default behavior of Plone is to turn these fieldsets to tabs \n(as seen on any *Edit* view of content item).\n\nYou can disable this behavior for your form::\n\n class ReportForm(z3c.form.group.GroupForm, z3c.form.form.Form):\n\n # Disable turn fieldsets to tabs behavior\n enable_form_tabbing = False\n\nUnload protection\n-----------------\n\nThe default behaviour on Plone is to add a confirm box if you leave a form you have modified without having submitted it.\n\nYou can disable this behavior for your form::\n\n class SearchForm(z3c.form.group.GroupForm, z3c.form.form.Form):\n\n # Disable unload protection behavior\n enable_unload_protection = False\n\nAutofocus\n---------\n\nThe default behaviour on Plone Forms is to use the formautofocus pattern to focus the \"first\" input field.\n\nYou can disable this behavior for your form::\n\n class SearchForm(z3c.form.group.GroupForm, z3c.form.form.Form):\n\n # Disable autofocus behavior\n enable_autofocus = False\n\n\n\nCSRF Protection\n===============\n\nA common vulnerability affecting web forms is cross-site request forgery (CSRF).\nThis attack occurs when the user of your site visits a third-party site that uses Javascript to post to a URL on your site without the user's knowledge, taking advantage of the user's active session.\n\nplone.app.z3cform can protect against this type of attack by adding a unique token as a hidden input when rendering the form, and checking to make sure it is present as a request parameter when form actions are executed.\n\nTo turn on this protection, enable the form's enableCSRFProtection attribute.\nExample::\n\n class PasswordForm(form.Form):\n \"\"\"Form to set the user's password.\"\"\"\n enableCSRFProtection = True\n\nForm main template override\n===========================\n\nForms are framed by *FormWrapper* views. \nIt places rendered form inside Plone page frame. \nThe default *FormWrapper* is supplied automatically, but you can override it.\n\nBelow is a placeholder example with few `<select>` inputs.\n\nExample ``reporter.py``::\n\n from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile as FiveViewPageTemplateFile\n from zope.i18nmessageid import MessageFactory\n from zope.schema.vocabulary import SimpleTerm\n from zope.schema.vocabulary import SimpleVocabulary\n\n import plone.app.z3cform\n import plone.z3cform.templates\n import z3c.form\n import zope.interface\n import zope.schema\n\n _ = MessageFactory('your.addon')\n\n\n def make_terms(items):\n \"\"\" Create zope.schema terms for vocab from tuples \"\"\"\n terms = [SimpleTerm(value=pair[0], token=pair[0], title=pair[1]) for pair in items]\n return terms\n\n\n output_type_vocab = SimpleVocabulary(make_terms([(\"list\", \"Patient list\"), (\"summary\", \"Summary\")]))\n\n\n class IReportSchema(zope.interface.Interface):\n \"\"\" Define reporter form fields \"\"\"\n outputType = zope.schema.Choice(\n title=u\"Output type\",\n description=u\"How do you want the output\",\n source=output_type_vocab)\n\n country = zope.schema.Choice(\n title=u\"Country\",\n required=False,\n description=u\"Which country to report\",\n vocabulary=\"allowed_countries\")\n\n hospital = zope.schema.Choice(\n title=u\"Hospital\",\n required=False,\n description=u\"Which hospital to report\",\n vocabulary=\"allowed_hospitals\")\n\n\n class ReportForm(z3c.form.form.Form):\n \"\"\" A form to output a HTML report from chosen parameters \"\"\"\n\n fields = z3c.form.field.Fields(IReportSchema)\n\n ignoreContext = True\n\n output = None\n\n @z3c.form.button.buttonAndHandler(_('Make Report'), name='report')\n def report(self, action):\n data, errors = self.extractData()\n if errors:\n self.status = \"Please correct errors\"\n return\n\n # Create sample item which we can consume in the page template\n self.output = dict(country=\"foobar\")\n\n self.status = _(u\"Report complete\")\n\n\n # IF you want to customize form frame you need to make a custom FormWrapper view around it\n # (default plone.z3cform.layout.FormWrapper is supplied automatically with form.py templates)\n report_form_frame = plone.z3cform.layout.wrap_form(ReportForm, index=FiveViewPageTemplateFile(\"templates/reporter.pt\"))\n\nExample ``configure.zcml``::\n\n <configure\n xmlns=\"http://namespaces.zope.org/zope\"\n xmlns:browser=\"http://namespaces.zope.org/browser\"\n i18n_domain=\"your.addon\">\n\n <browser:page\n for=\"*\"\n name=\"reporter\"\n class=\".reporter.report_form_frame\"\n permission=\"zope2.View\"\n />\n\n </configure>\n\n\nExample ``templates/reporter.html``::\n\n <html metal:use-macro=\"context/main_template/macros/master\"\n i18n:domain=\"sits.reporttool\">\n <body>\n <metal:block fill-slot=\"main\">\n\n <h1 class=\"documentFirstHeading\" tal:content=\"view/label | nothing\" />\n\n <div id=\"content-core\">\n <div id=\"form-input\">\n <span tal:replace=\"structure view/contents\" />\n </div>\n <div id=\"form-output\" tal:condition=\"view/form_instance/output\">\n Chosen country: <b tal:content=\"view/form_instance/output/country\" />\n </div>\n </div>\n\n </metal:block>\n </body>\n </html>\n\nWidget frame override\n=====================\n\nYou can override widget templates as instructed for ``z3c.form``.\n``plone.app.z3cform`` renders `a frame around each widget <https://github.com/plone/plone.app.z3cform/blob/master/plone/app/z3cform/templates/widget.pt>`_\nwhich usually consists of\n\n* Label\n* Required marker\n* Description\n\nYou might want to customize this widget frame for your own form.\nBelow is an example how to do it.\n\nCopy `widget.pt <https://github.com/plone/plone.app.z3cform/blob/master/plone/app/z3cform/templates/widget.pt>`_ to your own package and customize it in way you wish\n\nAdd the following to ``configure.zcml``\n\n::\n\n <browser:page\n name=\"ploneform-render-widget\"\n for=\".demo.IDemoWidget\"\n class=\"plone.app.z3cform.templates.RenderWidget\"\n permission=\"zope.Public\"\n template=\"demo-widget.pt\"\n />\n\nCreate a new marker interface in Python code\n\n::\n\n from zope.interface import Interface\n\n class IDemoWidget(Interface):\n pass\n\nThen apply this marker interface to all of your widgets in ``form.update()``\n\n::\n\n from zope.interface import alsoProvides\n\n class MyForm(...):\n ...\n def update(self):\n super(MyForm, self).update()\n for widget in form.widgets.values():\n alsoProvides(widget, IDemoWidget)\n\nHide fields that have no value\n==============================\n\nThe ``.empty`` css class marks the fields that have no value. \nIf you don't want to display these fields in view mode, add the following css in your theme.\n\n::\n\n .template-view .empty.field {\n display: none;\n }\n\n\nAdd additional parameters to widgets\n====================================\n\nYou can add additional parameters to widgets defined in this package via the `plone.autoform.widgets.ParameterizedWidget`. \n\n::\n\n from plone.app.z3c.form.widget import DateWidget\n MyDateWidget = ParameterizedWidget(DateWidget, wrapper_css_class='event_start')\n\n\nor via directives \n\n::\n\n from plone.app.z3c.form.widget import DateWidget\n\n\n @provider(IFormFieldProvider)\n class IMyEventBehavior(model.Schema):\n\n ...\n widget('event_start', DateWidget, wrapper_css_class='event_start')\n event_start = schema.TextLine(\n title=_(u'label_event_start'),\n description=_(u'help_event_start'),\n required=True,\n )\n\n\nTesting\n=======\n\nTo test ``plone.app.z3form`` it is recommended to use `plone.app.testing <https://pypi.python.org/pypi/plone.app.testing/>`_ function test layer which will do ``plone.app.z3cform`` setup for you.\nRead ``plone.app.z3cform`` manual for further instructions.\n\nIf you still need to test forms on lower level in unit tests you need to enable ``plone.app.z3cform`` support manually.\nBelow is an example::\n\n import unittest\n\n from zope.interface import alsoProvides\n from zope.publisher.browser import setDefaultSkin\n\n from z3c.form.interfaces import IFormLayer\n\n class TestFilteringIntegration(unittest.TestCase):\n \"\"\" Test that filtering options work on the form \"\"\"\n\n layer = MY_TEST_LAYER_WITH_PLONE\n\n def setUp(self):\n super(TestFilteringIntegration, self).setUp()\n request = self.layer[\"request\"]\n setDefaultSkin(request)\n alsoProvides(request, IFormLayer) #suitable for testing z3c.form views\n\n def test_report_form_filtering(self):\n reporter = ReportForm(self.layer[\"portal\"], self.layer[\"request\"])\n reporter.update()\n\n\n\nTroubleshooting\n===============\n\nHere are some common errors you might encounter with plone.app.z3cform.\n\nComponentLookupError in updateWidgets()\n---------------------------------------\n\n::\n\n Traceback (innermost last):\n Module ZPublisher.Publish, line 119, in publish\n Module ZPublisher.mapply, line 88, in mapply\n Module ZPublisher.Publish, line 42, in call_object\n Module plone.z3cform.layout, line 64, in __call__\n Module plone.z3cform.layout, line 54, in update\n Module getpaid.expercash.browser.views, line 63, in update\n Module z3c.form.form, line 208, in update\n Module z3c.form.form, line 149, in update\n Module z3c.form.form, line 128, in updateWidgets\n Module zope.component._api, line 103, in getMultiAdapter\n ComponentLookupError: ((<getpaid.expercash.browser.views.CheckoutForm object at 0xdb052ac>, <HTTPRequest, URL=http://localhost:8080/test/@@getpaid-checkout-wizard>, <PloneSite at /test>), <InterfaceClass z3c.form.interfaces.IWidgets>, u'')\n\nplone.app.z3cform layers are not in place (configuration ZCML is not read). \nYou probably forgot to include plone.app.z3cform in your product's configuration.zcml. See *Installation* above.\n\n\n.. _z3c.form: http://pypi.python.org/pypi/z3c.form\n.. _Plone: http://plone.org\n.. _plone.z3cform: http://pypi.python.org/pypi/plone.z3cform\n\nInline validation\n=================\n\nFirst, let's set up some infrastructure:\n\n >>> from zope.interface import alsoProvides\n >>> from plone.testing.zope import makeTestRequest\n >>> from zope.annotation.interfaces import IAttributeAnnotatable\n >>> from z3c.form.interfaces import IFormLayer\n\n >>> app = layer['app']\n >>> def make_request(form=None, lang='en'):\n ... request = makeTestRequest({'HTTP_ACCEPT_LANGUAGE': lang})\n ... if form is None:\n ... form = {}\n ... request.form.update(form)\n ... alsoProvides(request, IFormLayer)\n ... alsoProvides(request, IAttributeAnnotatable)\n ... return request\n\nThen we create a simple z3c form\n\n >>> from zope import interface, schema\n >>> from z3c.form import form, field, button\n >>> from plone.z3cform.layout import FormWrapper\n\n >>> class MySchema(interface.Interface):\n ... age = schema.Int(title=u\"Age\")\n\n >>> from __future__ import print_function\n >>> class MyForm(form.Form):\n ... fields = field.Fields(MySchema)\n ... ignoreContext = True # don't use context to get widget data\n ...\n ... @button.buttonAndHandler(u'Apply')\n ... def handleApply(self, action):\n ... data, errors = self.extractData()\n ... print(data['age']) # ... or do stuff\n\n >>> class MyFormWrapper(FormWrapper):\n ... form = MyForm\n ... label = u\"Please enter your age\"\n\n >>> from zope.component import provideAdapter\n >>> from zope.publisher.interfaces.browser import IBrowserRequest\n >>> from zope.interface import Interface\n\n >>> provideAdapter(adapts=(Interface, IBrowserRequest),\n ... provides=Interface,\n ... factory=MyFormWrapper,\n ... name=u\"test-form\")\n\nLet's verify that worked:\n\n >>> from zope.component import getMultiAdapter\n >>> from zope.interface import Interface, implementer\n >>> from Acquisition import Implicit\n >>> @implementer(Interface)\n ... class Bar(Implicit):\n ... def restrictedTraverse(self, name):\n ... # fake traversal to the form\n ... if name.startswith('@@'):\n ... return getMultiAdapter((self, self._REQUEST), Interface, name[2:])\n ... else:\n ... return getattr(self, name)\n ...\n >>> context = Bar()\n >>> request = make_request()\n >>> context._REQUEST = request # evil test fake\n >>> formWrapper = getMultiAdapter((context, request), name=u\"test-form\")\n >>> formWrapper\n <Products.Five...MyFormWrapper object ...>\n >>> formWrapper.form\n <class 'plone.app.z3cform.tests.example.MyForm'>\n\n >>> del context, request\n\nInline validation\n-----------------\n\nInline validation is invoked via the @@z3cform_validate_field view.\n\n >>> context = Bar()\n >>> request = make_request(form={'form.widgets.age': 'Title'})\n >>> context._REQUEST = request\n >>> form = MyForm(context, request)\n >>> z3cform_validate_field = getMultiAdapter((form, request), name=u\"z3cform_validate_field\")\n\nThis is wired up with jQuery. When the user leaves a form control with inline\nvalidation enabled, it will be called with the following parameters:\n\n >>> z3cform_validate_field(fname=u'form.widgets.age')\n '{\"errmsg\": \"The entered value is not a valid integer literal.\"}'\n\n >>> request = make_request(form={'form.widgets.age': '20'})\n >>> context._REQUEST = request\n >>> form = MyForm(context, request)\n >>> z3cform_validate_field = getMultiAdapter((form, request), name=u\"z3cform_validate_field\")\n >>> z3cform_validate_field(fname=u'form.widgets.age')\n '{\"errmsg\": \"\"}'\n\nIf the field name (fname) is not provided by the client, the validation\nshould return without issue:\n\n >>> z3cform_validate_field()\n '{\"errmsg\": \"\"}'\n >>> z3cform_validate_field(fname=None)\n '{\"errmsg\": \"\"}'\n\nInline validation with groups\n-----------------------------\n\nWe use plone.app.z3cform.tests.example.MyGroupFormWrapper and validate the\nfield 'name' that's part of a group. Inline validation is invoked via the\n@@z3cform_validate_field view.\n\n >>> request = make_request(form={'form.widgets.name': ''})\n >>> context._REQUEST = request\n >>> from plone.app.z3cform.tests.example import MyGroupFormWrapper\n >>> form = MyGroupFormWrapper(context, request)\n >>> z3cform_validate_field = getMultiAdapter((form, request), name=u\"z3cform_validate_field\")\n\nThe validation view takes an Attribute fset with ether the numeric index or\nthe name of the group.\n\n >>> z3cform_validate_field(fname=u'form.widgets.name', fset=\"0\")\n '{\"errmsg\": \"Required input is missing.\"}'\n >>> z3cform_validate_field(fname=u'form.widgets.name', fset=\"mygroup\")\n '{\"errmsg\": \"Required input is missing.\"}'\n\n >>> request = make_request(form={'form.widgets.name': u'Name'})\n >>> context._REQUEST = request\n >>> form = MyGroupFormWrapper(context, request)\n >>> z3cform_validate_field = getMultiAdapter((form, request), name=u\"z3cform_validate_field\")\n >>> z3cform_validate_field(fname=u'form.widgets.name', fset=\"0\")\n '{\"errmsg\": \"\"}'\n >>> z3cform_validate_field(fname=u'form.widgets.name', fset=\"mygroup\")\n '{\"errmsg\": \"\"}'\n\n\nInline-Validation and Translation of ErrorSnippets\n--------------------------------------------------\n\nWe use plone.app.z3cform.tests.example.MyGroupFormWrapper and validate the\nfield 'name' that's part of a group. Inline validation is invoked via the\n@@z3cform_validate_field view.\n\n >>> request = make_request(form={'form.widgets.name': ''}, lang='de',)\n >>> context._REQUEST = request\n >>> form = MyGroupFormWrapper(context, request)\n >>> z3cform_validate_field = getMultiAdapter((form, request), name=u\"z3cform_validate_field\")\n\nThe validation view takes an Attribute fieldset with the index of the group.\nThe error is only shown when warning_only is explicitly switched off (matching\nthe behavior of archetypes.)\n\n >>> z3cform_validate_field(fname=u'form.widgets.name', fset=\"0\")\n '{\"errmsg\": \"Erforderliche Eingabe fehlt.\"}'\n\n\nForms embedded inside normal views\n-----------------------------------\n\nIt's possible to embed z3c.form Forms inside a normal BrowserView via viewlets,\nportlets or tiles.\n\nCurrently the name of the form to be validated is gotten from the URL. For embedded\nforms this can't work since the URL only has the containing view's name.\n\nUntil a lasting solution is found, we just make sure that validation\ndoesn't raise an exception if it receives a normal browerview as the supposed\nform.\n\n >>> from zope.publisher.browser import BrowserView\n >>> class MyNormalView(BrowserView):\n ... \"\"\" \"\"\"\n\n >>> provideAdapter(adapts=(Interface, IBrowserRequest),\n ... provides=Interface,\n ... factory=MyNormalView,\n ... name=u\"my-view\")\n\nLet's verify that it gets called...\n\n >>> context = Bar()\n >>> request = make_request()\n >>> view = getMultiAdapter((context, request), name=u\"my-view\")\n >>> view\n <MyNormalView object ...>\n\nInline validation is invoked via the @@z3cform_validate_field view. But\nin this case no validation output should be returned.\n\n >>> context = Bar()\n >>> request = make_request(form={'form.widgets.age': 'Title'})\n >>> z3cform_validate_field = getMultiAdapter((view, request), name=u\"z3cform_validate_field\")\n >>> z3cform_validate_field(fname=u'form.widgets.age')\n '{\"errmsg\": \"\"}'\n\nChangelog\n=========\n\n.. You should *NOT* be adding new change log entries to this file.\n You should create a file in the news directory instead.\n For helpful instructions, please see:\n https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst\n\n.. towncrier release notes start\n\n4.7.1 (2024-11-25)\n------------------\n\nBug fixes:\n\n\n- Fix pattern options for `LinkWidget`.\n [petschki] (#213)\n\n\n4.7.0 (2024-09-24)\n------------------\n\nNew features:\n\n\n- Implement new `ContentBrowserWidget` for `pat-contentbrowser` pattern.\n\n The deprecated `RelatedItemsWidget` and `pat-relateditems` pattern is still available\n and imports should not break. But the default widget and converter adapter registration for\n z3c.relationfield is changed to the new widget.\n\n Since `plone.app.relationfield` defines the widget with `plone.autoform` schema\n hints nothing changes until the package is updated to the new widget.\n [petschki] (#197)\n\n\n4.6.1 (2024-05-30)\n------------------\n\nInternal:\n\n\n- Date/time widget: Fix data converter adaption.\n Get the data converter for the date and datetime widgets via adaption and remove the _converter attribute hack.\n This aligns the code to z3c.form standards and allows to override the data converter which was previously not easily possible.\n [thet] (#204)\n\n\n4.6.0 (2024-04-22)\n------------------\n\nNew features:\n\n\n- Use label_css_class attribute from widget if available in checkbox_input & radio_input\n [MrTango] (#202)\n\n\n4.5.0 (2024-03-19)\n------------------\n\nNew features:\n\n\n- Add support for the \"accept\" attribute on file inputs.\n\n If the widget's field - if there is one - has the \"accept\" attribute set (the\n `NamedImage` field has `image/*` set by default) then this is rendered as an\n `accept` attribute on the file input.\n\n This would restrict the allowed file types before uploading while still being\n checked on the server side.\n\n Fixes: https://github.com/plone/plone.formwidget.namedfile/issues/66\n Depends on:\n - https://github.com/plone/plone.namedfile/pull/158\n - https://github.com/plone/plone.formwidget.namedfile/pull/67\n [thet] (#198)\n\n\nBug fixes:\n\n\n- Fix `SelectFieldWidget` factory call.\n [petschki] (#192)\n\n\n4.4.1 (2024-02-27)\n------------------\n\nBug fixes:\n\n\n- Add missing ``pattern_options`` multiadapter to new PatternFormElement base class.\n [petschki] (#190)\n- Implement missing PasswordWidget adapter.\n [petschki] (#193)\n\n\n4.4.0 (2023-10-18)\n------------------\n\nNew features:\n\n\n- Add `row` container to enable column layouts for fields with `wrapper_css_class`.\n [petschki] (#158)\n- Implement new ``z3c.form`` extensible attributes feature and cleanup\n widget templates using Chameleon interpolation.\n [petschki] (#181)\n\n\nBug fixes:\n\n\n- Add missing widget configuration for `plone.schema.jsonfield.IJSONField`.\n [petschki] (#185)\n\n\n4.3.0 (2023-07-14)\n------------------\n\nNew features:\n\n\n- Introduce new Email-Widget which is used for `plone.schema.email.IEmail` fields.\n It uses the input type `email`.\n [jensens] (#173)\n\n\nBug fixes:\n\n\n- Fix OrdereSelectWidget browser validation when the input is required.\n [petschki] (#178)\n- Ignore form validation when `ignoreRequiredOnExtract` is set.\n [petschki] (#179)\n\n\nInternal:\n\n\n- Update configuration files.\n [plone devs] (cfffba8c)\n\n\n4.2.1 (2023-06-16)\n------------------\n\nBug fixes:\n\n\n- Add `required` to orderedselect widget.\n [petschki - original PR by szakitibi] (#170)\n\n\n4.2.0 (2023-05-22)\n------------------\n\nNew features:\n\n\n- Move storage utility to plone.namedfile\n to break a dependency cycle between the two.\n [gforcada] (#3764)\n\n\nBug fixes:\n\n\n- Remove invalid unicode control characters for `TextareaWidget`\n [petschki] (#167)\n\n\n4.1.0 (2023-04-26)\n------------------\n\nNew features:\n\n\n- Merge utils and base classes from ``plone.app.widgets`` and do not depend\n on it anymore. [petschki] (#19)\n\n\n4.0.3 (2023-04-14)\n------------------\n\nBug fixes:\n\n\n- Fixes transitive circular dependency to plone.schema.\n Inherit own Browserlayer from new intermediate browserlayer in plone.schema.\n [jensens] (#163)\n- Add ``test`` extra with the same contents as the ``tests`` extra.\n The ``tests`` extra will be removed in Plone 7.\n [maurits] (#164)\n\n\nInternal:\n\n\n- Update configuration files.\n [plone devs] (3b8337e6)\n\n\n4.0.2 (2023-03-23)\n------------------\n\nBug fixes:\n\n\n- Fix relative URLs validation in link widget\n [laulaz] (#160)\n\n\nInternal:\n\n\n- Update configuration files.\n [plone devs] (243ca9ec)\n\n\n4.0.1 (2023-01-26)\n------------------\n\nBug fixes:\n\n\n- Include ``required`` attribute for ``<textarea>`` fields.\n [frapell] (#156)\n\n\n4.0.0 (2022-11-30)\n------------------\n\nBug fixes:\n\n\n- Final release.\n [gforcada] (#600)\n\n\n4.0.0b1 (2022-08-30)\n--------------------\n\nNew features:\n\n\n- Add `default_time` attribute/argument to Date- and DatetimeWidget to allow the converter to set a custom time when nothing was given. [jensens] (#151)\n- Customizable DateWidget formatter length.\n [petschki] (#154)\n\n\nBug fixes:\n\n\n- Allow non-default fieldset labels to be translated\n [mtrebron] (#87)\n- Fix CSS classname for statusmessage.\n [petschki] (#149)\n- Leftovers of Py 2 removed (with pyupgrade and manual edits). then run black & isort.\n Do not depend on CMFPlone any longer (circular dependency), but on plone.base.\n [jensens] (#150)\n- Allow DateFieldWidget to be used on schema.datetime. See #151. [jensens] (#151)\n- Removed formatting hack for dates before 1900. \n This was fixed in Python 3.2. \n [jensens] (#152)\n\n\n4.0.0a10 (2022-05-24)\n---------------------\n\nBug fixes:\n\n\n- Re-enable form validation. [thet] (#147)\n\n\n4.0.0a9 (2022-04-04)\n--------------------\n\nNew features:\n\n\n- Use browser native date and datetime-local input\n together with patternslib date-picker\n [petschki] (#134)\n- Use better types for inputs.\n [thet] (#134)\n- Remove inlinevalidation from templates.\n [thet] (#134)\n- Implement TimeWidget which renders <input type=\"time\" />\n [petschki] (#134)\n- Use pat-validation in forms.\n [thet] (#134)\n\n\nBug fixes:\n\n\n- time widget supports 'name' and 'value' attributes now. [iham] (#134)\n- Register `AddView` to the correct browserlayer\n [petschki] (#142)\n\n\n4.0.0a8 (2022-03-23)\n--------------------\n\nNew features:\n\n\n- Fixed for latest z3c.form\n [petschki] (#146)\n\n\n4.0.0a7 (2022-03-09)\n--------------------\n\nBug fixes:\n\n\n- Add ``name`` attribute to form, if ``view.form_name`` is defined.\n See `easyform issue 325 <https://github.com/collective/collective.easyform/issues/325>`_.\n [maurits] (#325)\n\n\n4.0.0a6 (2022-01-19)\n--------------------\n\nBug fixes:\n\n\n- re-enable HTML rendering in form description\n [petschki] (#138)\n\n\n4.0.0a5 (2022-01-07)\n--------------------\n\nBug fixes:\n\n\n- Remove erroneous extra curly bracket in class name of the widget wrapper.\n [thet] (#136)\n\n\n4.0.0a4 (2021-11-26)\n--------------------\n\nNew features:\n\n\n- Enable multiple wysiwyg editors (use default editor registry setting) [duchenean, gotcha] (#45)\n- Enable formautofocus for Plone forms.\n Allow disabling for specific forms with ``enable_autofocus = False``.\n [jmevissen] (#135)\n\n\n4.0.0a3 (2021-10-13)\n--------------------\n\nBug fixes:\n\n\n- Fix form-error alert for BS5 (including invariants errors). [jensens] (#129)\n- Fix widget display mode for Bootstrap 5. [jensens] (#130)\n\n\n4.0.0a2 (2021-09-01)\n--------------------\n\nNew features:\n\n\n- Add support for more widget options when working with relation fields. (#125)\n\n\n4.0.0a1 (2021-04-21)\n--------------------\n\nBreaking changes:\n\n\n- Update form widget implementation for Plone 6 with Bootstrap markup\n [petschki, balavec, agitator] (#127)\n\n\nNew features:\n\n\n- - Added Exception for ValueError if value is (None,) and term_value can't be set [wkbkhard] (#121) (#121)\n\n\nBug fixes:\n\n\n- Clean up rst documentation titles, spacing, add .vscode and .idea to gitignore.\n [balavec] (#0)\n\n\n3.2.2 (2020-08-21)\n------------------\n\nBug fixes:\n\n\n- Fixed repeat syntax in multi input to also work in Zope 4.5.\n [maurits] (#116)\n\n\n3.2.1 (2020-06-30)\n------------------\n\nBug fixes:\n\n\n- Fix message type like Error not translated in add form.\n This closes https://github.com/plone/Products.CMFPlone/issues/3126\n [vincentfretin] (#115)\n\n\n3.2.0 (2020-04-20)\n------------------\n\nNew features:\n\n\n- Add display template for RelatedItemsWidget. No longer only render uuids.\n [pbauer] (#111)\n\n\n3.1.3 (2019-10-12)\n------------------\n\nBug fixes:\n\n\n- - Fix LinkWidget selected tab on edit #108\n [mamico] (#108)\n\n\n3.1.2 (2019-08-29)\n------------------\n\nBug fixes:\n\n\n- Fix wrong default for method attribute in pt\n [mamico] (#107)\n\n\n3.1.1 (2019-06-27)\n------------------\n\nBug fixes:\n\n\n- - Fixes: Keywords broken plone/Products.CMFPlone#2885\n [jensens] (#105)\n\n\n3.1.0 (2019-05-01)\n------------------\n\nNew features:\n\n- Add display template for AjaxSelectWidget showing the actual vocabularies term title.\n [jensens]\n\n- ``IFieldPermissionChecker`` was moved here from plone.app.widgets.\n [jensens]\n\nBug fixes:\n\n- Fixes AjaxSelectWidget to respect tokens different from values in vocabularies.\n This includes changes in both, the converter and the widget itself.\n A test was added too.\n ``get_ajaxselect_options`` from ``plone.app.widgets.utils`` is assimilated by the widget now too simplify the whole code,\n so the one in the other package is dead code now and will be deprecated there.\n [jensens]\n\n- LinkFieldWidget: added converter method toFieldValue [ksuess]\n\n\n3.0.9 (2019-01-08)\n------------------\n\nBug fixes:\n\n- a11y: added role attribute for portalMessage\n [nzambello]\n\n\n3.0.8 (2018-11-29)\n------------------\n\nNew features:\n\n- Add support for rendering <optgroup> elements from\n zope.schema.interfaces.ITreeVocabulary hierarchical terms.\n [rpatterson]\n\n\n3.0.7 (2018-11-07)\n------------------\n\nBug fixes:\n\n- Fix deprecation warning\n (https://github.com/plone/Products.CMFPlone/issues/2605) [ale-rt]\n\n\n3.0.6 (2018-09-27)\n------------------\n\nBug fixes:\n\n- Prepare for Python 2 / 3 compatibility\n [pbauer, MatthewWilkes, ale-rt]\n\n\n3.0.5 (2018-06-19)\n------------------\n\nBug fixes:\n\n- Cleanup code analysis problems.\n [jensens]\n\n- Fix SingleCheckBoxBoolWidget description to render structure\n [allusa]\n\n- Prepare for Python 2 / 3 compatibility\n [pbauer, MatthewWilkes, ale-rt]\n\n- Render mimetype selection box correctly for a ``RichTextWidget`` which also\n brings back the TinyMCE.\n [sallner]\n\n- Allow RelatedItems widget to be used in subforms\n [tomgross]\n\n3.0.4 (2018-02-04)\n------------------\n\nBug fixes:\n\n- Fix test failures from https://github.com/plone/plone.app.widgets/pull/177\n [thet]\n\n- Prepare for Python 2 / 3 compatibility\n [pbauer]\n\n\n3.0.3 (2017-11-24)\n------------------\n\nNew features:\n\n- Link widget: add ``placeholder`` attributes for external and email link input fields.\n [thet]\n\nBug fixes:\n\n- Fix: Add missing i18n-domains to templates.\n [jensens]\n\n- Use RichTextValue's output_relative_to(self.context) in RichTextWidget so the ITransform doesn't use siteroot.\n [jaroel]\n\n- Fix in link widget data converter for ``toWidgetValue`` to return an empty structure when the field value is empty instead of returning the portal root object.\n Fixes: https://github.com/plone/Products.CMFPlone/issues/2163\n [thet]\n\n- Keep \"internal\" links with query strings as external links, otherwise\n the query string is lost\n [tomgross]\n\n- Allow an additional CSS class for widgets in this package\n [tomgross]\n\n- Document customization of widgets\n [tomgross]\n\n3.0.2 (2017-09-06)\n------------------\n\nBug fixes:\n\n- Test fixes for changes in plone.app.widgets querystring options.\n [thet]\n\n\n3.0.1 (2017-07-03)\n------------------\n\nNew features:\n\n- Add new and enhanced link widget.\n [tomgross, thet]\n\nBug fixes:\n\n- Fix broken ``get_tinymce_options`` when called with non-contentish contexts like form or field contexts.\n [thet]\n\n- Related Items Widget: In search mode, when no basePath was set, search site-wide.\n Fixes: https://github.com/plone/mockup/issues/769\n [thet]\n\n- Fixes #64: SingleCheckBoxFieldWidget does not render value in view mode.\n In order to fix this issue the hacky view was removed.\n It is replaced by a new widget to render a single checkbox with bool values.\n An appropriate data converter was added as well.\n [jensens]\n\n\n3.0 (2017-03-28)\n----------------\n\nBreaking changes:\n\n- Removed ``plone.app.z3cform.object`` and\n ``plone.app.z3cform.objectsubform`` because z3c.form 3.3 removed the\n underlying code.\n See https://github.com/zopefoundation/z3c.form/pull/38 for upstream changes.\n [maurits]\n\nNew features:\n\n- Add new class ``view-name-VIEWNAME`` to form element indicating the view name w/o old kss prefix.\n New class's replaces ``++`` in view by ``-`` in order to produce valid class (CSS selectable) names.\n [jensens]\n\nBug fixes:\n\n- Catch TypeError occurring on conflicting subrequests in inline validation\n [tomgross]\n\n- Clean up: code-style, zca-decorators, replace lambda.\n [jensens]\n\n\n2.2.1 (2017-02-12)\n------------------\n\nNew features:\n\n- Do not show the \"Clear\" button for required Date or DateTime fields.\n [thet]\n\nBug fixes:\n\n- Test fixes for plone.app.widgets 2.1.\n [thet]\n\n- remove deprecated __of__ for browserviews\n [pbauer]\n\n\n2.2 (2017-01-02)\n----------------\n\nBreaking changes:\n\n- Test fixes for plone.app.widgets 2.1.\n While this is not a breaking change functionality or API wise, the tests do only pass with plone.app.widgets 2.1.\n [thet]\n\nBug fixes:\n\n- Fix RelatedItemsDataConverter with relation lists, where in an iteration a wrong value was checked to be existent.\n Fixes failures in situations, where a ``None`` value was part of the relation list.\n [thet]\n\n- Fix RelatedItemsDataConverter with choice lists, where choices are UUID\n strings of selected relations, but conversion failed, because Choice\n field has None as its value_type\n [datakurre]\n\n\n2.1.2 (2016-12-02)\n------------------\n\nBug fixes:\n\n- Remove ZopeTestCase.\n [ivanteoh, maurits]\n\n- In select widget, accept items as property or method.\n This avoids breaking on some z3c.form versions.\n See https://github.com/zopefoundation/z3c.form/issues/44\n [maurits]\n\n\n2.1.1 (2016-09-16)\n------------------\n\nBug fixes:\n\n- Enable unload protection by using pattern class ``pat-formunloadalert`` instead ``enableUnloadProtection``.\n [thet]\n\n\n2.1 (2016-08-12)\n----------------\n\nNew features:\n\n- Related items data converter supports explicit value_type specified in\n field when using collections of UUID values. This is backward-compatible\n with previous conversion to field values, supports str/unicode value(s),\n whichever is specified by field.\n [seanupton]\n\n- Support functions as values in the ``pattern_options`` dictionary, which gets then serialized to JSON.\n Before that, walk recursively through ``pattern_options`` and call all functions with the widgets context.\n This allows for context-specific, runtime evaluated pattern option values.\n [thet]\n\n- Don't overwrite widget default css classes when rendering pattern widgets.\n This allows setting a css class via the ``klass`` keyword in plone.autoform widget directives.\n [thet]\n\n\n2.0.0 (2016-04-29)\n------------------\n\nIncompatibilities:\n\n- Deprecated \"plone.app.z3cform.object\" and moved to\n \"plone.app.z3cform.objectsubform\" in order to avoid built in names\n as module names, which may result in difficult to debug errors.\n [jensens]\n\n- Made existing soft deprecation (by comment) of plone.app.z3cform.layout\n explicit by deprecating using zope.deferredimport.\n [jensens]\n\n- removed plone.app.z3cform.queryselect since this was deprecated already\n and removal planned (!) already for Plone 4.1\n [jensens]\n\nNew:\n\n- make widget available to wysiwyg_support template\n [gotcha]\n\nFixes:\n\n- Reduce dependency on plone.app.widgets in tests.\n [thet]\n\n- Enhance test in order to show problem in RelatedItemsWidget with\n navigation-roots\n [jensens]\n\n- Cleanup: pep8, uth8-headers, zca-decorators, ...\n [jensens]\n\n\n1.2.0 (2016-02-25)\n------------------\n\nNew:\n\n- Add metal slot for inserting stuff below fields\n [fredvd]\n\nFixes:\n\n- Fix ajax selection for add forms\n [tomgross]\n\n- Use doctest instead of zope.testing.doctest\n [pbauer]\n\n- Fix related items widget tests to include root path support.\n Fix options merging for TinyMCE widget.\n [alecm]\n\n- Fixed test for plone.app.widgets.\n [Gagaro]\n\n- Used assertDictEqual instead of assertEqual for RelatedItemsWidgetTests.test_widget\n [Gagaro]\n\n1.1.8 (2016-01-08)\n------------------\n\nFixes:\n\n- Fixed tests for newer CMFPlone. [Gagaro, ebrehault, vangheem]\n\n\n1.1.7 (2015-11-26)\n------------------\n\nFixes:\n\n- Don't allow adding new terms in the AjaxAutocompleteWidget\n when it's used with a Choice field.\n [davisagli]\n\n- Remove installation of plone.app.widgets default profile. In Plone 5 with\n plone.app.widgets >= 2.0, the profile is only a dummy profile for BBB\n compatibility.\n [thet]\n\n\n1.1.6 (2015-10-27)\n------------------\n\nFixes:\n\n- Check if user can add keywords for AjaxSelectWidget.\n [Gagaro]\n\n\n1.1.5 (2015-09-20)\n------------------\n\n- Don't check portal_registry for default_charset, we only accept\n utf-8.\n [esteele]\n\n- Allow time options to be customized for DatetimeWidget.\n [thet]\n\n- Wrap context to allow tools to be found in text widget.\n [cguardia]\n\n\n1.1.4 (2015-09-16)\n------------------\n\n- Remove unittest2 dependency.\n [gforcada]\n\n\n1.1.3 (2015-07-18)\n------------------\n\n- Also mock getToolByName for some tests.\n [vangheem]\n\n\n1.1.2 (2015-05-11)\n------------------\n\n- grab selected editor from user\n [vangheem]\n\n\n1.1.1 (2015-05-04)\n------------------\n\n- Use the more specific browser layer ``IPloneFormLayer`` for adapter\n registrations. This avoids double registration errors.\n [thet]\n\n\n1.1.0 (2015-03-21)\n------------------\n\n- Integrate plone.app.widgets.\n [vangheem]\n\n\n1.0.2 (unreleased)\n------------------\n\n- Fix inline-validation warning error\n [jbirdwell]\n\n\n1.0.1 (2014-10-23)\n------------------\n\n- Handle an error where group.__name__ being None caused fieldsets to be given\n the id 'fieldset-none', which causes issues the inline validation.\n [esteele]\n\n\n1.0 (2014-02-26)\n----------------\n\n- Remove dependency on collective.z3cform.datetimewidget and instead use\n plone.app.widgets.\n [garbas, thet]\n\n\n0.7.6 (2014-01-27)\n------------------\n\n- Translate fieldset labels correctly.\n [maurits]\n\n- We can add enable_unload_protection = False on a Form to disable unload protection.\n [thomasdesvenain]\n\n- Add '.empty' css class to fields that have no value.\n [cedricmessiant]\n\n- Indicate 'error' status when reporting errors from group forms.\n [davisagli]\n\n- Replace deprecated test assert statements.\n [timo]\n\n- Solve #13567: InlineValidation broken for MultiWidget.\n [sunew]\n\n\n0.7.5 (2013-10-09)\n------------------\n\n- Fix an issue with the inline validator, KSS was giving values for\n fieldset attr than can't be converted to an integer.\n [jpgimenez]\n- Inline validation supports fieldset names instead of integer-indexed naming.\n [seanupton]\n- Use group __name__, not label value to have stable fieldset_name used in\n DOM id, and for inline validation.\n [seanupton]\n- Inline validation robustness if no field name is passed by client request.\n [seanupton]\n- Support for IDict in the MultiWidget. Makes it compatible with z3c.form 3.0 (released 2013-06-24)\n [djay]\n- Give fieldset legends ids based on their name, for compatibility with\n Archetypes.\n [davisagli]\n- Fixed checkbox inline validation.\n [kroman0]\n\n\n0.7.4 (2013-08-13)\n------------------\n\n- Display 'required' span only on input mode.\n [cedricmessiant]\n\n\n0.7.3 (2013-05-23)\n------------------\n\n- Added possibility to use z3c.form's ContentProviders [gbastien, jfroche, gotcha]\n\n\n0.7.2 (2013-03-05)\n------------------\n\n- Add a macro and slot to the @@ploneform-render-widget templates\n so it's possible to override the widget rendering without\n changing the markup surrounding it.\n [davisagli]\n\n- Restored support for contents without acquisition chain\n [keul]\n\n\n0.7.1 (2013-01-01)\n------------------\n\n\n- Overrode ObjectSubForm for IObject field in order to provide get_closest_content\n method. Now it is possible to guess the closest content from a Multiwidget subform.\n [gborelli]\n\n- Added utils.closest_content from plone.formwidget.contenttree.utils\n [gborelli]\n\n- Primarily use form name for 'kssattr-formname' form attribute.\n [vipod]\n\n- Rename the 'fieldset.current' hidden input to 'fieldset' for consistency\n with Archetypes.\n [davisagli]\n\n\n0.7.0 (2012-10-16)\n------------------\n\n- Support inline validation without depending on KSS.\n [davisagli]\n\n- Fix a case where the widget broke if its form's content was a dict.\n [davisagli]\n\n\n0.6.1 (2012-08-30)\n------------------\n\n- Fix the single checkbox widget to cope with widgets with a __call__ method.\n [davisagli]\n\n\n0.6.0 (2012-05-25)\n------------------\n\n- Remove hard-coded ■ (box) markers from required labels to match\n changes made in sunburst/public.css and archetypes. Fixes double required\n markers in Plone 4.2rc1.\n\n- Pull form help inside label tag and make it a span rather than a div. The\n purpose is to improve accessibility by making the semantic connection between\n label and help. Related to http://dev.plone.org/ticket/7212\n\n- Use ViewPageTemplateFile from zope.browserpage.\n [hannosch]\n\n0.5.8 (2012-05-07)\n------------------\n\n- Prevent empty error divs from being generated if errors are already associated\n with a field.\n [davidjb]\n\n0.5.7 - 2011-11-26\n------------------\n\n- Corrected formatting for errors on the FieldWidgets object (i.e. from\n invariants). This closes http://code.google.com/p/dexterity/issues/detail?id=238\n [davisagli]\n\n- Added the ``i18n:domain`` attribute in the first ``div`` of ``widget.pt`` in order to make the\n \"required\" tooltip translatable. Fixes http://dev.plone.org/plone/ticket/12209\n [rafaelbco]\n\n0.5.6 - 2011-06-30\n------------------\n\n- Make sure group errors get styled like field errors.\n [davisagli]\n\n- Include group and field descriptions as structure.\n [davisagli]\n\n0.5.5 - 2011-06-26\n------------------\n\n- Make it possible to add a custom CSS class to a form by setting its\n ``css_class`` attribute.\n [davisagli]\n\n- Match plone.z3cform's template in including the form description as\n structure.\n [davisagli]\n\n0.5.4 - 2011-05-04\n------------------\n\n- Customize templates for multi and object widgets for more consistent styling.\n [elro]\n\n- Remove dependency on zope.app.component.\n [davisagli]\n\n- Add MANIFEST.in.\n [WouterVH]\n\n- Raise LookupError when terms are not found (e.g. they are no longer visible due to security)\n [lentinj]\n\n\n0.5.3 - 2011-01-22\n------------------\n\n- Fix test setup in Zope 2.10.\n [davisagli]\n\n\n0.5.2 - 2011-01-18\n------------------\n\n- Don't use collective.testcaselayer based IntegrationTestLayer as it leads to\n PicklingError on Plone 4.1.\n [elro]\n\n- Change inline validation to match archetypes behavior - add a warning class and\n omit the error message.\n [elro]\n\n\n0.5.1 - 2010-11-02\n------------------\n\n- Make sure form.extractData() does not raise an AttributeError if the method is\n called before the form is available (first page load).\n [timo]\n\n- This package now uses the plone i18n domain.\n [vincentfretin]\n\n- Added option to override <form action=\"\">.\n [miohtama]\n\n- Updated README regarding form action and method.\n [miohtama]\n\n\n0.5.0 - 2010-04-20\n------------------\n\n- Render errors from group form widget manager validators. Fixes\n http://code.google.com/p/dexterity/issues/detail?id=96\n [davisagli]\n\n- Default to showing the default fieldset, rather than the first non-default\n fieldset.\n [davisagli]\n\n- Replace the required field indicator image with a unicode box, refs\n http://dev.plone.org/plone/ticket/10352\n [davisagli, limi]\n\n- Replaced the existing radiobutton-based boolean widget with the standard\n single checkbox Plone version.\n [limi]\n\n- Add @@ploneform-render-widget view, so that the widget chrome can be\n customized for particular widget types.\n [davisagli]\n\n- Added slots to the ``titlelessform`` macro. See ``README.txt`` in\n ``plone.z3cform`` for details.\n [optilude, davisagli]\n\n- Cleaned up templates to match Plone 4 conventions.\n [optilude]\n\n- Made templates and inline validation work with standalone forms as supported\n by plone.z3cform 0.6 and later.\n [optilude]\n\n- Installed a browser layer IPloneFormLayer with this package's extension\n profile. This inherits from z3c.form's IFormLayer, allowing the default\n widgets to work. You should always install this package in\n portal_quickinstaller before using z3c.form forms in Plone.\n [optilude]\n\n- Made the textlines widget the default for sequence types with text/ascii\n line value types. The default widget from z3c.form is too confusing.\n [optilude]\n\n- Use form method defined in form class. This allows HTTP GET forms.\n Before method was hardcoded to \"post\" in the template. [miohtama]\n\n\n0.4.9 - 2010-01-08\n------------------\n\n- Remove unused (and broken on Plone 4) lookup of the current user's WYSIWYG\n editor preference. The wysiwyg_support template does this for us.\n [davisagli]\n\n\n0.4.8 - 2009-10-23\n------------------\n\n- Made the KSS validator use publish traversal instead of OFS traversal to find\n the form. This makes it usable with forms reached by custom IPublishTraverse\n adapters.\n [davisagli]\n\n- Added enable_form_tabbing option to not transform fieldsets into tabs.\n [vincentfretin]\n\n- Added an id to the generated form.\n [vincentfretin]\n\n- Fixed issue in macros.pt: fieldset.current hidden input was never generated.\n [vincentfretin]\n\n\n0.4.7 - 2009-09-25\n------------------\n\n- Set plone i18n domain for \"Info\" and \"Error\" messages in macros.pt so they are translated.\n [vincentfretin]\n\n\n0.4.6 - 2009-07-26\n------------------\n\n- Include plone.z3cform's overrides.zcml from our own overrides.zcml.\n [optilude]\n\n- Updated to collective.z3cform.datetimewidget>=0.1a2 to fix a ZCML conflict\n with z3c.form.\n [davisagli]\n\n\n0.4.5 - 2009-05-25\n------------------\n\n- Made the KSS form support conditional on both kss.core and Archetypes being\n installed.\n [hannosch]\n\n- Use the date/time widgets from collective.z3cform.datetimewidget as the default\n widget for Date and Datetime fields.\n [davisagli]\n\n\n0.4.4 - 2009-05-03\n------------------\n\n- Made the KSS validator use traversal instead of getMultiAdapter() to find\n the form. This makes it work on add forms.\n See http://code.google.com/p/dexterity/issues/detail?id=27\n [optilude]\n\n\n0.4.3 - 2009-04-17\n------------------\n\n- Added a display template for the WYSIWYG widget.\n [optilude]\n\n- Make the ?fieldset.current query string variable work. Set it to the id\n of a fieldset other than default to pre-select a different fieldset, e.g.\n .../@@formview?fieldset.current=3\n [optilude]\n\n- Hide the 'default' fieldset if there's nothing to show there.\n [optilude]\n\n- Provide 'portal' variable in wysiwyg template, as its used by some editors.\n [davisagli]\n\n\n0.4.2 - 2008-09-04\n------------------\n\n- Make the WYSIWYG widget work also for non-Acquisition wrapped\n content.\n\n\n0.4.1 - 2008-08-21\n------------------\n\n- Removed maximum version dependency on zope.component. This should be left\n to indexes, known good sets or explicit version requirements in buildouts.\n If you work with zope.component >= 3.5 you will also need five.lsm >= 0.4.\n [hannosch]\n\n- Make use of new plone.z3cform support for looking up the layout template by\n adapter. This means that forms now no longer need to depend on\n plone.app.z3cform unless they want to use Plone-specific widgets.\n\n\n0.4.0 - 2008-07-31\n------------------\n\n- Add inline validation support with KSS\n\n- Require zope.component <= 3.4.0 to prevent compatibility issues with\n five.localsitemanager, of which a buggy version (0.3) is pinned by\n plone.recipe.plone 3.1.4. Upgrade to this version if you're seeing::\n\n ...\n Module five.localsitemanager.registry, line 176, in registeredUtilities\n ValueError: too many values to unpack\n\n\n0.3.2 - 2008-07-25\n------------------\n\n- Fixed a bug in macros.pt where 'has_groups' and 'show_default_label'\n for fieldsets were set in the 'form' macro, rendering the 'field'\n macro unusable by itself.\n\n\n0.3.1 - 2008-07-24\n------------------\n\n- Fixed a bug where we would use the form macros defined in\n plone.z3cform instead of our own.\n\n\n0.3 - 2008-07-24\n----------------\n\n- Create this package from Plone-specific bits that have been factored\n out of plone.z3cform.\n",
"bugtrack_url": null,
"license": "GPL",
"summary": "A collection of widgets, templates and other components for use with z3c.form and Plone",
"version": "4.7.1",
"project_urls": {
"Homepage": "https://pypi.org/project/plone.app.z3cform"
},
"split_keywords": [
"zope",
"plone",
"form",
"widget",
"template"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "07624c23f775f67fec1566501964b938b6b7cc63cbb20dde50296dc835637701",
"md5": "77c0f9dd1885e53625eecf92154584a8",
"sha256": "ce4b750429c588a2a6c68aff868bec68f135a684cf0aa6b6f43897d8b0cf8e4e"
},
"downloads": -1,
"filename": "plone.app.z3cform-4.7.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "77c0f9dd1885e53625eecf92154584a8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 94840,
"upload_time": "2024-11-25T15:10:11",
"upload_time_iso_8601": "2024-11-25T15:10:11.577558Z",
"url": "https://files.pythonhosted.org/packages/07/62/4c23f775f67fec1566501964b938b6b7cc63cbb20dde50296dc835637701/plone.app.z3cform-4.7.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "085f7fd68a471c6316b6093ad0d46bdcb26969446547b3f0ec0a1821e31815bc",
"md5": "162ddfb70364d49ebd0b374846dfdc4a",
"sha256": "34fd4602f469db7436b4fc4a3eccb64295e02eb4398945ec55847239a097d912"
},
"downloads": -1,
"filename": "plone_app_z3cform-4.7.1.tar.gz",
"has_sig": false,
"md5_digest": "162ddfb70364d49ebd0b374846dfdc4a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 105411,
"upload_time": "2024-11-25T15:10:15",
"upload_time_iso_8601": "2024-11-25T15:10:15.332542Z",
"url": "https://files.pythonhosted.org/packages/08/5f/7fd68a471c6316b6093ad0d46bdcb26969446547b3f0ec0a1821e31815bc/plone_app_z3cform-4.7.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-25 15:10:15",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "plone.app.z3cform"
}