[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>
+ – 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>
+ – 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