Metadata-Version: 2.4
Name: yafowil.plone
Version: 6.0.0
Summary: Plone Integration with YAFOWIL
Project-URL: Homepage, https://github.com/bluedynamics/yafowil.plone
Project-URL: Repository, https://github.com/bluedynamics/yafowil.plone
Project-URL: Issues, https://github.com/bluedynamics/yafowil.plone/issues
Author-email: Yafowil Contributors <dev@conestack.org>
License: Simplified BSD
License-File: LICENSE.rst
Keywords: form,plone,yafowil
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Plone
Classifier: Framework :: Plone :: 6.0
Classifier: Framework :: Plone :: 6.1
Classifier: Framework :: Plone :: 6.2
Classifier: Framework :: Plone :: Addon
Classifier: Framework :: Zope
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Requires-Python: >=3.10
Requires-Dist: plone-api
Requires-Dist: plone-app-z3cform>=4.1.0
Requires-Dist: products-cmfplone>=6.0
Requires-Dist: setuptools>=39.1.0
Requires-Dist: webresource>1.2.99
Requires-Dist: yafowil-bootstrap>1.99
Requires-Dist: yafowil-yaml>2.99
Requires-Dist: yafowil>3.99
Provides-Extra: test
Requires-Dist: coverage; extra == 'test'
Requires-Dist: plone-app-robotframework; extra == 'test'
Requires-Dist: plone-app-testing; extra == 'test'
Requires-Dist: pytest; extra == 'test'
Requires-Dist: zope-pytestlayer; extra == 'test'
Description-Content-Type: text/x-rst

`YAFOWIL <http://pypi.python.org/pypi/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:

.. code:: python

    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:

.. code:: python

    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:

.. code:: xml

    <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```:

.. code:: xml

    <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:

.. code:: python

    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.

.. code:: Python
 
    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 <https://github.com/bluedynamics/bda.plone.yafowil_autoform_example/blob/master/src/bda/plone/yafowil_autoform_example/behaviors.py>`_

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 <http://yafowil.info>`_ 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 <http://github.com/bluedynamics/yafowil.plone>`_.

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.
