[Checkins] SVN: megrok.z3cform/ - Initial import of a base support of z3c.form in grok.

Sylvain Viollon sylvain at infrae.com
Mon Aug 25 09:39:06 EDT 2008


Log message for revision 90205:
  
  - Initial import of a base support of z3c.form in grok.
  
  

Changed:
  A   megrok.z3cform/
  A   megrok.z3cform/trunk/
  A   megrok.z3cform/trunk/README.txt
  A   megrok.z3cform/trunk/docs/
  A   megrok.z3cform/trunk/docs/HISTORY.txt
  A   megrok.z3cform/trunk/setup.cfg
  A   megrok.z3cform/trunk/setup.py
  A   megrok.z3cform/trunk/src/
  A   megrok.z3cform/trunk/src/megrok/
  A   megrok.z3cform/trunk/src/megrok/__init__.py
  A   megrok.z3cform/trunk/src/megrok/z3cform/
  A   megrok.z3cform/trunk/src/megrok/z3cform/__init__.py
  A   megrok.z3cform/trunk/src/megrok/z3cform/components.py
  A   megrok.z3cform/trunk/src/megrok/z3cform/configure.zcml
  A   megrok.z3cform/trunk/src/megrok/z3cform/interfaces.py
  A   megrok.z3cform/trunk/src/megrok/z3cform/meta.py
  A   megrok.z3cform/trunk/src/megrok/z3cform/meta.zcml
  A   megrok.z3cform/trunk/src/megrok/z3cform/tests/
  A   megrok.z3cform/trunk/src/megrok/z3cform/tests/__init__.py

-=-
Added: megrok.z3cform/trunk/README.txt
===================================================================
--- megrok.z3cform/trunk/README.txt	                        (rev 0)
+++ megrok.z3cform/trunk/README.txt	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,4 @@
+Introduction
+============
+
+


Property changes on: megrok.z3cform/trunk/README.txt
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision

Added: megrok.z3cform/trunk/docs/HISTORY.txt
===================================================================
--- megrok.z3cform/trunk/docs/HISTORY.txt	                        (rev 0)
+++ megrok.z3cform/trunk/docs/HISTORY.txt	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,8 @@
+Changelog
+=========
+
+0.1 - Unreleased
+----------------
+
+* Initial release
+


Property changes on: megrok.z3cform/trunk/docs/HISTORY.txt
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision

Added: megrok.z3cform/trunk/setup.cfg
===================================================================
--- megrok.z3cform/trunk/setup.cfg	                        (rev 0)
+++ megrok.z3cform/trunk/setup.cfg	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = dev
+tag_svn_revision = true

Added: megrok.z3cform/trunk/setup.py
===================================================================
--- megrok.z3cform/trunk/setup.py	                        (rev 0)
+++ megrok.z3cform/trunk/setup.py	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,41 @@
+from setuptools import setup, find_packages
+import os
+
+version = '0.1'
+
+setup(name='megrok.z3cform',
+      version=version,
+      description="Z3C Forms support for Grok",
+      long_description=open("README.txt").read() + "\n" +
+                       open(os.path.join("docs", "HISTORY.txt")).read(),
+      # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[
+          "Environment :: Web Environment",
+          "Intended Audience :: Developers",
+          "License :: OSI Approved :: Zope Public License",
+          "Programming Language :: Python",
+          "Topic :: Software Development :: Libraries :: Python Modules",
+          "Framework :: Zope3",
+        ],
+      keywords='z3c forms grok',
+      author='Sylvain Viollon',
+      author_email='grok-dev at zope.org',
+      url='http://svn.zope.org/megrok.z3cform/trunk',
+      license='ZPL',
+      packages=find_packages('src', exclude=['ez_setup']),
+      package_dir={'': 'src'},
+      namespace_packages=['megrok'],
+      include_package_data=True,
+      zip_safe=False,
+      # We need to factor out the dependency on grokcore.formlib
+      install_requires=[
+          'setuptools',
+          'grokcore.component',
+          'grokcore.view',
+          'grokcore.formlib',
+          'z3c.form'
+      ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )


Property changes on: megrok.z3cform/trunk/setup.py
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision

Added: megrok.z3cform/trunk/src/megrok/__init__.py
===================================================================
--- megrok.z3cform/trunk/src/megrok/__init__.py	                        (rev 0)
+++ megrok.z3cform/trunk/src/megrok/__init__.py	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)


Property changes on: megrok.z3cform/trunk/src/megrok/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision

Added: megrok.z3cform/trunk/src/megrok/z3cform/__init__.py
===================================================================
--- megrok.z3cform/trunk/src/megrok/z3cform/__init__.py	                        (rev 0)
+++ megrok.z3cform/trunk/src/megrok/z3cform/__init__.py	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,2 @@
+
+from components import Form, AddForm, EditForm, DisplayForm


Property changes on: megrok.z3cform/trunk/src/megrok/z3cform/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision

Added: megrok.z3cform/trunk/src/megrok/z3cform/components.py
===================================================================
--- megrok.z3cform/trunk/src/megrok/z3cform/components.py	                        (rev 0)
+++ megrok.z3cform/trunk/src/megrok/z3cform/components.py	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,111 @@
+
+
+from zope import interface
+from zope import component
+from zope.publisher.publish import mapply
+from zope.pagetemplate.interfaces import IPageTemplate
+
+import martian
+import grokcore.view
+from grokcore.view.interfaces import ITemplate as IGrokTemplate
+
+from megrok.z3cform.interfaces import IGrokForm
+
+from z3c.form import form, field
+from z3c.form.interfaces import IFormLayer
+
+
+class DefaultFields(field.Fields):
+    """Marker for default fields.
+    """
+
+class GrokForm(object):
+    """A z3c grok form. This is based on the GrokForm designed for
+    Formlib.
+    """
+
+    interface.implements(IGrokForm)
+    martian.baseclass()
+
+    fields = DefaultFields()
+
+    def __init__(self, *args):
+        super(GrokForm, self).__init__(*args)
+        self.__name__ = self.__view_name__
+        self.static = component.queryAdapter(
+            self.request, interface.Interface,
+            name = self.module_info.package_dotted_name)
+
+    def update(self):
+        """Subclasses can override this method just like on regular
+        grok.Views. It will be called before any form processing
+        happens."""
+
+    def updateForm(self):
+        """Update the form, i.e. process form input using widgets.
+
+        On z3c.form forms, this is what the update() method is.
+        In grok views, the update() method has a different meaning.
+        That's why this method is called update_form() in grok forms.
+        """
+        super(GrokForm, self).update()
+
+    def _render_template(self):
+        assert not (self.template is None)
+        if IGrokTemplate.providedBy(self.template):
+            return super(GrokForm, self)._render_template()
+        return self.template()
+
+    def render(self):
+        """People don't have to define a render method here, and we
+        have to use the one provided by z3c.form (people can provide
+        render method in grok), but we have to call the template
+        correctly.
+        """
+
+        if self.template is None:
+            self.template = component.getMultiAdapter((self, self.request), IPageTemplate)
+        return self._render_template()
+
+
+    render.base_method = True   # Mark the method to prevent people to
+                                # override it.
+
+    def __call__(self):
+        mapply(self.update, (), self.request)
+        if self.request.response.getStatus() in (302, 303):
+            # A redirect was triggered somewhere in update().  Don't
+            # continue rendering the template or doing anything else.
+            return
+
+        self.updateForm()
+        return self.render()
+
+
+class Form(GrokForm, form.Form, grokcore.view.View):
+    """Normal z3c form.
+    """
+
+    martian.baseclass()
+
+
+class AddForm(GrokForm, form.AddForm, grokcore.view.View):
+    """z3c add form.
+    """
+
+    martian.baseclass()
+
+
+class EditForm(GrokForm, form.EditForm, grokcore.view.View):
+    """z3c edit form.
+    """
+
+    martian.baseclass()
+
+
+class DisplayForm(GrokForm, form.DisplayForm, grokcore.view.View):
+    """z3c display form.
+    """
+    
+    martian.baseclass()
+


Property changes on: megrok.z3cform/trunk/src/megrok/z3cform/components.py
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision

Added: megrok.z3cform/trunk/src/megrok/z3cform/configure.zcml
===================================================================
--- megrok.z3cform/trunk/src/megrok/z3cform/configure.zcml	                        (rev 0)
+++ megrok.z3cform/trunk/src/megrok/z3cform/configure.zcml	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,6 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope">
+
+  <include package="z3c.form" file="meta.zcml" />
+
+</configure>

Added: megrok.z3cform/trunk/src/megrok/z3cform/interfaces.py
===================================================================
--- megrok.z3cform/trunk/src/megrok/z3cform/interfaces.py	                        (rev 0)
+++ megrok.z3cform/trunk/src/megrok/z3cform/interfaces.py	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,7 @@
+
+from zope import interface
+
+class IGrokForm(interface.Interface):
+    """A grok z3c form. This marker interface is used to have a
+    different default template.
+    """


Property changes on: megrok.z3cform/trunk/src/megrok/z3cform/interfaces.py
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision

Added: megrok.z3cform/trunk/src/megrok/z3cform/meta.py
===================================================================
--- megrok.z3cform/trunk/src/megrok/z3cform/meta.py	                        (rev 0)
+++ megrok.z3cform/trunk/src/megrok/z3cform/meta.py	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,54 @@
+
+from zope.interface.interfaces import IInterface
+
+import grokcore.component
+import grokcore.view
+from grokcore.view.meta import ViewGrokker
+from grokcore.formlib.formlib import most_specialized_interfaces
+
+from martian.error import GrokError
+import martian
+
+from megrok.z3cform import components
+from z3c.form import field
+
+def get_auto_fields(context):
+    """Get the form fields for context.
+
+    This methods is the same than for formlib implementation, but use
+    z3cform fields instead.
+    """
+    # for an interface context, we generate them from that interface
+    if IInterface.providedBy(context):
+        return field.Fields(context)
+    # if we have a non-interface context, we're autogenerating them
+    # from any schemas defined by the context
+    fields = field.Fields(*most_specialized_interfaces(context))
+    # we pull in this field by default, but we don't want it in our form
+    fields = field.omit('__name__')
+    return fields
+
+
+class FormGrokker(martian.ClassGrokker):
+
+    martian.component(components.GrokForm)
+    martian.directive(grokcore.component.context)
+    # execute this grokker before grokcore.view's ViewGrokker
+    martian.priority(martian.priority.bind().get(ViewGrokker) + 10)
+
+    def execute(self, form, context, **kw):
+
+        # Set fields by default.
+        if isinstance(form.fields, components.DefaultFields):
+            form.fields = get_auto_fields(context)
+
+        # Don't override render method.
+        if not getattr(form.render, 'base_method', False):
+            raise GrokError(
+                "It is not allowed to specify a custom 'render' "
+                "method for form %r. Forms either use the default "
+                "template or a custom-supplied one." % factory,
+                factory)
+
+        return True
+


Property changes on: megrok.z3cform/trunk/src/megrok/z3cform/meta.py
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision

Added: megrok.z3cform/trunk/src/megrok/z3cform/meta.zcml
===================================================================
--- megrok.z3cform/trunk/src/megrok/z3cform/meta.zcml	                        (rev 0)
+++ megrok.z3cform/trunk/src/megrok/z3cform/meta.zcml	2008-08-25 13:39:05 UTC (rev 90205)
@@ -0,0 +1,10 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:grok="http://namespaces.zope.org/grok">
+
+  <include package="z3c.form" file="meta.zcml" />
+  <include package="grokcore.component" file="meta.zcml" />
+
+  <grok:grok package=".meta" />
+
+</configure>

Added: megrok.z3cform/trunk/src/megrok/z3cform/tests/__init__.py
===================================================================


Property changes on: megrok.z3cform/trunk/src/megrok/z3cform/tests/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision



More information about the Checkins mailing list