[Checkins] SVN: megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/ Added a wizard page grokker which get renderd in a layout

Christian Klinger cklinger at novareto.de
Wed Jul 15 05:14:38 EDT 2009


Log message for revision 101920:
  Added a wizard page grokker which get renderd in a layout

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
  A   megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_layout_wizard.py
  A   megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_layout_wizard_templates/
  A   megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_layout_wizard_templates/layout.pt
  U   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-15 07:19:19 UTC (rev 101919)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/__init__.py	2009-07-15 09:14:38 UTC (rev 101920)
@@ -5,7 +5,7 @@
 from directives import field
 from skin import FormLayer, TableLayer
 from utils import apply_data_event
-from wizard import WizardForm, Step
+from wizard import WizardForm, Step, LayoutStep
 from z3c.form import widget, field, button, action
 from z3c.form.form import extends
 from z3c.wizard.interfaces import IWizard

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-15 07:19:19 UTC (rev 101919)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/meta.py	2009-07-15 09:14:38 UTC (rev 101920)
@@ -84,7 +84,7 @@
 
 
 class WizardStepGrokker(martian.ClassGrokker):
-    martian.component(wizard.Step)
+    martian.component(wizard.BaseStep)
     martian.directive(grokcore.component.context)
     martian.directive(grokcore.component.name, get_default=default_view_name)
 

Added: megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_layout_wizard.py
===================================================================
--- megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_layout_wizard.py	                        (rev 0)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_layout_wizard.py	2009-07-15 09:14:38 UTC (rev 101920)
@@ -0,0 +1,269 @@
+"""
+megrok layout 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, FormWizardPage)
+
+  >>> christian = Person()
+  >>> root['christian'] = christian
+  >>> christian.__parent__ = root
+  >>> christian.__name__ = u'christian'
+
+  >>> from zope.component import getMultiAdapter
+  >>> pw = getMultiAdapter((christian, request), name=u"personwizardpage")
+  >>> pw
+  <PersonWizardPage 'personwizardpage'>  
+
+  >>> obj, names = pw.browserDefault(request)
+  >>> obj
+  <PersonWizardPage 'personwizardpage'>  
+
+  >>> names
+  ('personstepp',)
+
+Render the personStep
+---------------------
+
+  >>> personStep = obj.publishTraverse(request, names[0])
+  >>> personStep.update()
+  >>> page = personStep.render()
+  >>> print page
+  <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/christian/personwizardpage/addressstepp">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">
+  <input id="form-buttons-next" name="form.buttons.next"
+         class="submit-widget button-field" value="Next"
+         type="submit" />
+                </span>
+              </div>
+            </div>
+        </div>
+    </form>
+  </div>
+
+Call the PersonStep
+-------------------
+
+  >>> print personStep()
+  <html>
+   <body>
+     <div class="layout"><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/christian/personwizardpage/addressstepp">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">
+  <input id="form-buttons-next" name="form.buttons.next"
+         class="submit-widget button-field" value="Next"
+         type="submit" />
+                </span>
+              </div>
+            </div>
+        </div>
+    </form>
+  </div>
+  </div>
+   </body>
+  </html>
+
+"""
+
+import grok
+import zope.schema
+import zope.interface
+import megrok.layout
+
+from megrok import z3cform
+from z3c.wizard import wizard, step
+from zope.location.interfaces import ILocation
+from zope.schema.fieldproperty import FieldProperty
+
+
+class FormWizardPage(z3cform.FormLayer):
+    grok.skin('formwizardpage')
+
+
+grok.layer(FormWizardPage)
+
+
+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 Layout(megrok.layout.Layout):
+    grok.context(Person)
+
+
+class IPersonWizard(z3cform.IWizard):
+    """Person wizard marker."""
+
+class PersonWizardPage(z3cform.WizardForm):
+    """ Wizard form."""
+    grok.implements(IPersonWizard)
+    grok.context(Person)
+
+    label = u'Person Wizard'
+
+    def setUpSteps(self):
+        return [
+            step.addStep(self, 'personstepp', weight=1),
+            step.addStep(self, 'addressstepp', weight=2),
+            ]
+
+
+class PersonStepP(z3cform.LayoutStep):
+    grok.context(PersonWizardPage)
+    label = u'Person'
+    fields = z3cform.field.Fields(IPerson).select('firstName', 'lastName')
+
+
+class AddressStepP(z3cform.LayoutStep):
+    grok.context(PersonWizardPage)
+    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/tests/test_layout_wizard_templates/layout.pt
===================================================================
--- megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_layout_wizard_templates/layout.pt	                        (rev 0)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/tests/test_layout_wizard_templates/layout.pt	2009-07-15 09:14:38 UTC (rev 101920)
@@ -0,0 +1,7 @@
+<html>
+ <body>
+   <div class="layout" tal:content="structure view/render">
+         here comes the content
+   </div>
+ </body>
+</html>

Modified: megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/wizard.py
===================================================================
--- megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/wizard.py	2009-07-15 07:19:19 UTC (rev 101919)
+++ megrok.z3cform/branches/megrok.z3cfrom-layout/src/megrok/z3cform/wizard.py	2009-07-15 09:14:38 UTC (rev 101920)
@@ -1,21 +1,26 @@
 import martian
 import grokcore.view
+import megrok.layout
 
 from z3c.form import form 
+from zope import component
 from z3c.wizard import wizard, step
 from zope.publisher.publish import mapply
-from megrok.z3cform.components import GrokForm
+from megrok.z3cform.components import PageGrokForm, GrokForm
 
 class WizardForm(GrokForm, wizard.Wizard, grokcore.view.View):
-    """Base Class for a z3cwizdard.
+    """Base Class for a z3c.wizdard.
     """
     martian.baseclass()
 
     def update(self):
 	self.updateForm()
 
+class BaseStep(step.EditStep):
+    """ Base Step
+    """
 
-class Step(step.EditStep):
+class Step(BaseStep):
     """A Step for the Witzard
     """
     def __call__(self):
@@ -25,4 +30,28 @@
             # continue rendering the template or doing anything else.
             return
         return self.render()
-   
+
+
+class LayoutStep(BaseStep):
+    """A Step for the Witzard
+    """
+
+    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):
+            # A redirect was triggered somewhere in update().  Don't
+            # continue rendering the template or doing anything else.
+            return
+        #self.updateForm()
+        if self.layout is None:
+            layout = component.getMultiAdapter(
+                (self.context, self.request), megrok.layout.ILayout)
+            return layout(self)
+        return self.layout()
+    



More information about the Checkins mailing list