[Checkins] SVN: plone.z3cform/trunk/ Clean up package a bit and provide half-decent documentation for all of the features.

Martin Aspeli optilude at gmx.net
Tue Feb 16 21:46:42 EST 2010


Log message for revision 109087:
  Clean up package a bit and provide half-decent documentation for all of the features.

Changed:
  U   plone.z3cform/trunk/README.txt
  D   plone.z3cform/trunk/plone/z3cform/README.txt
  U   plone.z3cform/trunk/plone/z3cform/crud/README.txt
  U   plone.z3cform/trunk/plone/z3cform/crud/batch.txt
  U   plone.z3cform/trunk/plone/z3cform/fieldsets/README.txt
  D   plone.z3cform/trunk/plone/z3cform/form.pt
  D   plone.z3cform/trunk/plone/z3cform/layout.pt
  D   plone.z3cform/trunk/plone/z3cform/macros.pt
  D   plone.z3cform/trunk/plone/z3cform/subform.pt
  U   plone.z3cform/trunk/plone/z3cform/tests.py
  U   plone.z3cform/trunk/setup.py

-=-
Modified: plone.z3cform/trunk/README.txt
===================================================================
--- plone.z3cform/trunk/README.txt	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/README.txt	2010-02-17 02:46:42 UTC (rev 109087)
@@ -3,44 +3,66 @@
 =============
 
 plone.z3cform is a library that enables the use of `z3c.form`_ in Zope 2.
-It depends only on Zope 2 and `z3c.form`.
+It depends only on Zope 2 and z3c.form.
 
-For Plone integration, there is also `plone.app.z3cform`_.
+For Plone integration, there is also `plone.app.z3cform`_, which can be
+installed to make the default form templates more Ploneish. That package
+pulls in this one as a dependency.
 
 In addition to pure interoperability support, a few patterns which are useful
 in Zope 2 applications are implemented here.
 
+.. contents:: Contents
+
 Installation
-------------
+============
 
 To use this package, simply install it as a dependency of the package where
 you are using forms, via the ``install_requires`` line in ``setup.py``. Then
 loads its configuration via ZCML::
 
-    <include package="plone.directives.form" />
+    <include package="plone.z3cform" />
 
 Standalone forms
-----------------
+================
 
 If you are using Zope 2.12 or later, z3c.form forms will *almost* work
 out of the box. However, two obstacles remain:
 
 * The standard file upload data converter does not work with Zope 2, so
-  fields (e.g. for ``Bytes``) using the file widget will not work correctly.
+  fields (like ``zope.schema.Bytes``) using the file widget will not work
+  correctly.
 * z3c.form expects request values to be decoded to unicode strings by the
   publisher, which does not happen in Zope 2.
 
 To address the first problem, this package provides an override for the
-standard data converter adapter (registered on the ``schema.Bytes`` class
+standard data converter adapter (registered on the ``zope.schema.Bytes`` class
 directly, so as to override the default, which is registered for the less
 general ``IBytes`` interface). To address the second, it applies a monkey
 patch to the ``update()`` methods of ``BaseForm`` and ``GroupForm`` from
 ``z3c.form`` which performs the necessary decoding in a way that is consistent
 with the Zope 3-style publisher.
 
-With this in place, you can create a form using standard `z3c.form`_
-conventions, e.g.::
+Note: If you override ``update()`` in your own form you must either call the
+base class version or call the function ``plone.z3cform.z2.processInputs()``
+on the request *before* any values in the request are used. For example::
 
+    from plone.z3cform.z2 import processInputs
+    from z3c.form import form
+    
+    ...
+    
+    class MyForm(form.Form):
+        
+        ...
+        
+        def update(self):
+            processInputs(self.request)
+            ...
+
+Other than that, you can create a form using standard `z3c.form`_ conventions.
+For example::
+
     from zope.interface import Interface
     from zope import schema
     from z3c.form import form, button
@@ -57,7 +79,7 @@
             data, errors = self.extractData()
             # do something
 
-You can register this view in ZCML using the standard ``<browser:page />``
+You can register this as a view in ZCML using the standard ``<browser:page />``
 directive::
 
     <browser:page
@@ -85,13 +107,13 @@
 See below for more details about standard form macros.
 
 Note that to render any of the standard widgets, you will also need to make
-sure the request is marked with ``z2c.form.interfaces.IFormLayer``, as is
+sure the request is marked with ``z3c.form.interfaces.IFormLayer``, as is
 the norm with z3c.form. If you install `plone.app.z3cform`_ in Plone, that
-is already done for you, but in other systems, you will need to do this
+is already done for you, but in other scenarios, you will need to do this
 in whichever way Zope browser layers are normally applied.
 
 Layout form wrapper
--------------------
+===================
 
 In versions of Zope prior to 2.12, z3c.form instances cannot be registered
 as views directly, because they do not support Zope 2 security (via the
@@ -103,7 +125,7 @@
 in later versions of Zope:
 
 * To support both an earlier version of Zope and Zope 2.12+
-* To re-use a form in multiple views or viewlets
+* To re-use the same form in multiple views or viewlets
 * To use the ``IPageTemplate`` adapter lookup semantics from z3c.form to
   provide a different default or override template for the overall page
   layout, whilst retaining (or indeed customising independently) the default
@@ -136,8 +158,7 @@
     
     MyFormView = layout.wrap_form(MyForm)
 
-You can now register the ``MyformView`` (generated) class as a browser view
-factory::
+You can now register the (generated) ``MyFormView`` class as a browser view::
 
     <browser:page
         for="*"
@@ -147,28 +168,30 @@
         />
 
 If you want to have more control, you can define the wrapper class manually.
-You should derive from the default, though, to get the correct semantics. The
+You should derive from the default version to get the correct semantics. The
 following is equivalent to the ``wrap_form()`` call above::
 
     class MyFormView(layout.FormWrapper):
         form = MyForm
 
-You can of course add additional methods to the class, use a custom page
+You can of then add additional methods to the class, use a custom page
 template, and so on.
 
 The default ``FormWrapper`` class exposes a few methods and properties:
 
-* ``update()`` is called to prepare the request and then wrap the form
+* ``update()`` is called to prepare the request and then update the wrapped
+  form.
 * ``render()`` is called to render the wrapper view. If a template has
   been set (normally via the ``template`` attribute of the
   ``<browser:page />`` directive), it will be rendered here. Otherwise,
   a default page template is found by adapting the view (``self``) and 
   the request to ``zope.pagetemplate.interfaces.IPageTemplate``, in the
   same way that ``z3c.form`` does for its views. A default template is
-  supplied with this package.
+  supplied with this package (and customised in `plone.app.z3cform`_ to
+  achieve a standard Plone look and feel).
 * ``form`` is a class variable referring to the form class, as set above.
-* ``form_instance`` is set to the current form instance once the view has
-  been initialised.
+* ``form_instance`` is an instance variable set to the current form instance
+  once the view has been initialised.
 
 When a form is rendered in a wrapper view, the form instance is temporarily
 marked with either ``plone.z3cform.interfaces.IWrappedForm`` (for standard
@@ -179,25 +202,192 @@
 form elements only.
 
 Default templates and macros
-----------------------------
+============================
 
+Several standard templates are provided with this package. These are all
+registered as adapters from ``(view, request)`` to ``IPageTemplate``, as is
+the convention in z3c.form. It therefore follows that these defaults can be
+customised with an adapter override, e.g. for a specific browser layer. This
+is useful if you want to override the standard rendering of all forms. If you
+just want to provide a custom template for a particular form or wrapper view,
+you can specify a template directly on the form or view, as shown above.
+
+* ``templates/layout.pt`` is the default template for the layout wrapper view.
+  It uses the CMFDefault ``main_template`` and fills the ``header`` slot.
+* ``templates/wrappedform.pt`` is the default template for wrapped forms.
+  It renders the ``titlelessform`` macro from the ``@@ploneform-macros`` view.
+* ``templates/subform.pt`` is the default template for wrapped sub-forms.
+  It uses the macros in ``@@ploneform-macros`` view to render a heading,
+  top/bottom content (verbatim) and the fields and actions of the subform (but
+  does not) render the ``<form />`` tag itself.
+* ``templates/form.pt`` is the default template for a standalone form. It uses
+  the macro ``context/@@standard_macros/page`` (supplied by Five and normally
+  delegating to CMF's ``main_template``) to render a form where the form label
+  is the page heading.
+* ``templates/subform.pt`` is nearly identical to ``wrappedsubform.pt``, but
+  is used in the unwrapped case.
+
+As hinted, this package also registers a view ``@@ploneform-macros``, which
+contains a set of macros that be used to construct forms with a standard
+layout, error message display, and so on. It contains the following macros:
+
+* ``form`` is a full page form, including the label (output as an ``<h3 />``),
+  description, and all the elements of ``titlelessform``.
+* ``titlelessform`` includes the form ``status`` at the top, the ``<form />``
+  element, and the contents of the ``fields`` and ``actions`` macros.
+* ``fields`` iterates over all widgets in the form and renders each, using the
+  contents of the ``field`` macro.
+* ``field`` renders a single field. It expects the variable ``widget`` to be
+  defined in the TAL scope, referring to a z3c.form widget instance. It will
+  output an error message if there is a field validation error, a label,
+  a marker to say whether the field is required, the field description, and 
+  the widget itself (normally just an ``<input />`` element).
+* ``actions`` renders all actions on the form. This normally results in a row
+  of ``<input type="submit" ... />`` elements.
+
+Thus, to use the ``titlelessform`` macro, you could add something like the
+following in a custom form template::
+
+    <metal:use use-macro="context/@@ploneform-macros/titlelessform" />
+
+Note that all of the templates mentioned above are customised by
+`plone.app.z3cform`_ to use standard Plone markup (but still retain the same
+macros), so if you are using that package to configure this one, you should
+look for the Plone-specific versions there.
+
 Template factories
-------------------
+==================
 
+If you want to provide an ``IPageTemplate`` adapter to customise the default
+page template used for wrapper views, forms or sub-forms, this package
+provides helper classes to create an adapter factory for that purpose. You
+should use these instead of ``z3c.form.form.FormTemplateFactory`` and
+(possibly) ``z3c.form.widget.WidgetTemplateFactory`` to get page templates
+with Zope 2 semantics. These factories are also `Chameleon`_ aware, if you
+have `five.pt`_ installed.
 
+The most commonly used factory is
+``plone.z3cform.templates.ZopeTwoFormTemplateFactory``, which can be used to
+render a wrapper view or a standalone form.
+
+To render a wrapped form, you can use
+``plone.z3cform.templates.FormTemplateFactory``, which is closer to the
+default ``z3c.form`` version, but adds Chameleon-awareness.
+
+To render a widget, the default ``WidgetTemplateFactory`` from z3c.form should
+suffice, but if you need Zope 2 semantics for any reason, you can use
+``plone.z3cform.templates.ZopeTwoWidgetTemplateFactory``.
+
+As an example, here are the default registrations from this package::
+    
+    import z3c.form.interfaces
+    import plone.z3cform.interfaces
+    
+    from plone.z3cform.templates import ZopeTwoFormTemplateFactory
+    from plone.z3cform.templates import FormTemplateFactory
+    
+    path = lambda p: os.path.join(os.path.dirname(plone.z3cform.__file__), 'templates', p)
+    
+    layout_factory = ZopeTwoFormTemplateFactory(path('layout.pt'),
+        form=plone.z3cform.interfaces.IFormWrapper
+    )
+
+    wrapped_form_factory = FormTemplateFactory(path('wrappedform.pt'),
+            form=plone.z3cform.interfaces.IWrappedForm,
+        )
+    wrapped_subform_factory = FormTemplateFactory(path('wrappedsubform.pt'),
+            form=plone.z3cform.interfaces.IWrappedSubForm,
+        )
+
+    # Default templates for the standalone form use case
+
+    standalone_form_factory = ZopeTwoFormTemplateFactory(path('form.pt'),
+            form=z3c.form.interfaces.IForm
+        )
+
+    standalone_subform_factory = ZopeTwoFormTemplateFactory(path('subform.pt'),
+            form=z3c.form.interfaces.ISubForm
+        )
+
+These are registered in ZCML like so::
+
+  <!-- Form templates for wrapped layout use case -->
+  <adapter factory=".templates.layout_factory" />
+  <adapter factory=".templates.wrapped_form_factory" />
+  <adapter factory=".templates.wrapped_subform_factory" />
+  
+  <!-- Form templates for standalone form use case -->
+  <adapter factory=".templates.standalone_form_factory" />
+  <adapter factory=".templates.standalone_subform_factory" />
+
 The widget traverser
---------------------
+====================
 
+It is sometimes useful to be able to register a view on a *widget* and be
+able to traverse to that view, for example during a background AJAX request.
+As an example of widget doing this, see `plone.formwidget.autocomplete`_.
 
-Extensible forms and fieldsets
-------------------------------
+This package provides a ``++widget++`` namespace traversal adapter which can
+be used for this purpose. It is looked up on either the form wrapper view,
+or the form itself (in the case of standalone) forms. Thus, if you have a
+form view called ``@@my-form``, with a field called ``myfield``, you could
+traverse to the widget for that view using::
 
+    http://example.com/@@my-form/++widget++myfield
 
-CRUD forms
-----------
+The widget may be on the form itself, or in a group (fieldset). If it exists
+in multiple groups, the first one found will be used.
 
+The example above will yield widget, but it is probably not publishable.
+You would therefore commonly register a view on the widget itself and use
+that. In this case, ``self.context`` in the view is the widget instance. Such
+a view could be looked up with::
 
+    http://example.com/@@my-form/++widget++myfield/@@some-view
+
+A caveat about security
+-----------------------
+
+In Zope 2.12 and later, the security machinery is aware of ``__parent__``
+pointers. Thus, traversal and authorisation on ``@@some-view`` in the example
+above will work just fine for a standard widget. In earlier versions of Zope,
+you will need to mix acquisition into your widget (which rules out using any
+of the standard ``z3c.form`` widgets). For example::
+
+    from Acquisition import Explicit
+    from z3c.form.widget import Widget
+    
+    class MyWidget(Widget, Explicit):
+        ...
+
+Unfortunately, in Zope 2.12, this will cause some problems during traversal
+unless you also mix acquisition into the view you registered on the widget
+(``@@some-view`` above). Specifically, you will get an error as the publisher
+tries to wrap the view in the widget.
+
+To stay compatible with both Zope 2.12+ and earlier versions, you have two
+options:
+
+* Ensure that you mix acquisition into the view on the widget
+* Ensure that the widget inherits from ``Explicit``, but does *not* provide
+  the ``IAcquirer`` interface. This tricks the publisiher into relying on
+  ``__parent__`` pointers in Zope 2.12.
+
+To do the latter, you can use ``implementsOnly()``, e.g.::
+
+    from zope.interface import implementsOnly
+    from Acquisition import Explicit
+    from z3c.form.widget import Widget
+    
+    ...
+    
+    class MyWidget(Widget, Explicit):
+        implementsOnly(IMyWidget) # or just IWdget from z3c.form
+        ...
+
 .. _z3c.form: http://pypi.python.org/pypi/z3c.form
 .. _plone.app.z3cform: http://pypi.python.org/pypi/plone.app.z3cform
 .. _CMF: http://www.zope.org/Products/CMF
-
+.. _Chameleon: http://pypi.python.org/pypi/Chameleon
+.. _five.pt: http://pypi.python.org/pypi/five.pt
+.. _plone.formwidget.autocomplete: http://pypi.python.org/pypi/plone.formwidget.autocomplete

Deleted: plone.z3cform/trunk/plone/z3cform/README.txt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/README.txt	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/plone/z3cform/README.txt	2010-02-17 02:46:42 UTC (rev 109087)
@@ -1,35 +0,0 @@
-Quick start
-===========
-
-A quick example:
-
-  >>> from zope import interface, schema
-  >>> from z3c.form import form, field, button
-  >>> from plone.z3cform.layout import wrap_form
-
-  >>> class MySchema(interface.Interface):
-  ...     age = schema.Int(title=u"Age")
-
-  >>> class MyForm(form.Form):
-  ...     fields = field.Fields(MySchema)
-  ...     ignoreContext = True # don't use context to get widget data
-  ...     label = u"Please enter your age"
-  ... 
-  ...     @button.buttonAndHandler(u'Apply')
-  ...     def handleApply(self, action):
-  ...         data, errors = self.extractData()
-  ...         print data['age'] # ... or do stuff
-
-  >>> MyView = wrap_form(MyForm)
-
-Then, register ``MyView`` as a ``browser:page``.
-
-The ``wrap_form`` function returns a browser view that embeds your
-form in a CMF layout template.  See the ``layout`` module for details.
-
-For more examples, please refer to the `z3c.form docs`_ and to `this
-how-to`_.
-
-
-.. _z3c.form docs: http://docs.carduner.net/z3c.form
-.. _this how-to: http://plone.org/documentation/how-to/easy-forms-with-plone3

Modified: plone.z3cform/trunk/plone/z3cform/crud/README.txt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/crud/README.txt	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/plone/z3cform/crud/README.txt	2010-02-17 02:46:42 UTC (rev 109087)
@@ -1,11 +1,12 @@
-Crud
-====
+CRUD (Create, Read, Update and Delete) forms
+============================================
 
-This module gives you an abstract base class to make CRUD forms with.
-These forms give you by default a tabular view of the objects, where
-attributes of the object can be edited in-place.  Please refer to the
-``ICrudForm`` interface for more details.
+This module provides an abstract base class to create CRUD forms.
+By default, such forms provide a tabular view of multiple objects, whose
+attributes can be edited in-place.
 
+Please refer to the ``ICrudForm`` interface for more details.
+
   >>> from plone.z3cform.crud import crud
 
 Setup

Modified: plone.z3cform/trunk/plone/z3cform/crud/batch.txt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/crud/batch.txt	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/plone/z3cform/crud/batch.txt	2010-02-17 02:46:42 UTC (rev 109087)
@@ -1,7 +1,8 @@
 Batching
-========
+--------
 
-The BatchNavigation adapter is for rendering batch navigation.
+The BatchNavigation adapter is used for rendering batch navigation in CRUD
+forms.
 
   >>> from z3c.batching.batch import Batch
   >>> from plone.z3cform.crud.crud import BatchNavigation

Modified: plone.z3cform/trunk/plone/z3cform/fieldsets/README.txt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/fieldsets/README.txt	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/plone/z3cform/fieldsets/README.txt	2010-02-17 02:46:42 UTC (rev 109087)
@@ -1,13 +1,13 @@
-Fieldsets and extensible forms
-==============================
+Fieldsets and form extenders
+============================
 
-The ``fieldsets`` package provides support for groups/fieldsets and other
-modifications via "extender" adapters. The idea is that a third party
-component can modify the fields in the form and the way that they are grouped
-and ordered.
+The ``plone.z3cform.fieldsets`` package provides support for z3c.form groups
+(fieldsets) and other modifications via "extender" adapters. The idea is that
+a third party component can modify the fields in the form and the way that
+they are grouped and ordered.
 
 This support relies on a mixin class, which is itself a subclass of 
-z3c.form's GroupForm.
+z3c.form's ``GroupForm``.
 
     >>> from plone.z3cform.fieldsets import group, extensible
 
@@ -29,7 +29,7 @@
   ...     fields = field.Fields(ITest)
 
 Here, note the order of the base classes. Also note that we use an ordinary
-set of fields. This known as the default fieldset.
+set of fields directly on the form. This known as the default fieldset.
 
 This form should work as-is, i.e. we can update it:
 
@@ -111,7 +111,6 @@
   ...         
   ...         # Move 'baz' after 'bar'. This means it also moves gropu.
   ...         self.move('extra.baz', after='extra.bar')
-
   
   >>> provideAdapter(factory=ExtraBehaviorExtender, name=u"test.extender")
     

Deleted: plone.z3cform/trunk/plone/z3cform/form.pt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/form.pt	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/plone/z3cform/form.pt	2010-02-17 02:46:42 UTC (rev 109087)
@@ -1 +0,0 @@
-<metal:use use-macro="context/@@ploneform-macros/titlelessform" />

Deleted: plone.z3cform/trunk/plone/z3cform/layout.pt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/layout.pt	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/plone/z3cform/layout.pt	2010-02-17 02:46:42 UTC (rev 109087)
@@ -1,18 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:tal="http://xml.zope.org/namespaces/tal"
-      xmlns:metal="http://xml.zope.org/namespaces/metal"
-      xmlns:i18n="http://xml.zope.org/namespaces/i18n" 
-      metal:use-macro="context/main_template/macros/master">
-<body>
-
-<metal:slot metal:fill-slot="header" i18n:domain="cmf_default">
-  <h1 tal:content="view/label">View Title</h1>
-</metal:slot>
-
-<metal:slot metal:fill-slot="main" i18n:domain="cmf_default">
-  <div id="layout-contents">
-    <span tal:replace="structure view/contents" />
-  </div>
-</metal:slot>
-</body>
-</html>

Deleted: plone.z3cform/trunk/plone/z3cform/macros.pt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/macros.pt	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/plone/z3cform/macros.pt	2010-02-17 02:46:42 UTC (rev 109087)
@@ -1,89 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:metal="http://xml.zope.org/namespaces/metal"
-      xmlns:tal="http://xml.zope.org/namespaces/tal"
-      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
-      i18n:domain="plone.z3cform"
-      tal:omit-tag="">
-
-  <head></head>
-
-  <body>
-
-    <div class="form" metal:define-macro="form">
-
-      <h3 tal:condition="view/label | nothing">
-          <span tal:replace="view/label">Form title</span>:</h3>
-
-      <div class="description"
-           tal:condition="view/description | nothing"
-           tal:content="structure view/description">Form description</div>
-      <metal:define define-macro="titlelessform">
-	<div class="portalMessage"
-             tal:condition="view/status" tal:content="view/status">
-	</div>
-
-
-	<form action="." method="post"
-              tal:attributes="action request/getURL; enctype view/enctype">
-
-          <metal:define define-macro="fields">
-
-            <tal:widgets repeat="widget view/widgets/values">
-              <div class="row"
-                   tal:define="hidden python:widget.mode == 'hidden'"
-                   tal:omit-tag="hidden">
-
-		<metal:field define-macro="field">
-                  <div class="field"
-                       tal:define="error widget/error"
-                       tal:attributes="class python:'field' + (error and ' error' or '')">
-                    <label for=""
-                           tal:attributes="for widget/id"
-                           tal:condition="not:hidden">
-                      <span i18n:translate=""
-                            tal:content="widget/label">label</span>
-                    </label>
-
-                    <span class="fieldRequired" title="Required"
-                          tal:condition="python:widget.required and not hidden"
-                          i18n:translate="label_required"
-                          i18n:attributes="title title_required;">
-                      (Required)
-                    </span>
-
-                    <div class="formHelp"
-			 tal:define="description widget/field/description"
-			 i18n:translate=""
-			 tal:content="description"
-			 tal:condition="python:description and not hidden"
-			 >field description</div>
-
-                    <div tal:condition="error"
-			 tal:content="structure error/render">
-                      Error
-                    </div>
-
-                    <div class="widget">
-                      <input type="text" tal:replace="structure widget/render" />
-                    </div>
-                  </div>
-		</metal:field>
-
-              </div>
-            </tal:widgets>
-
-          </metal:define>
-
-          <metal:define define-macro="actions">
-            <div class="action" tal:repeat="action view/actions/values|nothing">
-              <input type="submit" tal:replace="structure action/render" />
-            </div>
-          </metal:define>
-
-	</form>
-      </metal:define>
-      </div>
-
-
-  </body>
-</html>

Deleted: plone.z3cform/trunk/plone/z3cform/subform.pt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/subform.pt	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/plone/z3cform/subform.pt	2010-02-17 02:46:42 UTC (rev 109087)
@@ -1,10 +0,0 @@
-<div xmlns="http://www.w3.org/1999/xhtml"
-     xmlns:tal="http://xml.zope.org/namespaces/tal"
-     xmlns:metal="http://xml.zope.org/namespaces/metal"
-     tal:attributes="class view/css_class|nothing">
-  <h3 tal:replace="structure view/heading|nothing" />
-  <div tal:replace="structure view/contents_top|nothing" />
-  <metal:use use-macro="context/@@ploneform-macros/fields" />
-  <metal:use use-macro="context/@@ploneform-macros/actions" />
-  <div tal:replace="structure view/contents_bottom|nothing" />
-</div>

Modified: plone.z3cform/trunk/plone/z3cform/tests.py
===================================================================
--- plone.z3cform/trunk/plone/z3cform/tests.py	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/plone/z3cform/tests.py	2010-02-17 02:46:42 UTC (rev 109087)
@@ -77,11 +77,6 @@
         layout_txt, inputs_txt, fieldsets_txt, traversal_txt,
 
         doctest.DocFileSuite(
-           'README.txt',
-           setUp=testing.setUp, tearDown=testing.tearDown,
-           ),
-
-        doctest.DocFileSuite(
            'crud/README.txt',
            setUp=testing.setUp, tearDown=testing.tearDown,
            ),

Modified: plone.z3cform/trunk/setup.py
===================================================================
--- plone.z3cform/trunk/setup.py	2010-02-16 23:15:01 UTC (rev 109086)
+++ plone.z3cform/trunk/setup.py	2010-02-17 02:46:42 UTC (rev 109087)
@@ -7,9 +7,9 @@
 def description():
     join = lambda *paths: os.path.join('plone', 'z3cform', *paths)
     return (open('README.txt').read() + '\n' +
-            open(join('README.txt')).read() + '\n' +
+            open(join('fieldsets', 'README.txt')).read() + '\n' +
             open(join('crud', 'README.txt')).read() + '\n' +
-            open(join('fieldsets', 'README.txt')).read() + '\n' +
+            open(join('crud', 'batch.txt')).read() + '\n' +
             open(os.path.join('docs', 'HISTORY.txt')).read() + '\n')
 
 setup(name='plone.z3cform',



More information about the checkins mailing list