[Checkins] SVN: megrok.z3cform.base/ 'megrok.z3cform.base' initial import. We are creating the tags, branches and trunk (imported from git://devel.dolmen-project.org)

Souheil CHELFOUH souheil at chelfouh.com
Mon Sep 14 11:39:29 EDT 2009


Log message for revision 103947:
  'megrok.z3cform.base' initial import. We are creating the tags, branches and trunk (imported from git://devel.dolmen-project.org)
  

Changed:
  A   megrok.z3cform.base/branches/
  A   megrok.z3cform.base/tags/
  A   megrok.z3cform.base/trunk/
  A   megrok.z3cform.base/trunk/README.txt
  A   megrok.z3cform.base/trunk/bootstrap.py
  A   megrok.z3cform.base/trunk/buildout.cfg
  A   megrok.z3cform.base/trunk/docs/
  A   megrok.z3cform.base/trunk/docs/HISTORY.txt
  A   megrok.z3cform.base/trunk/setup.py
  A   megrok.z3cform.base/trunk/src/
  A   megrok.z3cform.base/trunk/src/megrok/
  A   megrok.z3cform.base/trunk/src/megrok/__init__.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/__init__.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/__init__.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/components.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/configure.zcml
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/default_form_layer.zcml
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/directives.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/ftesting.zcml
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/interfaces.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/__init__.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic_templates/
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic_templates/basicdisplay.pt
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic_templates/basicform.pt
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.zcml
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/__init__.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_int.pt
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_string.pt
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_text.pt
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/new_string.pt
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_field.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_layout.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_layout_templates/
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_layout_templates/mylayout.pt
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_render.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_utils.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_widgettemplate.py
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_widgettemplate_templates/
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_widgettemplate_templates/mylayout.pt
  A   megrok.z3cform.base/trunk/src/megrok/z3cform/base/utils.py
  A   megrok.z3cform.base/trunk/versions.cfg

-=-
Added: megrok.z3cform.base/trunk/README.txt
===================================================================
--- megrok.z3cform.base/trunk/README.txt	                        (rev 0)
+++ megrok.z3cform.base/trunk/README.txt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,4 @@
+Introduction
+============
+
+

Added: megrok.z3cform.base/trunk/bootstrap.py
===================================================================
--- megrok.z3cform.base/trunk/bootstrap.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/bootstrap.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,55 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+
+$Id: bootstrap.py 90212 2008-08-25 14:15:22Z thefunny42 $
+"""
+
+import os, shutil, sys, tempfile, urllib2
+
+tmpeggs = tempfile.mkdtemp()
+
+try:
+    import pkg_resources
+except ImportError:
+    ez = {}
+    exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
+                         ).read() in ez
+    ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
+
+    import pkg_resources
+
+cmd = 'from setuptools.command.easy_install import main; main()'
+if sys.platform == 'win32':
+    cmd = '"%s"' % cmd # work around spawn lamosity on windows
+
+ws = pkg_resources.working_set
+assert os.spawnle(
+    os.P_WAIT, sys.executable, sys.executable,
+    '-c', cmd, '-mqNxd', tmpeggs, 'zc.buildout',
+    dict(os.environ,
+         PYTHONPATH=
+         ws.find(pkg_resources.Requirement.parse('setuptools')).location
+         ),
+    ) == 0
+
+ws.add_entry(tmpeggs)
+ws.require('zc.buildout')
+import zc.buildout.buildout
+zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
+shutil.rmtree(tmpeggs)

Added: megrok.z3cform.base/trunk/buildout.cfg
===================================================================
--- megrok.z3cform.base/trunk/buildout.cfg	                        (rev 0)
+++ megrok.z3cform.base/trunk/buildout.cfg	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,14 @@
+[buildout]
+develop = .
+parts = test
+extends = versions.cfg
+versions = versions
+newest = false
+
+[versions]
+z3c.pagelet = 1.0.3
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = megrok.z3cform.base [test]
+defaults = ['--tests-pattern', '^f?tests$', '-v', '-c']

Added: megrok.z3cform.base/trunk/docs/HISTORY.txt
===================================================================
--- megrok.z3cform.base/trunk/docs/HISTORY.txt	                        (rev 0)
+++ megrok.z3cform.base/trunk/docs/HISTORY.txt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,7 @@
+Changelog
+=========
+
+0.1 (xxxx-xx-xx)
+----------------
+
+* Initial release

Added: megrok.z3cform.base/trunk/setup.py
===================================================================
--- megrok.z3cform.base/trunk/setup.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/setup.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,46 @@
+from setuptools import setup, find_packages
+import os
+
+version = '0.1'
+
+install_requires = [
+    'setuptools',
+    'grokcore.component',
+    'grokcore.viewlet',
+    'grokcore.view >= 1.1',
+    'grokcore.formlib',
+    'z3c.form',
+    'megrok.layout >= 0.6',
+    'megrok.pagetemplate',
+    ]
+
+
+test_requires = install_requires + ['grok >= 0.14',]
+
+
+setup(name='megrok.z3cform.base',
+      version=version,
+      description="megrok extension for z3cform",
+      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=[
+        "Programming Language :: Python",
+        "Topic :: Software Development :: Libraries :: Python Modules",
+        ],
+      keywords='',
+      author='Christian Klinger',
+      author_email='cklinger at novareto.de',
+      url='',
+      license='GPL',
+      packages=find_packages('src', exclude=['ez_setup']),
+      package_dir={'': 'src'},
+      namespace_packages=['megrok', 'megrok.z3cform'],
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=install_requires,
+      extras_require={'test': test_requires,},
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )

Added: megrok.z3cform.base/trunk/src/megrok/__init__.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/__init__.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/__init__.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -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__)

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/__init__.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/__init__.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/__init__.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -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__)

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/__init__.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/__init__.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/__init__.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+
+# Useful import from z3c.form
+from z3c.form import widget, button, action
+from z3c.form.form import extends, applyChanges
+from z3c.form.field import Field, Fields, FieldWidgets
+from z3c.form.interfaces import IFieldWidget, IFormLayer
+from z3c.form.interfaces import DISPLAY_MODE, INPUT_MODE
+
+# Public interface
+from directives import field
+from utils import apply_data_event
+from interfaces import IGrokForm
+from components import WidgetTemplate
+from components import Form, AddForm, EditForm, DisplayForm
+from components import PageForm, PageAddForm, PageEditForm, PageDisplayForm
+
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/components.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/components.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/components.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+
+import megrok.layout
+import grokcore.view as grok
+
+from zope import interface
+from zope import component
+from zope.publisher.publish import mapply
+from zope.pagetemplate.interfaces import IPageTemplate
+
+from z3c.form import form
+from z3c.form.interfaces import IFormLayer
+
+from megrok.z3cform.base import Fields
+from megrok.z3cform.base.interfaces import IGrokForm
+from grokcore.view.interfaces import ITemplate as IGrokTemplate
+
+
+class DefaultFields(Fields):
+    """Marker for default fields.
+    """
+
+
+class GrokForm(object):
+    """A z3c grok form. This is based on the GrokForm designed for
+    Formlib.
+    """
+    grok.implements(IGrokForm)
+    grok.baseclass()
+
+    template = None
+    layout = None
+
+    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(self)
+
+    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):
+            return
+        self.updateForm()
+        if self.request.response.getStatus() in (302, 303):
+            return
+        return self.render()
+
+
+class PageGrokForm(GrokForm):
+    """A mixin using GrokForm and providing the rendering mechanisms
+    to use megrok.layout components.
+    """
+    def _render_template(self):
+        assert not (self.template is None)
+        if IGrokTemplate.providedBy(self.template):
+            return super(GrokForm, self)._render_template()
+        return self.template(self)
+
+    def __call__(self):
+        mapply(self.update, (), self.request)
+        if self.request.response.getStatus() in (302, 303):
+            return
+        self.updateForm()
+        if self.request.response.getStatus() in (302, 303):
+            return
+        if self.layout is None:
+            layout = component.getMultiAdapter(
+                (self.request, self.context), megrok.layout.ILayout)
+            return layout(self)
+        return self.layout()
+
+
+class Form(GrokForm, form.Form, grok.View):
+    """Normal z3c form.
+    """
+    grok.baseclass()
+
+
+class AddForm(GrokForm, form.AddForm, grok.View):
+    """z3c add form.
+    """
+    grok.baseclass()
+
+
+class EditForm(GrokForm, form.EditForm, grok.View):
+    """z3c edit form.
+    """
+    grok.baseclass()
+
+
+class DisplayForm(GrokForm, form.DisplayForm, grok.View):
+    """z3c display form.
+    """
+    grok.baseclass()
+
+
+class PageForm(PageGrokForm, form.Form, megrok.layout.Page):
+    """Normal z3c form with megrok.layout support.
+    """
+    grok.baseclass()
+
+
+class PageAddForm(PageGrokForm, form.AddForm, megrok.layout.Page):
+    """z3c add form with megrok.layout support.
+    """
+    grok.baseclass()
+
+    def _render_template(self):
+        assert not (self.template is None)
+        if self._finishedAdd:
+            self.request.response.redirect(self.nextURL())
+            return ""
+        if IGrokTemplate.providedBy(self.template):
+            return super(GrokForm, self)._render_template()
+        return self.template(self)
+
+
+class PageEditForm(PageGrokForm, form.EditForm, megrok.layout.Page):
+    """z3c edit form with megrok.layout support.
+    """
+    grok.baseclass()
+
+
+class PageDisplayForm(PageGrokForm, form.DisplayForm, megrok.layout.Page):
+    """z3c display form with megrok.layout support.
+    """
+    grok.baseclass()
+
+
+class WidgetTemplate(object):
+    pass

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/configure.zcml
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/configure.zcml	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/configure.zcml	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,7 @@
+<configure
+   xmlns="http://namespaces.zope.org/zope">
+
+  <include package="z3c.form" />
+  <include package="grokcore.view" />
+
+</configure>

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/default_form_layer.zcml
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/default_form_layer.zcml	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/default_form_layer.zcml	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,12 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:grok="http://namespaces.zope.org/grok">
+
+  <class class="zope.publisher.http.HTTPRequest">
+    <implements interface="z3c.form.interfaces.IFormLayer" />
+  </class>
+
+  <grok:grok package=".layout" />
+
+</configure>
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/directives.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/directives.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/directives.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,23 @@
+import martian
+from martian import validateInterfaceOrClass
+from z3c.form import interfaces
+
+
+class field(martian.Directive):
+    scope = martian.CLASS
+    store = martian.ONCE
+    default = None
+    # validate = validateInterfaceOrClass
+
+
+class mode(martian.Directive):
+    scope = martian.CLASS
+    store = martian.ONCE
+    default = interfaces.INPUT_MODE
+    # validate = validateInterfaceOrClass
+
+
+class widget(martian.Directive):
+    scope = martian.CLASS
+    store = martian.ONCE
+    default = None

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/ftesting.zcml
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/ftesting.zcml	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/ftesting.zcml	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,42 @@
+<configure
+   xmlns="http://namespaces.zope.org/zope"
+   xmlns:grok="http://namespaces.zope.org/grok"
+   >
+
+  <include package="grok" />
+  <include package="grok" file="meta.zcml" />
+  <include package="megrok.pagetemplate" file="meta.zcml" />
+   
+
+  <include package="megrok.z3cform.base" file="meta.zcml" />
+  <include package="megrok.z3cform.base" />
+  <include package="megrok.z3cform.base" file="default_form_layer.zcml" />
+
+  <grok:grok package="megrok.z3cform.base.tests" />
+
+  <securityPolicy
+      component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy"
+      />
+
+  <unauthenticatedPrincipal
+      id="zope.anybody"
+      title="Unauthenticated Principal"
+      />
+  <grant
+      permission="zope.View"
+      principal="zope.anybody"
+      />
+
+  <principal
+      id="zope.mgr"
+      title="Manager"
+      login="mgr"
+      password="mgrpw"
+      />
+
+  <role id="zope.Manager" title="Site Manager" />
+  <grantAll role="zope.Manager" />
+  <grant role="zope.Manager" principal="zope.mgr" />
+
+</configure>
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/interfaces.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/interfaces.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/interfaces.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+
+from z3c.form.interfaces import IButtonForm, IHandlerForm
+
+
+class IGrokForm(IButtonForm, IHandlerForm):
+    """A grok z3c form. This marker interface is used to have a
+    different default template.
+    """

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/__init__.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/__init__.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/__init__.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1 @@
+#make me a package

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,9 @@
+from grokcore.viewlet import view
+from z3c.form.interfaces import IForm, IDisplayForm
+from megrok.pagetemplate import PageTemplate
+
+class BasicForm(PageTemplate):
+    view(IForm)
+
+class BasicDisplay(PageTemplate):
+    view(IDisplayForm)

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic_templates/basicdisplay.pt
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic_templates/basicdisplay.pt	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic_templates/basicdisplay.pt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,25 @@
+<html>
+ <body>
+   <div class="main">
+    <tal:block repeat="widget view/widgets/values">
+      <div id="" class="row"
+           tal:attributes="id string:${widget/id}-row"
+           tal:condition="python:widget.mode != 'hidden'">
+          <div class="label">
+            <label tal:attributes="for widget/id">
+              <span i18n:translate=""
+                  tal:content="widget/label">label</span>
+            </label>
+          </div>
+          <div class="widget" tal:content="structure widget/render">
+            <input type="text" size="24" value="" />
+          </div>
+      </div>
+      <input type="hidden" value=""
+             tal:condition="python:widget.mode == 'hidden'"
+             tal:replace="structure widget/render" />
+    </tal:block>
+    </div>
+ </body>
+</html>
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic_templates/basicform.pt
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic_templates/basicform.pt	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/layout/basic_templates/basicform.pt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,85 @@
+<form action="."
+      i18n:domain="dolmen"
+      tal:attributes="action request/URL;
+              class string:form-${view/__name__}"
+      method="post"
+      enctype="multipart/form-data">
+  
+  <div class="form-status"
+       tal:define="status view/status"
+       tal:condition="status">
+    
+    <dl class="info-message"
+    tal:condition="view/status">
+      <dt i18n:translate="">Status</dt>
+      <dd tal:content="view/status" />
+    </dl>
+  </div>
+  
+  <div class="errors">
+    <ul class="errors"
+    tal:condition="view/widgets/errors">
+      <li tal:repeat="error view/widgets/errors">
+    <strong tal:condition="error/widget"
+        tal:replace="error/widget/label" />
+    <span tal:replace="structure error/render">Error Type</span>
+      </li>
+    </ul>
+  </div>
+  
+  <h1 tal:condition="view/label" tal:content="view/label" />
+  
+  <p class="documentDescription"
+     tal:content="view/description|nothing" />
+  
+  <input type="hidden" name="camefrom"
+     tal:attributes="value request/camefrom | nothing" />
+  
+  <fieldset tal:define="form_name view/form_name|nothing"
+        tal:omit-tag="not:form_name">
+    <legend tal:condition="form_name"
+        tal:content="form_name">Form name</legend>
+    
+    <div id="edition-fields">
+      <tal:block tal:repeat="widget view/widgets/values">
+    <div tal:define="description widget/description|nothing;
+             error widget/error;
+             error_class python:error and 'errored-field' or ''"
+         tal:attributes="class string:field ${error_class}">
+      <label tal:attributes="for widget/id">
+        <span i18n:translate=""
+          tal:content="widget/label">label</span>
+        <span class="fieldRequired" title="Required"
+          tal:condition="widget/required"
+          i18n:translate="label_required"
+          i18n:attributes="title title_required;">
+          <span class="textual-info">(Required)</span>
+        </span>
+      </label>
+      <div class="formHelp"
+           i18n:translate=""
+           tal:content="description"
+           tal:condition="description"
+           >field description</div>
+      <div class="field-error"
+           tal:condition="widget/error">
+        <span tal:replace="structure widget/error/render">error</span>
+      </div>
+      <div class="widget"
+           tal:content="structure widget/render">
+        <input type="text" />
+      </div>
+    </div>
+      </tal:block>
+    </div>
+    
+    <div id="actionsView"  tal:condition="view/actions">
+      <span class="actionButtons">
+    <input tal:repeat="action view/actions/values"
+           tal:replace="structure action/render"
+           />
+      </span>
+    </div>
+    </fieldset>
+</form>
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,80 @@
+import martian
+import grokcore.view
+import grokcore.component
+import grokcore.viewlet
+
+from z3c.form import field
+from martian.error import GrokError
+from zope.interface import Interface
+from megrok.z3cform.base import directives
+from megrok.z3cform.base import components
+from zope.interface.interfaces import IInterface
+from grokcore.view.meta.views import ViewGrokker, default_view_name
+from z3c.form.zcml import widgetTemplateDirective
+from grokcore.formlib.formlib import most_specialized_interfaces
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+
+
+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 = fields.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." % form,
+                form)
+
+        return True
+
+
+class WidgetTemplateGrokker(martian.ClassGrokker):
+    """ grokker for widget templates """
+    martian.component(components.WidgetTemplate)
+    martian.directive(grokcore.component.context, default=Interface)
+    martian.directive(grokcore.view.layer, default=IDefaultBrowserLayer)
+    martian.directive(grokcore.view.template)
+    martian.directive(grokcore.viewlet.view)
+    martian.directive(directives.field)
+    martian.directive(directives.mode)
+    martian.directive(directives.widget)
+
+    def grok(self, name, factory, module_info, **kw):
+        factory.module_info = module_info
+        return super(WidgetTemplateGrokker, self).grok(
+                          name, factory, module_info, **kw)
+
+    def execute(self, factory, config, context, layer,
+                template, view, field, widget, mode, **kw):
+        template_path = '/'.join(factory.module_info.path.split('/')[:-1])
+        template = "%s/%s" %(template_path, template)
+        widgetTemplateDirective(config, template, context, layer,
+                    view=view, field=field, widget=widget, mode=mode)
+        return True

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.zcml
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.zcml	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/meta.zcml	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,12 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:grok="http://namespaces.zope.org/grok">
+
+  <include package="z3c.form" file="meta.zcml" />
+  <include package="grokcore.view" file="meta-minimal.zcml" />
+  <include package="megrok.layout" file="meta.zcml" />
+
+  <grok:grok package=".meta" />
+
+</configure>
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/__init__.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/__init__.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/__init__.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,9 @@
+import os.path                                                                  
+import megrok.z3cform.base
+from zope.app.testing.functional import ZCMLLayer
+
+ftesting_zcml = os.path.join(os.path.dirname(megrok.z3cform.base.__file__),
+                             'ftesting.zcml')
+FunctionalLayer = ZCMLLayer(ftesting_zcml, __name__, 'FunctionalLayer',
+                            allow_teardown=True)
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_int.pt
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_int.pt	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_int.pt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1 @@
+<span> This is custom integer widget for zope.schema.Int Fields </span>

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_string.pt
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_string.pt	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_string.pt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,36 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      tal:omit-tag="">
+    <span> Custom Widget </span>
+    <input id="" name="" class="" title="" lang="" disabled=""
+           readonly="" alt="" tabindex="" accesskey="" size="" maxlength=""
+           style="" value="" type="text"
+           tal:attributes="id view/id;
+                           name view/name;
+                           class view/klass;
+                           style view/style;
+                           title view/title;
+                           lang view/lang;
+                           onclick view/onclick;
+                           ondblclick view/ondblclick;
+                           onmousedown view/onmousedown;
+                           onmouseup view/onmouseup;
+                           onmouseover view/onmouseover;
+                           onmousemove view/onmousemove;
+                           onmouseout view/onmouseout;
+                           onkeypress view/onkeypress;
+                           onkeydown view/onkeydown;
+                           onkeyup view/onkeyup;
+                           value view/value;
+                           disabled view/disabled;
+                           tabindex view/tabindex;
+                           onfocus view/onfocus;
+                           onblur view/onblur;
+                           onchange view/onchange;
+                           readonly view/readonly;
+                           alt view/alt;
+                           accesskey view/accesskey;
+                           onselect view/onselect;
+                           size view/size;
+                           maxlength view/maxlength" />
+</html>

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_text.pt
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_text.pt	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/custom_text.pt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1 @@
+<span> Custom Text Widget </span>

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/new_string.pt
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/new_string.pt	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/templates/new_string.pt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1 @@
+    <span> Extra Widget </span>

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_field.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_field.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_field.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,62 @@
+"""
+  >>> manfred = Mammoth()
+
+  >>> from zope import component
+  >>> from zope.interface import alsoProvides
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+Check that fields have been created on the edition page:
+
+  >>> view = component.getMultiAdapter((manfred, request), name='edit')
+  >>> len(view.fields)
+  2
+  >>> [field.__name__ for field in view.fields.values()]
+  ['name', 'age']
+
+
+Does the field functions (omit, select, ...) work
+
+  >>> index = component.getMultiAdapter((manfred, request), name='index')
+  >>> len(index.fields)
+  1
+
+  >>> 'name' in index.fields.keys()
+  True
+
+"""
+import grokcore.component as grok
+
+from zope import interface, schema
+from zope.schema.fieldproperty import FieldProperty
+from megrok.z3cform.base import EditForm, DisplayForm
+from z3c.form import field
+
+
+class IMammoth(interface.Interface):
+    name = schema.TextLine(title=u"Name")
+    age = schema.Int(title=u"Age")
+
+
+class Mammoth(grok.Context):
+    interface.implements(IMammoth)
+
+    name = FieldProperty(IMammoth['name'])
+    age = FieldProperty(IMammoth['age'])
+
+
+class Edit(EditForm):
+    pass
+
+
+class Index(DisplayForm):
+    fields = field.Fields(IMammoth).omit('age') 
+
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.z3cform.base.tests import FunctionalLayer
+    suite = doctest.DocTestSuite(optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
+    suite.layer = FunctionalLayer
+    return suite
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_layout.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_layout.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_layout.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,194 @@
+"""
+  >>> from zope.app.testing.functional import getRootFolder
+  >>> manfred = Mammoth()
+  >>> getRootFolder()["manfred"] = manfred 
+
+  >>> from zope import component
+  >>> from zope.interface import alsoProvides
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+Add Form
+
+  >>> add = component.getMultiAdapter((manfred, request), name='add')
+  >>> print add()
+  <html>                                                                           
+   <body>
+     <div class="layout"><form action="http://127.0.0.1" method="post"
+        enctype="multipart/form-data" class="form-add">
+    <div class="errors">
+    </div>
+    <p class="documentDescription"></p>
+    <input type="hidden" name="camefrom" />
+      <div id="edition-fields">
+      <div class="field ">
+        <label for="form-widgets-name">
+          <span>Name</span>
+          <span class="fieldRequired" title="Required">
+            <span class="textual-info">(Required)</span>
+          </span>
+        </label>
+        <div class="widget"> 
+      <input id="form-widgets-name" name="form.widgets.name"
+             class="text-widget required textline-field"
+             value="" type="text" />
+  </div>
+      </div>
+      <div class="field ">
+        <label for="form-widgets-age">
+          <span>Age</span>
+          <span class="fieldRequired" title="Required">
+            <span class="textual-info">(Required)</span>
+          </span>
+        </label>
+        <div class="widget"> 
+      <input id="form-widgets-age" name="form.widgets.age"
+             class="text-widget required int-field" value=""
+             type="text" />
+  </div>
+      </div>
+      </div>
+      <div id="actionsView">
+        <span class="actionButtons">
+  <input id="form-buttons-add" name="form.buttons.add"
+         class="submit-widget button-field" value="Add"
+         type="submit" />
+        </span>
+      </div>
+  </form>
+  </div>
+   </body>
+  </html>
+
+
+Check that fields have been created on the edition page:
+
+  >>> view = component.getMultiAdapter((manfred, request), name='edit')
+  >>> view
+  <megrok.z3cform.base.tests.test_layout.Edit object at ...>
+
+  If we call the EditPage we found it in the renderd Layout
+  
+  >>> '<div class="layout">' in view()
+  True
+
+If we call the render method we get the edit-page without the layout
+
+  >>> view.render().startswith('<form action="http://127.0.0.1"')
+  True 
+
+Does the handy url function works
+
+  >>> view.url()
+  'http://127.0.0.1/manfred/edit'
+
+We set in the update method of our EditForm the property updateMaker
+to true. 
+
+  >>> view.updateMarker
+  True
+
+Now let us try to render the complete edit form
+
+  >>> print view()
+  <html>                                                                           
+   <body>
+     <div class="layout"><form action="http://127.0.0.1" method="post"
+        enctype="multipart/form-data" class="form-edit">
+    <div class="errors">
+    </div>
+    <p class="documentDescription"></p>
+    <input type="hidden" name="camefrom" />
+      <div id="edition-fields">
+      <div class="field ">
+        <label for="form-widgets-name">
+          <span>Name</span>
+          <span class="fieldRequired" title="Required">
+            <span class="textual-info">(Required)</span>
+          </span>
+        </label>
+        <div class="widget"> 
+      <input id="form-widgets-name" name="form.widgets.name"
+             class="text-widget required textline-field"
+             value="" type="text" />
+  </div>
+      </div>
+      <div class="field ">
+        <label for="form-widgets-age">
+          <span>Age</span>
+          <span class="fieldRequired" title="Required">
+            <span class="textual-info">(Required)</span>
+          </span>
+        </label>
+        <div class="widget"> 
+      <input id="form-widgets-age" name="form.widgets.age"
+             class="text-widget required int-field" value=""
+             type="text" />
+  </div>
+      </div>
+      </div>
+      <div id="actionsView">
+        <span class="actionButtons">
+  <input id="form-buttons-apply" name="form.buttons.apply"
+         class="submit-widget button-field" value="Apply"
+         type="submit" />
+        </span>
+      </div>
+  </form>
+  </div>
+   </body>
+  </html>
+
+
+
+"""
+import megrok.layout
+import grokcore.component as grok
+import megrok.z3cform.base as z3cform
+
+from z3c.form import button, field
+from zope import interface, schema
+from zope.app.container.contained import Contained
+from zope.schema.fieldproperty import FieldProperty
+
+
+class IMammoth(interface.Interface):
+    name = schema.TextLine(title=u"Name")
+    age = schema.Int(title=u"Age")
+
+
+class Mammoth(Contained, grok.Context):
+    interface.implements(IMammoth)
+    name = FieldProperty(IMammoth['name'])
+    age = FieldProperty(IMammoth['age'])
+
+
+class MyLayout(megrok.layout.Layout):
+    grok.context(Mammoth)
+
+
+class Add(z3cform.PageAddForm):
+    fields = field.Fields(IMammoth)
+
+
+class Edit(z3cform.PageEditForm):
+    fields = field.Fields(IMammoth)
+
+    def update(self):
+        self.updateMarker = True
+
+
+class View(z3cform.PageDisplayForm):
+    fields = field.Fields(IMammoth)
+
+
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.z3cform.base.tests import FunctionalLayer
+    suite = doctest.DocTestSuite(
+          optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+          )
+    suite.layer = FunctionalLayer
+    return suite 
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_layout_templates/mylayout.pt
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_layout_templates/mylayout.pt	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_layout_templates/mylayout.pt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,8 @@
+<html>                                                                           
+ <body>
+   <div class="layout" tal:content="structure view/render">
+         here comes the content
+   </div>
+ </body>
+</html>
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_render.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_render.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_render.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,182 @@
+"""
+megrok.z3cform.base render
+=====================
+
+basic-setup
+-----------
+
+  >>> manfred = Mammoth()
+  >>> from zope import component
+  >>> from zope.interface import alsoProvides
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+add forms
+---------
+
+  >>> add = component.getMultiAdapter((manfred, request), name='add')
+  >>> print add()
+  <form action="http://127.0.0.1" method="post"
+        enctype="multipart/form-data" class="form-add">
+    <div class="errors">
+    </div>
+    <p class="documentDescription"></p>
+    <input type="hidden" name="camefrom" />
+      <div id="edition-fields">
+      <div class="field ">
+        <label for="form-widgets-name">
+          <span>Name</span>
+          <span class="fieldRequired" title="Required">
+            <span class="textual-info">(Required)</span>
+          </span>
+        </label>
+        <div class="widget"> 
+      <input id="form-widgets-name" name="form.widgets.name"
+             class="text-widget required textline-field"
+             value="" type="text" />
+  </div>
+      </div>
+      <div class="field ">
+        <label for="form-widgets-age">
+          <span>Age</span>
+          <span class="fieldRequired" title="Required">
+            <span class="textual-info">(Required)</span>
+          </span>
+        </label>
+        <div class="widget"> 
+      <input id="form-widgets-age" name="form.widgets.age"
+             class="text-widget required int-field" value=""
+             type="text" />
+  </div>
+      </div>
+      </div>
+      <div id="actionsView">
+        <span class="actionButtons">
+  <input id="form-buttons-add" name="form.buttons.add"
+         class="submit-widget button-field" value="Add"
+         type="submit" />
+        </span>
+      </div>
+  </form>
+
+
+edit-forms
+----------
+
+  >>> edit = component.getMultiAdapter((manfred, request), name='edit')
+  >>> print edit() 
+  <form action="http://127.0.0.1" method="post"
+        enctype="multipart/form-data" class="form-edit">
+    <div class="errors">
+    </div>
+    <p class="documentDescription"></p>
+    <input type="hidden" name="camefrom" />
+      <div id="edition-fields">
+      <div class="field ">
+        <label for="form-widgets-name">
+          <span>Name</span>
+          <span class="fieldRequired" title="Required">
+            <span class="textual-info">(Required)</span>
+          </span>
+        </label>
+        <div class="widget"> 
+      <input id="form-widgets-name" name="form.widgets.name"
+             class="text-widget required textline-field"
+             value="" type="text" />
+  </div>
+      </div>
+      <div class="field ">
+        <label for="form-widgets-age">
+          <span>Age</span>
+          <span class="fieldRequired" title="Required">
+            <span class="textual-info">(Required)</span>
+          </span>
+        </label>
+        <div class="widget"> 
+      <input id="form-widgets-age" name="form.widgets.age"
+             class="text-widget required int-field" value=""
+             type="text" />
+  </div>
+      </div>
+      </div>
+      <div id="actionsView">
+        <span class="actionButtons">
+  <input id="form-buttons-apply" name="form.buttons.apply"
+         class="submit-widget button-field" value="Apply"
+         type="submit" />
+        </span>
+      </div>
+  </form>
+
+
+display-forms
+-------------
+
+  >>> index = component.getMultiAdapter((manfred, request), name='index')
+  >>> print index()
+  <html>
+   <body>
+     <div class="main">
+        <div id="form-widgets-name-row" class="row">
+            <div class="label">
+              <label for="form-widgets-name">
+                <span>Name</span>
+              </label>
+            </div>
+            <div class="widget">
+      <span id="form-widgets-name"
+            class="text-widget required textline-field"></span>
+  </div>
+        </div>
+        <div id="form-widgets-age-row" class="row">
+            <div class="label">
+              <label for="form-widgets-age">
+                <span>Age</span>
+              </label>
+            </div>
+            <div class="widget">
+      <span id="form-widgets-age"
+            class="text-widget required int-field"></span>
+  </div>
+        </div>
+      </div>
+   </body>
+  </html>
+
+"""
+import grokcore.component as grok
+
+from zope import interface, schema
+from zope.schema.fieldproperty import FieldProperty
+from megrok.z3cform import base as z3cform
+from z3c.form import field
+
+
+class IMammoth(interface.Interface):
+
+    name = schema.TextLine(title=u"Name")
+    age = schema.Int(title=u"Age")
+
+class Mammoth(grok.Context):
+    
+    interface.implements(IMammoth)
+
+    name = FieldProperty(IMammoth['name'])
+    age = FieldProperty(IMammoth['age'])
+
+class Add(z3cform.AddForm):
+    pass
+
+class Edit(z3cform.EditForm):
+    pass
+
+class Index(z3cform.DisplayForm):
+    pass
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.z3cform.base.tests import FunctionalLayer
+    suite = doctest.DocTestSuite(optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
+    suite.layer = FunctionalLayer
+    return suite
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_utils.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_utils.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_utils.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,41 @@
+"""
+  >>> person = Person()
+  >>> IPerson.providedBy(person)
+  True
+  >>> person.name = u"christian"
+  >>> from zope.event import notify
+  >>> from zope.lifecycleevent import Attributes
+  >>> notify(ObjectModifiedEvent(person, *[Attributes(IPerson, 'name')]))
+  An IObjectModifiedEvent was sent for a person with the following changes:
+  name  
+  
+"""
+import grokcore.component as grok
+from zope.schema import TextLine
+from zope.interface import Interface
+from zope.lifecycleevent import ObjectModifiedEvent
+
+
+class IPerson(Interface):
+    name = TextLine(title=u"Name")
+
+class Person(grok.Context):
+    grok.implements(IPerson)
+
+    name = u""
+
+
+ at grok.subscribe(IPerson, ObjectModifiedEvent)
+def onNameChange(context, event):
+    print ("An IObjectModifiedEvent was sent for a person with the "
+           "following changes:")
+    for descr in event.descriptions:
+        print ", ".join(descr.attributes)
+
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.z3cform.base.tests import FunctionalLayer
+    suite = doctest.DocTestSuite(optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
+    suite.layer = FunctionalLayer
+    return suite

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_widgettemplate.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_widgettemplate.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_widgettemplate.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,145 @@
+"""
+  >>> manfred = Person()
+
+  >>> from zope import component
+  >>> from zope.interface import alsoProvides
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+  Check that fields have been created on the edition page:
+
+  >>> view = component.getMultiAdapter((manfred, request), name='edit')
+  >>> len(view.fields)
+  2
+
+  >>> [field.__name__ for field in view.fields.values()]
+  ['name', 'age']
+
+The widget for *name* should show it's normal widget.
+Because no CustomWidget is provided for this field.
+
+  >>> view.updateWidgets() 
+  >>> print view.widgets['name'].render() 
+  <input id="form-widgets-name" name="form.widgets.name"
+         class="text-widget required textline-field"
+         value="" type="text" /> 
+
+The second field in the edit form *age* should get a custom widget
+from the NewTemplateForIntField.
+
+  >>> print view.widgets['age'].render()
+  <span> This is custom integer widget for zope.schema.Int Fields </span>
+
+Now let's look on a other view. Here we get a CustomWidget as a result
+of the CustomStringTemplate
+
+  >>> view = component.getMultiAdapter((manfred, request), name='view')
+  >>> view.updateWidgets() 
+  >>> print view.widgets['name'].render()
+  <span> Extra Widget </span>
+
+Our CustomTemplate class is configured for the IAdded interface.
+Let's check if we get the right template for it.
+
+  >>> view = component.getMultiAdapter((manfred, request), name='add')
+  >>> view.updateWidgets() 
+  >>> print view.widgets['name'].render()
+  <span> Custom Widget </span>
+  <input id="form-widgets-name" name="form.widgets.name"
+         class="text-widget required textline-field"
+         value="" type="text" />
+
+  >>> print view.widgets['age'].render()
+  <span> Custom Widget </span>
+  <input id="form-widgets-age" name="form.widgets.age"
+         class="text-widget required int-field" value=""
+         type="text" />
+
+This is an example for a more complex CustomWidget.
+It uses view, widget and mode...
+
+  >>> view = component.getMultiAdapter((manfred, request), name='view2')
+  >>> view.updateWidgets() 
+  >>> print view.widgets['name'].render()
+  <span> Custom Text Widget </span>
+"""
+
+import megrok.layout
+import grokcore.viewlet as grok
+
+from zope import interface, schema
+from zope.schema.fieldproperty import FieldProperty
+from megrok.z3cform import base as z3cform
+
+from z3c.form import field, interfaces
+
+
+class IPerson(interface.Interface):
+    name = schema.TextLine(title=u"Name")
+    age = schema.Int(title=u"Age")
+
+
+class Person(grok.Context):
+    interface.implements(IPerson)
+
+    name = FieldProperty(IPerson['name'])
+    age = FieldProperty(IPerson['age'])
+
+
+class MyLayout(megrok.layout.Layout):
+    grok.context(Person)
+
+### Views
+
+class Edit(z3cform.PageEditForm):
+    grok.context(Person)
+    fields = field.Fields(IPerson)
+
+
+class View(z3cform.PageDisplayForm):
+    grok.context(Person)
+    fields = field.Fields(IPerson)
+
+
+class View2(z3cform.PageDisplayForm):
+    grok.context(Person)
+    fields = field.Fields(IPerson)
+
+
+class Add(z3cform.PageAddForm):
+    grok.context(Person)
+    fields = field.Fields(IPerson)
+
+
+### Custom Templates
+
+class CustomStringTemplate(z3cform.WidgetTemplate):
+    grok.context(Person)
+    grok.template('templates/new_string.pt')
+    megrok.z3cform.base.directives.mode(interfaces.DISPLAY_MODE)
+
+class CustomTemplate(z3cform.WidgetTemplate):
+    grok.context(Person)
+    grok.template('templates/custom_string.pt')
+    grok.view(interfaces.IAddForm)
+
+class NewTemplateForIntField(z3cform.WidgetTemplate):
+    grok.context(Person)
+    grok.template('templates/custom_int.pt')
+    megrok.z3cform.base.directives.field(schema.interfaces.IInt)
+
+class NewTemplateForTextWidget(z3cform.WidgetTemplate):
+    grok.context(Person)
+    grok.template('templates/custom_text.pt')
+    grok.view(View2)
+    megrok.z3cform.base.directives.widget(interfaces.ITextWidget)
+    megrok.z3cform.base.directives.mode(interfaces.DISPLAY_MODE)
+
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.z3cform.base.tests import FunctionalLayer
+    suite = doctest.DocTestSuite(optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
+    suite.layer = FunctionalLayer
+    return suite
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_widgettemplate_templates/mylayout.pt
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_widgettemplate_templates/mylayout.pt	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/tests/test_widgettemplate_templates/mylayout.pt	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,8 @@
+<html>                                                                           
+ <body>
+   <div class="layout" tal:content="structure view/render">
+         here comes the content
+   </div>
+ </body>
+</html>
+

Added: megrok.z3cform.base/trunk/src/megrok/z3cform/base/utils.py
===================================================================
--- megrok.z3cform.base/trunk/src/megrok/z3cform/base/utils.py	                        (rev 0)
+++ megrok.z3cform.base/trunk/src/megrok/z3cform/base/utils.py	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+
+from zope.event import notify
+from z3c.form.form import applyChanges
+from zope.lifecycleevent import Attributes, ObjectModifiedEvent
+
+
+def apply_data_event(form, context, data):
+    """ Updates the object with the data and sends an IObjectModifiedEvent
+    """
+    changes = applyChanges(form, context, data)
+    if changes:
+	descriptions = []
+	for interface, names in changes.items():
+	    descriptions.append(Attributes(interface, *names))
+	notify(ObjectModifiedEvent(context, *descriptions))
+    return changes	

Added: megrok.z3cform.base/trunk/versions.cfg
===================================================================
--- megrok.z3cform.base/trunk/versions.cfg	                        (rev 0)
+++ megrok.z3cform.base/trunk/versions.cfg	2009-09-14 15:39:29 UTC (rev 103947)
@@ -0,0 +1,115 @@
+[versions]
+zope.container = 3.8.1
+grok = 1.0a4
+ClientForm = 0.2.9
+docutils = 0.4
+grokcore.component = 1.6
+grokcore.formlib = 1.1
+grokcore.security = 1.0
+grokcore.view = 1.7
+grokcore.viewlet = 1.0
+grokui.admin = 0.3.2
+martian = 0.11
+mechanize = 0.1.7b
+Pygments = 0.8.1
+pytz = 2007k
+RestrictedPython = 3.4.2
+simplejson = 1.7.1
+z3c.autoinclude = 0.2.2
+z3c.flashmessage = 1.0
+z3c.testsetup = 0.2.1
+zc.catalog = 1.2.0
+ZConfig = 2.5.1
+zc.recipe.testrunner = 1.0.0
+zdaemon = 2.0.2
+ZODB3 = 3.8.1
+zodbcode = 3.4.0
+zope.annotation = 3.4.1
+zope.app.apidoc = 3.4.3
+zope.app.applicationcontrol = 3.4.3
+zope.app.appsetup = 3.4.1
+zope.app.authentication = 3.4.4
+zope.app.basicskin = 3.4.0
+zope.app.broken = 3.4.0
+zope.app.catalog = 3.5.1
+zope.app.component = 3.4.1
+zope.app.container = 3.5.6
+zope.app.content = 3.4.0
+zope.app.debug = 3.4.1
+zope.app.dependable = 3.4.0
+zope.app.error = 3.5.1
+zope.app.exception = 3.4.1
+zope.app.file = 3.4.4
+zope.app.folder = 3.4.0
+zope.app.form = 3.4.1
+zope.app.generations = 3.4.1
+zope.app.http = 3.4.1
+zope.app.i18n = 3.4.4
+zope.app.interface = 3.4.0
+zope.app.intid = 3.4.1
+zope.app.keyreference = 3.4.1
+zope.app.locales = 3.4.5
+zope.app.onlinehelp = 3.4.1
+zope.app.pagetemplate = 3.4.1
+zope.app.preference = 3.4.1
+zope.app.principalannotation = 3.4.0
+zope.app.publication = 3.4.3
+zope.app.publisher = 3.5.1
+zope.app.renderer = 3.4.0
+zope.app.rotterdam = 3.4.1
+zope.app.schema = 3.4.0
+zope.app.security = 3.5.2
+zope.app.securitypolicy = 3.4.6
+zope.app.server = 3.4.2
+zope.app.session = 3.5.1
+zope.app.skins = 3.4.0
+zope.app.testing = 3.4.3
+zope.app.tree = 3.4.0
+zope.app.twisted = 3.4.1
+zope.app.wsgi = 3.4.1
+zope.app.zapi = 3.4.0
+zope.app.zcmlfiles = 3.4.3
+zope.app.zopeappgenerations = 3.4.0
+zope.cachedescriptors = 3.4.1
+zope.component = 3.4.0
+zope.configuration = 3.4.0
+zope.contentprovider = 3.4.0
+zope.contenttype = 3.4.0
+zope.copypastemove = 3.4.0
+zope.datetime = 3.4.0
+zope.deferredimport = 3.4.0
+zope.deprecation = 3.4.0
+zope.dottedname = 3.4.2
+zope.dublincore = 3.4.0
+zope.error = 3.5.1
+zope.event = 3.4.0
+zope.exceptions = 3.4.0
+zope.filerepresentation = 3.4.0
+zope.formlib = 3.4.0
+zope.hookable = 3.4.0
+zope.i18n = 3.4.0
+zope.i18nmessageid = 3.4.3
+zope.index = 3.4.1
+zope.interface = 3.4.1
+zope.lifecycleevent = 3.4.0
+zope.location = 3.4.0
+zope.minmax = 1.1.0
+zope.modulealias = 3.4.0
+zope.pagetemplate = 3.4.0
+zope.proxy = 3.4.2
+zope.publisher = 3.4.6
+zope.schema = 3.4.0
+zope.security = 3.4.1
+zope.securitypolicy = 3.4.1
+zope.server = 3.4.3
+zope.session = 3.4.1
+zope.size = 3.4.0
+zope.structuredtext = 3.4.0
+zope.tal = 3.4.1
+zope.tales = 3.4.0
+zope.testbrowser = 3.4.2
+zope.testing = 3.7.6
+zope.thread = 3.4
+zope.traversing = 3.4.1
+zope.viewlet = 3.4.2
+



More information about the checkins mailing list