Skip to main content

Plone Integration with YAFOWIL

Project description

YAFOWIL is a form library for Python. This is its Plone Integration package

Overview

yafowil.plone offers different levels of integration for Plone:

  • wraps the Zope Request to fullfill YAFOWIL expectations

  • combines and registers CSS and JavScript Resources

  • macros following Plone default markup for fields, labels, etc

  • Plone specific widgets

  • l10n/i18n integration

  • base forms for use in views (Python and YAML based)

  • autoform features (experimental): - generates forms from zope.schema and schema annotations - works as drop-in replacement for z3c.form - full add/edit lifecycle for Plone content forms. - optional immediate content create feature on add

Functionality

Integration with Translation

The package adds an translation method for Zope2 i18n messages. It’s added using by defining a global preprocessor

Request wrapper

This package registers a global preprocessor for YAFOWIL. It wraps the Zope2 request by an own request instance providing the behavior expected by YAFOWIL.

File Uploads provided by Zope2 as ZPublisher.HTTPRequest.Fileupload objects are turned into a python dict with the keys:

file

file-like object to read data from

filename

submitted name of the upload

mimetype

type of the upload

headers

all headers

original

keeps the original ZPublisher.HTTPRequest.Fileupload object

Base Forms

This package ships with base forms to be extended.

The following form base classes are available:

yafowil.plone.form.BaseForm

does not define a `__call__` method: define a template in ZCML or a __call__ method. It provides a method named `render_form` which processes and renders the form.

yafowil.plone.form.Form

renders the naked form on __call__.

yafowil.plone.form.YAMLBaseForm

similar to BaseForm above. Expects properties form_template pointing to a YAML file and message_factory providing the message factory used for YAML message strings.

yafowil.plone.form.YAMLForm

similar to YAMLBaseForm renders the naked YAML form on __call__.

An in practice implementation may look like:

from yafowil.base import factory
from yafowil.plone.form import Form

class MyForm(Form):
    action_resource = '@@view_name_callable_by_browser'

    def prepare(self):
        form = factory(
            'form',
            name='myform',
            props={
                'action': self.form_action,
            })

        # form widgets creation here...

        self.form = form

Convenience code for creating YAML forms:

from zope.i18nmessageid import MessageFactory
from yafowil.plone.form import YAMLBaseForm

class MyYAMLForm(YAMLBaseForm):
    action_resource = '@@view_name_callable_by_browser'
    form_template = 'package.name:forms/myform.yaml'
    message_factory = MessageFactory('package.name')

Form classes inherit from Products.Five.BrowserPage, thus they must be registered via ZCML browser:page directive:

<browser:page
  for="*"
  name="form_registration_name"
  class=".forms.MyYAMLForm"
  template="myyamlform.pt"
  permission="cmf.ModifyPortalContent"
/>

Forms build with this base form classes need a template in order to insert such a form in a layout. It must be called inside a wrapper template `myform.yaml`:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
      lang="en"
      metal:use-macro="context/main_template/macros/master"
      i18n:domain="package.name">
  <body>
    <metal:content-core fill-slot="content-core">
      <metal:block define-macro="content-core">
        <tal:form replace="structure view/render_form" />
      </metal:block>
    </metal:content-core>
  </body>
</html>

When not using one of the BaseForms, the CSS/JS resources for YAFOWIL are not loaded automatically.

Add the following lines in order to load it:

from Products.CMFPlone.resources import add_bundle_on_request

class MyViewWithYafowil(BrowserView):

    def __init__(self, context, request):
        super(MyViewWithYafowil, self).__init__(context, request)
        add_bundle_on_request(request, 'yafowil')

CSRF Protection

To write into the database in Plone a CSRF protection authenticator key must be provided as a hidden form field. This can be done by adding a plumbing behavior to the forms created as above.

from plumber import plumbing
from yafowil.plone.form import BaseForm
from yafowil.plone.form import CSRFProtectionBehavior

@plumbing(CSRFProtectionBehavior)
class ImportForm(BaseForm):
    """Form with CSRF protection"""

Autoform

EXPERIMENTAL:

Autoform features are not feature complete.

YAFOWIL can be used as an drop-in replacement for the z3c.form based and plone.autoform generated forms.

Installation

There is a profile called YAFOWIL Autoform (in XML: yafowil.plone:autoform). By installing the profile, all needed to enable YAFOWIL rendered forms is installed. To finally activate autoform rendering for a content-type, one of the provided YAFOWIL Autoform behaviors has to be activated on the content-type.

Basic Functionality

YAFOWIL offers a layer to read z3c.form zope.schema annotations and build forms from this information.

Furthermore it offers an own zope.schema annotations named factory and factory_callable to build rich custom YAFOWIL forms without any z3c.form references.

Examples can be found within the bda.plone.yafowil_autoform_example behavior

Usage as z3c.form drop-in replacement

There are two behaviors available.

YAFOWIL forms from content-type schemas

Basic configuration with almost same behavior as z3c.form rendered types. Main difference: All widgets and processing is done through YAFOWIL. Also, a temporary non-persistent add-context is created and used (opposed to the container as add context in Dexterity).

YAFOWIL forms from content-type schemas with persistent add context

Work the same as the basic one above, but a persistent add context is created. I.e., this enables users to upload content in a container just created by the add form. On cancel the persistent object is removed. To enable removal of stalled content (because user closed browser or similar) an index is added to track the state of the content. This immediate creation feature is similar to the one in (but completely independent from) the addon collective.immediatecreate.

Detailed Documentation

If you’re interested to dig deeper: The detailed YAFOWIL documentation is available. Read it and learn how to create your example application with YAFOWIL.

Source Code

The sources are in a GIT DVCS with its main branches at github.

We’d be happy to see many forks and pull-requests.

Contributors

  • Jens W. Klein <jens [at] bluedynamics [dot] com>

  • Peter Holzer <hpeter [at] agitator [dot] com>

  • Benjamin Stefaner <bs [at] kleinundpartner [dot] at>

  • Robert Niederreiter <rnix [at] squarewave [dot] at>

History

6.0.0 (2026-03-31)

  • Refactor package layout to use pyproject.toml and implicit namespace packages. [rnix]

  • Update resource delivery to use webresource. [rnix]

5.0.0 (2025-09-28)

  • Add missing dependency plone.api. [thet]

5.0.0a2 (2024-02-29)

  • Use plone.app.z3cform instead plone.app.widgets. [thet]

5.0.0a1 (2023-09-25)

  • Remove requireJS from JavaScript to make it compatible with Plone 6, drop Plone 5 support [MrTango]

  • Fix MutableMapping import for Python 3.10 [MrTango]

  • Refactor ajaxselect_options with refactored widget code. [petschki]

4.0.0a5 (2023-02-21)

  • Exclude all buildout config files from source distributions. [thet]

  • Fix MutableMapping import for Python 3.10. [fredvd]

4.0.0a4 (2022-09-28)

  • Fixed IObjectEvent and ObjectEvent import (issue https://github.com/bluedynamics/yafowil.plone/issues/32) [gogobd]

  • Switch to Bootstrap 5 [agitator]

  • Style Bool-Widget as usual in Plone. [jensens]

  • Style autoform form-controls (save/cancel buttons) as usual in Plone. [jensens]

  • Use plone.app.widgets.base.dict_merge to update pattern options in plonerichtext blueprint. [rnix]

  • Fix IObjectEvent and ObjectEvent imports [avoinea]

4.0.0a3 (2019-07-31)

  • Also accept string values in plonerichtext blueprint. [rnix]

  • Array widget now supports richtext entries. Therefor arrayrichtext macro was added. [rnix]

  • Fix resolving field order defined with plone.autoform.directives. [rnix]

  • Fix autoform directives TGV cache to lookup values from derived schemata as well. [rnix]

4.0.0a2 (2019-07-10)

  • Consider values from plone.autoform.directives.order_before and order_after in yafowil.plone.autoform.schema.resolve_schemata. [rnix]

  • Consider values from plone.autoform.directives.mode in yafowil.plone.autoform.schema.resolve_schemata. [rnix]

  • Fix autoform default fieldset label. [rnix, jensens]

  • Fix autoform fieldset order. [rnix, jensens]

  • Add plonerichtext blueprint and use in yafowil.plone.autoform.factories. [rnix]

4.0.0a1 (2019-06-11)

  • Add Autoform functionality. [rnix, jensens]

  • Drop Plone 4 compatibility. [jensens]

  • Add immediate create feature for autoform. [jensens]

  • Move plonelabel blueprint to yafowil.plone.widgets.label. [rnix]

  • Zope2RequestAdapter always returns non-iterable request parameter values as unicode. [rnix, jensens]

3.0.0 (2019-02-19)

  • Add resources explicit in pages using YAFOWIL. Do not deliver the CSS/JS chunk on every request. Code using yafoil w/o the yafowil.plone.form.* as base class need a minimal modification. See README. [jensens]

  • Use self.context instead of context in CSRFProtectionBehavior when looking up fallback root key manager. [rnix]

  • Deliver resources as plone.stableResource to cache JS/CSS in browser. [jensens]

  • Python 3 support: [reinhardt]

    • Replaced UserDict

    • Replaced old-style relative import

    • Fixed StringIO import

    • Fixed text handling

  • Deliver jqueryui on request and remove dependency on collective.js.jqueryui [agitator]

2.4.1 (2017-03-10)

  • Reduce logging verbosity on load from info to debug. [jensens]

2.4.0 (2017-03-10)

  • Introduce yafowil.plone.form.CSRFProtectionBehavior. [rnix]

2.3.1 (2016-09-14)

  • Fix yafowil dependency minimal version [jensens]

2.3 (2016-09-09)

  • Use yafowil.utils.entry_point decorator. [rnix]

  • Plone 5 support. [rnix]

2.2 (2015-10-10)

  • Use pkg_resources.get_distribution instead of catching ImportError to check whether TinyMCE is installed. [rnix]

  • Make dependency on Products.TinyMCE a soft dependency. [thet]

2.1 (2013-06-03)

  • Set applyPrefix for CSS resources to True, so that referenced images can still be found. [thet, 2014-05-06]

  • Integrate translations. [rnix, 2014-05-01]

2.0.2

  • fix resource group names [thet]

  • correct getSite import, cleanup [thet]

2.0.1

  • Provdide default title attribute value for richtext blueprint of yafowil.widget.richtext addon widget in order to provide TinyMCE configuration as expected by plone integration. [rnix]

2.0

  • YAFOWIL resource including configuration via generic setup. [rnix, 2012-10-03]

1.3.1

  • Simplify base forms for plone. [jensens, 2012-05-21]

  • Not ZIP safe! [jensens, 2012-04-15]

1.3

  • GS profile marker - fix wrong filename. [rnix, 2012-04-11]

  • Add yafowil.plone.form module containing base classes. [rnix, 2012-04-11]

1.2

  • Rename to yafowil.plone - seems a 2 at the end of a package name confuses easy_install. wtf!? [jensens, 2012-03-20]

1.1

  • Depend on yafowil 1.3 in setup.py and bump version. [jensens, 2012-03-20]

1.0

  • Resources are registered using the new plugin infrastructure. Theres now an import step for generic setup registering all javascripts and stylesheets provided by the plugins. They are registred without any thirdparty dependencies. If a resource is already registered its registration is skipped. Such its possible to register or overide the defaults using xml files. [jensens, 2012-02-01]

  • Automatic browserresources for plugins. [jensens, 2012-02-16]

  • Depends on yafowil 1.3 plugin infrastucture. [jensens, 2012-02-15]

  • Example form and senseful default-classes and plans for plone. [hpeter, bennyboy, 2012-02-15]

1.0-beta

  • Made it work. [jensens, rnix, et al, 2010-12-27]

License

Copyright (c) 2010-2025, BlueDynamics Alliance, Austria All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  • Neither the name of the BlueDynamics Alliance nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY BlueDynamics Alliance AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BlueDynamics Alliance BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yafowil_plone-6.0.0.tar.gz (362.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

yafowil_plone-6.0.0-py3-none-any.whl (371.1 kB view details)

Uploaded Python 3

File details

Details for the file yafowil_plone-6.0.0.tar.gz.

File metadata

  • Download URL: yafowil_plone-6.0.0.tar.gz
  • Upload date:
  • Size: 362.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for yafowil_plone-6.0.0.tar.gz
Algorithm Hash digest
SHA256 d025df8a7be50dd2b62343789cfbdf38858ce44b6ef1331ed3096a63b6b83aca
MD5 3abb5f91eb133c12973812aa038f674b
BLAKE2b-256 50c242c4258e8c4bbf5c484ec2334b5513dd2ed6a9732131354a7f5ca312c17e

See more details on using hashes here.

File details

Details for the file yafowil_plone-6.0.0-py3-none-any.whl.

File metadata

  • Download URL: yafowil_plone-6.0.0-py3-none-any.whl
  • Upload date:
  • Size: 371.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for yafowil_plone-6.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1f8e0d754f4f64f7e52fdf28dfee0b0ecbff60cdb2314ec9dc1af6a4ed9ebb68
MD5 94f6c0741eed7dbb7bf42fe5ecf73e25
BLAKE2b-256 01b8c22984f58b44e49c0630513bf3e0beb51207edcf320cf4f74a9eb4477578

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page