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