[Checkins] SVN: megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/ Checkpoint for z3c.wizard Implementation

Christian Klinger cklinger at novareto.de
Mon Jul 6 11:32:06 EDT 2009


Log message for revision 101626:
  Checkpoint for z3c.wizard Implementation

Changed:
  U   megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/__init__.py
  U   megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/meta.py
  U   megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/meta.zcml
  A   megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_wizard.py
  A   megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/wizard.py

-=-
Modified: megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/__init__.py
===================================================================
--- megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/__init__.py	2009-07-06 15:27:47 UTC (rev 101625)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/__init__.py	2009-07-06 15:32:06 UTC (rev 101626)
@@ -2,6 +2,8 @@
 from components import Form, AddForm, EditForm, DisplayForm
 from components import PageForm, PageAddForm, PageEditForm, PageDisplayForm
 from components import WidgetTemplate
+from wizard import WizardForm, Step
+from z3c.wizard.interfaces import IWizard
 from skin import FormLayer, TableLayer
 from directives import field
 from z3c.form import widget, field, button, action 

Modified: megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/meta.py
===================================================================
--- megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/meta.py	2009-07-06 15:27:47 UTC (rev 101625)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/meta.py	2009-07-06 15:32:06 UTC (rev 101626)
@@ -6,18 +6,18 @@
 
 from z3c.form import field
 from martian.error import GrokError
+from megrok.z3cform import wizard 
 from zope.interface import Interface
 from megrok.z3cform import directives
 from megrok.z3cform import components
+from z3c.wizard.zcml import wizardStepDirective
 from zope.interface.interfaces import IInterface
-from grokcore.view.meta.views import ViewGrokker
+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.
 
@@ -77,5 +77,18 @@
     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)  
+        widgetTemplateDirective(config, template, context, layer, 
+	                        view=view, field=field, widget=widget, mode=mode)  
         return True
+
+
+class WizardStepGrokker(martian.ClassGrokker):
+    martian.component(wizard.Step)
+    martian.directive(grokcore.component.context)
+    martian.directive(grokcore.component.name, get_default=default_view_name)
+
+    def execute(self, factory, config, context, name, **kw):
+
+        wizardStepDirective(config, factory, name, 'zope.Public', wizard=context)
+        return True
+	

Modified: megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/meta.zcml
===================================================================
--- megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/meta.zcml	2009-07-06 15:27:47 UTC (rev 101625)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/meta.zcml	2009-07-06 15:32:06 UTC (rev 101626)
@@ -11,8 +11,8 @@
   <include package="z3c.macro" file="meta.zcml" />
   <include package="z3c.formui"/>
   <include package="megrok.layout" file="meta.zcml" />
+  <include package="z3c.wizard"/>
 
-
   <grok:grok package=".meta" />
 
 </configure>

Added: megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_wizard.py
===================================================================
--- megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_wizard.py	                        (rev 0)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_wizard.py	2009-07-06 15:32:06 UTC (rev 101626)
@@ -0,0 +1,185 @@
+"""
+megrok wizard
+=============
+
+basic setup
+-----------
+
+  >>> from zope.app.testing.functional import getRootFolder
+  >>> root = getRootFolder()
+
+  >>> from zope import component
+  >>> from zope.interface import alsoProvides
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest() 
+  >>> alsoProvides(request, FormWizardLayer)
+
+  >>> person = Person()
+  >>> root['person'] = person
+  >>> person.__parent__ = root
+  >>> person.__name__ = u'person'
+
+  >>> from zope.component import getMultiAdapter
+  >>> pw = getMultiAdapter((person, request), name=u"personwizard")
+  >>> pw
+  <PersonWizard 'personwizard'>
+
+  >>> obj, names = pw.browserDefault(request)
+  >>> obj
+  <PersonWizard 'personwizard'>
+
+  >>> names
+  ('personstep',)
+
+  >>> personStep = obj.publishTraverse(request, names[0])
+  >>> personStep.update()
+  >>> print personStep.render()
+  <div class="wizard">
+        <div class="header">Person Wizard</div>
+        <div class="wizardMenu">
+          <span class="selected">
+              <span>Person</span>
+          </span>
+          <span>
+              <a href="http://127.0.0.1/person/personwizard/addressstep">Address</a>
+          </span>
+        </div>
+      <form action="http://127.0.0.1" method="post"
+            enctype="multipart/form-data" class="edit-form"
+            id="form">
+          <div class="viewspace">
+              <div class="label">Person</div>
+              <div class="required-info">
+                 <span class="required">*</span>
+                 &ndash; required
+              </div>
+            <div class="step">
+              <div id="form-widgets-firstName-row" class="row">
+                  <div class="label">
+                    <label for="form-widgets-firstName">
+                      <span>First Name</span>
+                      <span class="required">*</span>
+                    </label>
+                  </div>
+                  <div class="widget">
+        <input id="form-widgets-firstName"
+               name="form.widgets.firstName"
+               class="text-widget required textline-field"
+               value="" type="text" />
+    </div>
+              </div>
+              <div id="form-widgets-lastName-row" class="row">
+                  <div class="label">
+                    <label for="form-widgets-lastName">
+                      <span>Last Name</span>
+                      <span class="required">*</span>
+                    </label>
+                  </div>
+                  <div class="widget">
+        <input id="form-widgets-lastName"
+               name="form.widgets.lastName"
+               class="text-widget required textline-field"
+               value="" type="text" />
+    </div>
+              </div>
+            </div>
+              <div>
+                <div class="buttons">
+                  <span class="back">
+                  </span>
+                  <span class="step">
+    <input id="form-buttons-apply" name="form.buttons.apply"
+           class="submit-widget button-field" value="Apply"
+           type="submit" />
+                  </span>
+                  <span class="forward">
+                  </span>
+                </div>
+              </div>
+          </div>
+      </form>
+    </div>
+
+
+  >>> #from zope.testbrowser.testing import Browser
+  >>> #browser = Browser()
+  >>> #browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+  >>> #browser.open('http://localhost/++skin++formwizardlayer/person')  
+  >>> #import pdb; pdb.set_trace()
+"""
+
+import grok
+import zope.schema
+import zope.interface
+
+from megrok import z3cform
+from z3c.wizard import wizard, step
+from zope.location.interfaces import ILocation
+from zope.schema.fieldproperty import FieldProperty
+
+
+class FormWizardLayer(z3cform.FormLayer):
+    grok.skin('formwizardlayer')
+
+
+grok.layer(FormWizardLayer)
+
+
+class IPerson(ILocation):
+    """Person interface."""
+
+    firstName = zope.schema.TextLine(title=u'First Name')
+    lastName = zope.schema.TextLine(title=u'Last Name')
+    street = zope.schema.TextLine(title=u'Street')
+    city = zope.schema.TextLine(title=u'City')
+
+
+class Person(object):
+    """Person content."""
+    grok.implements(IPerson)
+
+    __name__ = __parent__ = None
+
+    firstName = FieldProperty(IPerson['firstName'])
+    lastName = FieldProperty(IPerson['lastName'])
+    street = FieldProperty(IPerson['street'])
+    city = FieldProperty(IPerson['city'])
+
+
+class IPersonWizard(z3cform.IWizard):
+    """Person wizard marker."""
+
+class PersonWizard(z3cform.WizardForm):
+    """ Wizard form."""
+    grok.implements(IPersonWizard)
+    grok.context(Person)
+
+    label = u'Person Wizard'
+
+    def setUpSteps(self):
+        return [
+            step.addStep(self, 'personstep', weight=1),
+            step.addStep(self, 'addressstep', weight=2),
+            ]
+
+
+class PersonStep(z3cform.Step):
+    grok.context(PersonWizard)
+    label = u'Person'
+    fields = z3cform.field.Fields(IPerson).select('firstName', 'lastName')
+
+
+class AddressStep(z3cform.Step):
+    grok.context(PersonWizard)
+    label = u'Address'
+    fields = z3cform.field.Fields(IPerson).select('street', 'city')
+
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.z3cform.tests import FunctionalLayer
+    suite = doctest.DocTestSuite(
+          optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
+    suite.layer = FunctionalLayer
+    return suite
+

Added: megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/wizard.py
===================================================================
--- megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/wizard.py	                        (rev 0)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/wizard.py	2009-07-06 15:32:06 UTC (rev 101626)
@@ -0,0 +1,19 @@
+import martian
+import grokcore.view
+
+from z3c.wizard import wizard, step
+from megrok.z3cform.components import GrokForm
+from z3c.form import form 
+
+class WizardForm(GrokForm, wizard.Wizard, grokcore.view.View):
+    """Base Class for a z3cwizdard.
+    """
+    martian.baseclass()
+
+    def update(self):
+	self.updateForm()
+
+
+class Step(step.EditStep):
+    """A Step for the Witzard
+    """



More information about the Checkins mailing list