{ "info": { "author": "David Glick", "author_email": "davidglick@groundwire.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: Zope2", "License :: OSI Approved :: GNU General Public License (GPL)" ], "description": "Introduction\n============\n\nThis library implements a simple z3c.form-based wizard. The wizard is composed\nof multiple steps. Each step is a form. Data is stored in a session until\nthe user clicks the Finish button on the last step.\n\nIn order to make good use of this library you'll need to be reasonably familiar\nwith z3c.form first. Here are some places to start:\n\n * Official documentation: http://docs.zope.org/z3c.form\n \n * Slides from Stephan Richter's tutorial at Plone Conference 2008:\n http://svn.zope.org/\\*checkout\\*/z3c.talk/trunk/Z3CForms/Z3CForms.html?rev=92118\n \n\nWizard Step\n-----------\n\nA wizard step is a normal z3c.form form with a few additional features.\n\nBy default, the content accessed by this form will be a dictionary\nwithin the wizard's session, with a key equal to the step's prefix.\n\nAdditional attributes:\n\n wizard\n The wizard this step is being used in.\n\n available\n Boolean indicating whether the current step can be accessed via the\n wizard navigation links. By default, only steps for which there is already\n data stored in the session can be accessed. (The next and previous steps\n can always be accessed via the respective buttons regardless of the value\n of this property.)\n\n completed\n Boolean indicating whether the user should be allowed to move on to the\n next step. Defaults to True. If False, the Continue button will be\n disabled.\n\n cssid\n String. A user-supplied CSS id for the form tag.\n\nAdditional methods:\n\n applyChanges(data)\n Saves changes from this step to its content (typically a PersistentDict\n in the wizard's session.)\n\n load(context):\n Loads the session data for this step based on a context.\n\n apply(context):\n Updates a context based on the session data for this step.\n\n\nWizard Group Step\n-----------------\n\nSame as a Wizard Step; it just handles a list of groups just like a z3c.form\nGroupForm.\n\nAdditional attributes:\n\n groups\n The list of groups you'd like to show up in the form as separate fieldsets\n\n\nWizard\n------\n\nThe wizard is also a form, with a list of steps and built-in logic for\nmoving between those steps.\n\nClass attributes. Override these to affect how the wizard behaves:\n\n steps\n A sequence of step classes that will be instantiated when the wizard's\n update method is called.\n\n sessionKey\n Returns the unique session key used by this wizard instance. By default,\n this is a tuple of 'collective.z3cform.wizard' and the URL\n path to the wizard.\n\nAttributes set during the update method:\n\n activeSteps\n A sequence of wizard step instances.\n\n currentStep\n The wizard step instance currently being displayed.\n\n currentIndex\n The (0-based) index of the current step within the activeSteps sequence.\n\n session\n The session where data for this wizard is persisted.\n\n onFirstStep\n Boolean. True if the first step of the wizard is being displayed.\n\n onLastStep\n Boolean. True if the last step of the wizard is being displayed.\n\n allStepsFinished\n Boolean. True if the 'available' attribute of each wizard step is True.\n\n finished\n Boolean. True if the wizard has been completed.\n\n absolute_url\n The URL of the wizard.\n\n validate_back\n Boolean. True if you want the Wizard to validate the input if a user\n uses the Back button on a Step. False if you don't and abandon\n all user input (data). Default behavior is True. [Spanky]\n\nMethods:\n\n initialize()\n Called the first time a wizard is viewed in a given session.\n \n This method may be used to populate the session with data from some\n source.\n \n The default implementation calls the loadSteps method.\n \n loadSteps(context)\n Loads the wizard session data from a context.\n \n The default implementation calls the 'load' method of each wizard step.\n \n finish()\n Called when a wizard is successfully completed, after validation of the\n final step.\n \n Use this method to carry out some actions based on the values that have\n been filled out during completion of the wizard.\n \n The default implementation calls the applySteps method.\n \n applySteps(context)\n Updates a context based on the wizard session data.\n \n The default implementation calls the 'apply' method of each wizard step.\n \n sync()\n Mark the session as having changed, to ensure that changes get\n persisted. This is required since we aren't using a\n persistence-aware dictionary class for our session variables.\n\n\nCompatibility\n=============\n\nThis package has been tested in Zope 2.10 with Plone 3.3, and in Zope 2.12 with\nPlone 4.\n\nIt should be pretty easy to get it to work in other environments supported by\nz3c.form, such as Zope 3, but I'll need someone familiar with those environments\nto tell me how sessions work there, for example.\n\nCredits\n=======\n\nThis package is inspired by and based on the non-session-based z3c.form wizard\nincluded in the collective.singing package, which was implemented by Daniel\nNouri.\n\nSession support, miscellaneous improvements, and repackaging by David Glick.\n\nThanks also to Nathan van Gheem, Laurence Rowe, and Tom \"Spanky\" Kapanka.\n\nChangelog\n=========\n\n1.4.8 (2013-04-18)\n------------------\n\n* Fix pagetemplate import for Plone 4.3 compatibility.\n [jone]\n\n* Add Chinese translation.\n [jianaijun]\n\n* Clear action now updates active steps (needed to cover dynamic wizards)\n [gotcha, schminitz]\n\n* Fix step data initial load in case of dynamic wizards (ie when steps are\n depending on user data)\n [gotcha, schminitz]\n\n* Enabling overriding button conditions in descendant classes\n [gotcha]\n\n* In wizard.Wizard, the absolute_url property will throw a TypeError if \n self.__name__ is None. Not any more! The problem now is this means that \n absolute_url will inaccurate in that circumstance. TODO\n [spanky]\n\n* Add French translation.\n [mpeeters]\n\n1.4.7 (2012-01-05)\n------------------\n\n* Add ability to skip validation of current input if the user\n uses the Back button. Default remains unchanged.\n [spanky]\n\n* Add \"id\" as an attribute of the form tag\n [spanky]\n\n1.4.6 (2011-10-19)\n------------------\n\n* Add Spanish translation.\n [davisagli]\n\n1.4.5 (2011-10-19)\n------------------\n\n* Make sure wizard step labels are translated.\n [davisagli]\n\n1.4.4 (2011-10-17)\n------------------\n\n* Avoid using any() to restore compatibility with Python 2.4.\n [davisagli]\n\n1.4.3 (2011-07-13)\n------------------\n\n* Don't count browser views when determining if the user has left the\n wizard.\n [davisagli]\n\n1.4.2 (2011-05-04)\n------------------\n\n* Fix AutoWizard widget traverser registration.\n [elro]\n\n1.4.1 (2011-05-04)\n------------------\n\n* Add an AutoWizard for use with plone.autoform.\n [elro]\n\n* Add a Clear button that clears the session and goes back to step 1.\n [elro]\n\n* Reorder buttons so Finish and Continue both appear before Back.\n [elro]\n\n1.4 (2011-05-04)\n----------------\n\n* Remove
\n [elro]\n\n* Use Products.statusmessages.\n [elro]\n\n* Tweak wizard-buttons to conform to standard plone formControls.\n [elro]\n\n* Remove div.row from wizard-step.pt.\n [elro]\n\n1.3.3 (2011-03-22)\n------------------\n\n* Normalize @@ view prefix when comparing URLs.\n [davisagli]\n\n1.3.2 (2010-07-27)\n------------------\n\n* Remove stray debugging statement.\n [khink]\n\n1.3.1 (2010-06-28)\n------------------\n\n* Avoid clobbering the session during plone.app.z3cform's inline validation.\n [davisagli]\n\n1.3 (2010-06-23)\n----------------\n\n* Avoid errors when plone.app.z3cform's inline validation is installed.\n [davisagli]\n\n1.2 (2010-04-08)\n----------------\n\n* Added a GroupStep for GroupForm-like integration.\n [vangheem]\n\n1.1 (2010-03-01)\n----------------\n\n* Make sure that the Next button is the default if a step is submitted by\n pressing enter.\n\n1.0 (2010-01-19)\n----------------\n\n* Include the form's enctype in the form tag.\n\n* Don't clear the session when traversing over the form to other things (such\n as a widget).\n\n1.0b2 (2009-06-25)\n------------------\n\n* Moved the default wizard CSS to a browser resource which is available but\n not pulled in by anything by default.\n\n* Adjusted the criteria for visibility of the Finish button so that it shows up\n on any step as long as data is stored in the session for all steps.\n Previously it was only shown on the final step.\n\n* Added wizard navigation which lists the wizard's steps and links to ones\n that are available.\n\n* Added support in the Wizard class for jumping to a particular step based\n on an index passed in the request (but only if that step is available).\n\n* Adjusted the URL check that triggers session invalidation to not pay\n attention to the query string or fragment.\n\n* Changed the updateCurrentStep method of the Wizard class (not part of the\n public API) to take a single parameter, the target step index.\n\n* Added 'allStepsFinished' property to the Wizard class.\n\n* Added 'available' property to the Step class.\n\n* Added 'absolute_url' property to the Wizard class.\n\n* Reset the wizard session if you leave it before finishing.\n\n\n1.0b1 (2009-05-12)\n------------------\n\n* Initial release\n\nExample and tests\n=================\n\nDefine a wizard with three steps\n--------------------------------\n\nTo define a form that uses the wizard, we'll need to define steps.\nThese steps represent individual forms that are processed\nsequentially. Only when the last step is completed will the data be\nsubmitted through a user-defined method. \n\n >>> from zope import schema\n >>> from z3c.form import field, form\n >>> from collective.z3cform.wizard import wizard\n >>> from plone.z3cform.fieldsets import group\n >>> from Products.statusmessages.interfaces import IStatusMessage\n >>> from Products.statusmessages.adapter import _decodeCookieValue\n\n >>> class StepOne(wizard.Step):\n ... prefix = 'one'\n ... fields = field.Fields(\n ... schema.Int(__name__='age', title=u\"Age\"))\n\nBy default, the steps will get/set values in the session. If we want to\ninitialize these values or do something with them once the wizard is completed,\nwe need to implement the load and apply methods for our step.\n\n >>> from pprint import pprint\n >>> class StepTwo(wizard.Step):\n ... prefix = 'two'\n ... fields = field.Fields(\n ... schema.TextLine(__name__='name', title=u\"Name\", required=True),\n ... schema.TextLine(__name__='beer', title=u'Favorite Beer', required=True))\n ... \n ... def load(self, context):\n ... data = self.getContent()\n ... data['name'] = 'David'\n ... \n ... def apply(self, context):\n ... data = self.getContent()\n ... pprint('Name from step 2: %s' % data['name'])\n\nWe can also do group steps\n\n >>> class AddressGroup(group.Group):\n ... fields = field.Fields(\n ... schema.TextLine(__name__='address', title=u'Address', required=False),\n ... schema.TextLine(__name__='city', title=u'City', required=False),\n ... schema.TextLine(__name__='state', title=u'State', required=False))\n ... label = u\"Address Information\"\n ... prefix = 'address'\n\n >>> class StepThree(wizard.GroupStep):\n ... prefix = 'three'\n ... fields = field.Fields()\n ... groups = [AddressGroup]\n\n\nWe can now define our minimal wizard:\n\n >>> class Wizard(wizard.Wizard):\n ... label = u\"My silly wizard\"\n ... steps = StepOne, StepTwo, StepThree\n\nRender the form\n---------------\n\nLet's render the form for the first time now:\n\n >>> request = TestRequest()\n >>> wizard = Wizard(None, request)\n >>> print wizard()\n <...\n
\n
\n

\n
\n ...\n \n (Required)\n \n
\n \n
\n
\n
\n \n \n
\n
\n
\n\n\nSubmit with an error\n--------------------\n\nRemember that our first step requires the age.\n\n >>> request.form = {\n ... 'form.buttons.continue': u'Continue',\n ... }\n >>> wizard = Wizard(None, request)\n\n >>> print wizard()\n <...\n ...Required input is missing...\n\n >>> messages = _decodeCookieValue(request.__annotations__.pop('statusmessages'))\n >>> [(m.message, m.type) for m in messages]\n [(u'There were errors.', u'error')]\n\n\nSubmit the first step successfully\n----------------------------------\n\n >>> request.form['one.widgets.age'] = u'27'\n >>> wizard = Wizard(None, request)\n >>> print wizard()\n <...\n
\n
\n

\n
\n \n \n (Required)\n \n
\n \n
\n
\n
\n \n \n (Required)\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n
\n\n\nGoing backwards\n---------------\n\nWhen we go back, we should get validation errors, because we left a field blank:\n\n >>> del request.form['form.buttons.continue']\n >>> request.form['form.buttons.back'] = u'Back'\n >>> wizard = Wizard(None, request)\n >>> print wizard()\n <...\n ...Required input is missing...\n\n >>> messages = _decodeCookieValue(request.__annotations__.pop('statusmessages'))\n >>> [(m.message, m.type) for m in messages]\n [(u'There were errors.', u'error')]\n\nNow if we set validate_back to False it should be possible to go back with no errors:\n\n >>> request.form['form.buttons.back'] = u'Back'\n >>> wizard = Wizard(None, request)\n >>> wizard.validate_back = False\n >>> html = wizard()\n >>> 'wizard-step-one' in html\n True\n\nMake sure we get back to step two (again):\n\n >>> del request.form['form.buttons.back']\n >>> request.form['form.buttons.continue'] = u'Continue'\n >>> wizard = Wizard(None, request)\n >>> html = wizard()\n >>> 'wizard-step-two' in html\n True\n\nSubmitting step two\n-------------------\n\nFill in the missing value:\n\n >>> request.form['two.widgets.beer'] = u'Boont Amber'\n\nStep two works similarly:\n\n >>> request.form['two.widgets.name'] = u'David'\n >>> wizard = Wizard(None, request)\n >>> html = wizard()\n >>> 'three' in html, 'Address' in html, 'City' in html, 'State' in html, 'Finish' in html\n (True, True, True, True, True)\n\nStep Three: Slaying the dragon\n------------------------------\n\nNow let's press the Finish button. We expect this to print out the value\nfrom step 2, thanks to the 'apply' method we implemented for that step.\n\nRemembering that in our wizard, we implemented ``finish`` to print out\nthe data that it receives. Here's the finishing move:\n\n >>> request.form['form.buttons.finish'] = u'Finish'\n >>> wizard = Wizard(None, request)\n >>> html = wizard()\n 'Name from step 2: David'\n\n >>> messages = _decodeCookieValue(request.__annotations__.pop('statusmessages'))\n >>> [(m.message, m.type) for m in messages]\n [(u'Information submitted successfully.', u'info')]\n\n\nExample\n-------\n\nSee the `collective.megaphone`_ package for an example of this library in use.\n\n.. _`collective.megaphone`: http://plone.org/products/megaphone\n\n\nAutoWizard\n----------\n\nAn AutoWizard creates steps out of plone.autoform fieldsets (including those\nin a plone.supermodel xml schema).\n\nFirst we define our schema:\n\n >>> from plone.supermodel.interfaces import FIELDSETS_KEY\n >>> from plone.supermodel.model import Fieldset\n >>> from zope.interface import Interface, taggedValue\n >>> class IMySchema(Interface):\n ... age = schema.Int(title=u\"Age\")\n ... name = schema.Int(title=u\"Name\")\n ... taggedValue(FIELDSETS_KEY, [\n ... Fieldset('one', label=u\"One from fieldset\", fields=['age']),\n ... Fieldset('two', fields=['name']),\n ... ])\n\nThen create the AutoWizard class:\n\n >>> from collective.z3cform.wizard import autowizard\n >>> class AutoWizard(autowizard.AutoWizard):\n ... label = u\"Automatically silly wizard.\"\n ... schema = IMySchema\n\n\nWe can now render the form:\n\n >>> request = TestRequest()\n >>> wizard = AutoWizard(None, request)\n >>> print wizard()\n <...\n
\n
\n

One from fieldset

\n

\n
\n ...\n \n (Required)\n \n
\n \n
\n
\n
\n \n
\n
\n
\n\nOtherwise it works in exactly the same way as the standard Wizard.\n\nDynamic wizard support\n======================\n\nIn some cases, depending on the user's answers to earlier steps of a wizard, \nlater steps are shown or not to the user \n\n >>> from zope import schema\n >>> from z3c.form import field, form\n >>> from collective.z3cform.wizard import wizard\n >>> from plone.z3cform.fieldsets import group\n >>> from Products.statusmessages.interfaces import IStatusMessage\n >>> from Products.statusmessages.adapter import _decodeCookieValue\n\nWe define fields.\n\n >>> choiceField = schema.Choice(\n ... __name__ = 'choice',\n ... title=u'Choice',\n ... values=(u'first', u'second'),\n ... default=u'first'\n ... )\n\n >>> firstField = schema.TextLine(\n ... __name__ = 'first',\n ... title=u'First',\n ... required=False,\n ... missing_value=u'',\n ... )\n \n >>> secondField = schema.Bool(\n ... __name__ = 'second',\n ... title=u'Second',\n ... required=False,\n ... )\n\nAnd wizard steps.\n\n >>> class FirstStep(wizard.Step):\n ... label = u'First'\n ... prefix = 'one'\n ... fields = field.Fields(firstField)\n ...\n ... def load(self, context):\n ... data = self.getContent()\n ... data.setdefault('first', u'initial first')\n\n >>> class SecondStep(wizard.Step):\n ... label = u'Second'\n ... prefix = 'two'\n ... fields = field.Fields(secondField)\n ... \n ... def load(self, context):\n ... data = self.getContent()\n ... data['second'] = True\n\n >>> class ChoiceStep(wizard.Step):\n ... label = u'Choice'\n ... prefix = 'choice'\n ... fields = field.Fields(choiceField)\n\n >>> class SecondChoiceStep(wizard.Step):\n ... label = u'Second Choice'\n ... prefix = 'second_choice'\n ... fields = field.Fields(choiceField)\n\nWe can now define our dynamic wizard. The wizard later steps depend on values\nsubmitted in the initial ``ChoiceStep`` and ``SecondChoiceStep``.\n\n``steps`` is a computed property instead of a hardcoded sequence.\n\nThe class also implements ``showFinish`` method that controls showing (or not) \nthe Finish button. \n\n >>> class DynamicWizard(wizard.Wizard):\n ... label = u\"My dynamic wizard\"\n ...\n ... @property\n ... def choice(self):\n ... choice_data = self.session.get('choice', {})\n ... choice = choice_data.get('choice', None)\n ... if 'choice.widgets.choice' in self.request.form:\n ... choice = unicode(self.request.form['choice.widgets.choice'][0])\n ... return choice\n ... \n ... @property\n ... def second_choice(self):\n ... choice_data = self.session.get('second_choice', {})\n ... choice = choice_data.get('choice', None)\n ... if 'second_choice.widgets.choice' in self.request.form:\n ... choice = unicode(self.request.form['second_choice.widgets.choice'][0])\n ... return choice\n ...\n ... @property\n ... def steps(self):\n ... if self.choice == u'second':\n ... if not self.second_choice:\n ... return [ChoiceStep, SecondChoiceStep, FirstStep]\n ... elif self.second_choice == u'second':\n ... return [ChoiceStep, SecondChoiceStep, SecondStep]\n ... else:\n ... return [ChoiceStep, SecondChoiceStep, FirstStep]\n ... else:\n ... return [ChoiceStep, FirstStep]\n ...\n ... def showFinish(self):\n ... return (self.choice == u'first' or self.second_choice) and self.allStepsFinished \n \nRender the form\n---------------\n\nLet's render the form for the first time now:\n\n >>> request = TestRequest()\n >>> wizard = DynamicWizard(None, request)\n >>> wizard.update()\n >>> wizard.currentIndex\n 0\n >>> print wizard.render()\n \n
\n
\n

Choice

\n

\n
\n ...\n \n (Required)\n \n
\n \n \n
\n
\n
\n \n \n
\n
\n
\n\nSubmit the first choice successfully\n------------------------------------\n\n >>> request.form = {\n ... 'form.buttons.continue': u'Continue',\n ... 'choice.widgets.choice': [u'first']\n ... }\n >>> wizard = DynamicWizard(None, request)\n >>> wizard.update()\n >>> wizard.currentIndex\n 1\n >>> print wizard.render()\n \n
\n
\n

First

\n

\n
\n \n
\n \n
\n
\n
\n \n \n \n
\n
\n
\n\nGoing backwards\n---------------\n\n >>> del request.form['form.buttons.continue']\n >>> request.form['form.buttons.back'] = u'Back'\n >>> wizard = DynamicWizard(None, request)\n >>> wizard.update()\n >>> wizard.currentIndex\n 0\n >>> print wizard.render()\n \n
\n
\n

Choice

\n

\n
\n \n \n (Required)\n \n
\n \n \n
\n
\n
\n \n \n \n
\n
\n
\n\nChoose the other branch of the wizard\n-------------------------------------\n\n >>> request.form = {\n ... 'form.buttons.continue': u'Continue',\n ... 'choice.widgets.choice': [u'second']\n ... }\n >>> wizard = DynamicWizard(None, request)\n >>> wizard.update()\n >>> wizard.currentIndex\n 1\n >>> print wizard.render()\n \n
\n
\n

Second Choice

\n

\n
\n \n Choice\n \n \n (Required)\n \n
\n \n \n
\n
\n
\n \n \n \n
\n
\n
\n\nChoose again \n------------\n\n >>> request.form = {\n ... 'form.buttons.continue': u'Continue',\n ... 'second_choice.widgets.choice': [u'second']\n ... }\n >>> wizard = DynamicWizard(None, request)\n >>> wizard.update()\n >>> wizard.currentIndex\n 2\n\nThe initial value is actually shown.\n\n >>> print wizard.render()\n \n
\n
\n

Second

\n

\n
\n \n
\n \n \n \n \n \n \n \n
\n
\n
\n \n \n \n
\n
\n
\n\nClear wizard \n------------\n\n >>> request.form = {\n ... 'form.buttons.clear': u'Clear',\n ... 'second_choice.widgets.choice': [u'second']\n ... }\n >>> wizard = DynamicWizard(None, request)\n >>> wizard.update()\n >>> wizard.currentIndex\n 0\n >>> print wizard.render()\n \n
\n
\n

Choice

\n

\n
\n \n \n (Required)\n \n
\n \n \n
\n
\n
\n \n
\n
\n
", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://svn.plone.org/svn/collective/collective.z3cform.wizard/trunk", "keywords": "z3c.form wizard session", "license": "GPL", "maintainer": null, "maintainer_email": null, "name": "collective.z3cform.wizard", "package_url": "https://pypi.org/project/collective.z3cform.wizard/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/collective.z3cform.wizard/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://svn.plone.org/svn/collective/collective.z3cform.wizard/trunk" }, "release_url": "https://pypi.org/project/collective.z3cform.wizard/1.4.8/", "requires_dist": null, "requires_python": null, "summary": "This is a library for creating multi-page wizards using z3c.form. Values are stored in a session until the wizard is finished.", "version": "1.4.8" }, "last_serial": 721893, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "2108df5c06cf559530a1d8dc90a5ce9c", "sha256": "2cdc322cbed9989a568a913df0804e94fca097c5c54e07229a083330dcb7f466" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.0.zip", "has_sig": false, "md5_digest": "2108df5c06cf559530a1d8dc90a5ce9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31010, "upload_time": "2010-01-19T10:38:46", "url": "https://files.pythonhosted.org/packages/f0/75/fd5e10ce72f5bea919bcdfb1a5bb831d09941d80cb8fcc32e677f81eb328/collective.z3cform.wizard-1.0.zip" } ], "1.0b1": [ { "comment_text": "", "digests": { "md5": "59a380fe58b4f2d779a81b478ddd15ba", "sha256": "207d276ba62fc9a5eba2b93a9b65c0f1b0ffefa5816ab4f9bc5a0b9871add455" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.0b1.tar.gz", "has_sig": false, "md5_digest": "59a380fe58b4f2d779a81b478ddd15ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14800, "upload_time": "2009-05-13T02:31:34", "url": "https://files.pythonhosted.org/packages/9c/6b/8140e9d333db882263457ff0678a889ef37e81648effa142b7cdf8714ff6/collective.z3cform.wizard-1.0b1.tar.gz" } ], "1.0b2": [ { "comment_text": "", "digests": { "md5": "f72e0c8ad4360863f98eef4e91d2ac9e", "sha256": "ab913df852daaff7285fe1a3843765446f85d1820aef8e1555071ff68be70bd2" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.0b2.tar.gz", "has_sig": false, "md5_digest": "f72e0c8ad4360863f98eef4e91d2ac9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20867, "upload_time": "2009-06-26T02:03:22", "url": "https://files.pythonhosted.org/packages/96/05/614c6c8f03cb60e7b6c9829226ac6a9eac6ff712188a25f290a709cebf04/collective.z3cform.wizard-1.0b2.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "e0909151332c9ead8de8a43443664b6b", "sha256": "928598ce48b9b07410f6ae7345e0671024779e48709c208084437a63febb7773" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.1.zip", "has_sig": true, "md5_digest": "e0909151332c9ead8de8a43443664b6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31194, "upload_time": "2010-03-02T01:56:29", "url": "https://files.pythonhosted.org/packages/00/21/f54b70dca0b247b49fa0d6a10f8d1b779c3677b62410f7cb27a7ed6964df/collective.z3cform.wizard-1.1.zip" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "2e617c04a41159086df91423405eb413", "sha256": "247a625e496118a1867bca5548c3af3fdac4791f984d1adb93558728ed90302f" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.2.zip", "has_sig": true, "md5_digest": "2e617c04a41159086df91423405eb413", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33817, "upload_time": "2010-04-09T00:49:39", "url": "https://files.pythonhosted.org/packages/33/c5/3871bf26412a0c303ddaa817de5fbef0a2e3390481e0d5c504fb110a67cc/collective.z3cform.wizard-1.2.zip" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "2909ba0a1e00d5cf7434536e64321bf3", "sha256": "c1974907f04eba23b0f2d519ab4e564e71b3a9d1983f22b992cc5ac7e81af053" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.3.zip", "has_sig": false, "md5_digest": "2909ba0a1e00d5cf7434536e64321bf3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34016, "upload_time": "2010-06-23T22:48:26", "url": "https://files.pythonhosted.org/packages/3e/10/f7701b57608d53f772716c78c790e119eb4c2714aa7e84bd62142663febb/collective.z3cform.wizard-1.3.zip" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "2bd841091b41be572d7d14fa35bbaf3a", "sha256": "7f4bded7e4393dbe66d0a2d6f76bbeb2a2055e9faa3e76fbf3ed9a80d11e5de6" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.3.1.zip", "has_sig": false, "md5_digest": "2bd841091b41be572d7d14fa35bbaf3a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34340, "upload_time": "2010-06-29T02:53:39", "url": "https://files.pythonhosted.org/packages/b1/96/f77d12c5346350613797fd72224d48ce2d9aa4ddb42656e65286f3145968/collective.z3cform.wizard-1.3.1.zip" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "6404805afc9b8127d0557e1756e67f16", "sha256": "619eef608a5779109ca6fcf9ac20a1b11e310c8c9a49a8b6b055b26fbb7fe327" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.3.2.zip", "has_sig": true, "md5_digest": "6404805afc9b8127d0557e1756e67f16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34704, "upload_time": "2010-07-27T20:12:08", "url": "https://files.pythonhosted.org/packages/dd/c0/3f2f1d5bcce0baa5a3515b3faa0aeaad8de7caa2a0afd4b67e8bd8784f92/collective.z3cform.wizard-1.3.2.zip" } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "5b4e4f5e810ea7b310066c4494396edd", "sha256": "15d5908c8f438882a5193ff2423d64ecd86f3fec5277a80540cde4dc4b3494c6" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.3.3.zip", "has_sig": false, "md5_digest": "5b4e4f5e810ea7b310066c4494396edd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36278, "upload_time": "2011-03-22T18:52:09", "url": "https://files.pythonhosted.org/packages/da/39/81e62da78877889972eba4d70e9b1ccc32ded4bbece37697ded4c6fee072/collective.z3cform.wizard-1.3.3.zip" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "c7c1544f94f979570ce32d18532785cc", "sha256": "ad9d13244ae7e3c047e9f98375097d64559400cd99bb553b4a41689abbaba5f3" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.zip", "has_sig": false, "md5_digest": "c7c1544f94f979570ce32d18532785cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37072, "upload_time": "2011-05-04T16:25:53", "url": "https://files.pythonhosted.org/packages/36/c5/d366df2d058f82952e694b05c38e59c0fff6795ed8a128d0c79e908ab5b9/collective.z3cform.wizard-1.4.zip" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "2092e304bf444aa1f1593404feeb813a", "sha256": "31d001a0426e8df6a5618268904c18d8698abac7b82d445bd6293b7b4c944c9e" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.1.zip", "has_sig": false, "md5_digest": "2092e304bf444aa1f1593404feeb813a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39611, "upload_time": "2011-05-04T19:39:34", "url": "https://files.pythonhosted.org/packages/8b/d2/b8730a5091f4414b180b7c716c26636d435388118ceeb0a738ccefcfd355/collective.z3cform.wizard-1.4.1.zip" } ], "1.4.2": [ { "comment_text": "", "digests": { "md5": "2a1409ca6f8b1c87729d7e9c524cf90b", "sha256": "3d0c54769f85447d2082e94f79143eb79b330cc860d1271c2f2518012cbfcdd3" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.2.zip", "has_sig": false, "md5_digest": "2a1409ca6f8b1c87729d7e9c524cf90b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39692, "upload_time": "2011-05-04T19:44:08", "url": "https://files.pythonhosted.org/packages/65/43/8f82763bd72f311d67492b262d57467502c277c90327dd1df6816cb70536/collective.z3cform.wizard-1.4.2.zip" } ], "1.4.3": [ { "comment_text": "", "digests": { "md5": "13f96d05ef122163d88f5faa477080c2", "sha256": "f7754081d24242940c4fd271c3fe1af3842cfdeb2d450b910ae100a31fd8f747" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.3.zip", "has_sig": false, "md5_digest": "13f96d05ef122163d88f5faa477080c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39857, "upload_time": "2011-07-14T00:59:01", "url": "https://files.pythonhosted.org/packages/ec/e1/122fec346098f15e47f612f91eb38204a1ff50983e7feee065e77186816c/collective.z3cform.wizard-1.4.3.zip" } ], "1.4.4": [ { "comment_text": "", "digests": { "md5": "3c7ba86edac0884d86339f88a518e121", "sha256": "c00187854b27bddac5a42be8b9a05d27c27d46745c8b612626e716177c8522b1" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.4.zip", "has_sig": false, "md5_digest": "3c7ba86edac0884d86339f88a518e121", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39786, "upload_time": "2011-10-17T23:06:52", "url": "https://files.pythonhosted.org/packages/e9/91/2fe566065287fd9151ea64247da7402130c093a4938ccbc20e12c730ba0c/collective.z3cform.wizard-1.4.4.zip" } ], "1.4.5": [ { "comment_text": "", "digests": { "md5": "a9e925f3b352ccb0d63e72cc7196df07", "sha256": "914034d5e8dd0deb54b1dd5bc3d8384f48ff0ca607971088c90da1bbe8f8bd8d" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.5.zip", "has_sig": false, "md5_digest": "a9e925f3b352ccb0d63e72cc7196df07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39866, "upload_time": "2011-10-20T02:28:27", "url": "https://files.pythonhosted.org/packages/05/fe/cb828be6e716cfccf73f0d617c88301754c06537db02b4336816d7a2fd73/collective.z3cform.wizard-1.4.5.zip" } ], "1.4.6": [ { "comment_text": "", "digests": { "md5": "d0a3206353624f0cd74178a1738e8913", "sha256": "d017215462d0c30f053124c87385d64c0d3cb51e58130ae8efe0528d00293c43" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.6.zip", "has_sig": false, "md5_digest": "d0a3206353624f0cd74178a1738e8913", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40624, "upload_time": "2011-10-20T06:39:45", "url": "https://files.pythonhosted.org/packages/fa/96/ec055e0704cf45f9b58f660dc128af3af83fac62ef41159f2fc13bb6209e/collective.z3cform.wizard-1.4.6.zip" } ], "1.4.7": [ { "comment_text": "", "digests": { "md5": "ffb2455422e022d2b19ac6613ba29c22", "sha256": "9e4bf4905f0b76acdafea40f3e5d61195fc68be94928ec3ca915f177bfea10e5" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.7.zip", "has_sig": false, "md5_digest": "ffb2455422e022d2b19ac6613ba29c22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42443, "upload_time": "2012-01-06T04:15:42", "url": "https://files.pythonhosted.org/packages/8a/61/390eb9aab4c5cba355f841d0391e87d2c64e613f724308a5a22cb645eb44/collective.z3cform.wizard-1.4.7.zip" } ], "1.4.8": [ { "comment_text": "", "digests": { "md5": "1a230f071aa398972f39b56cb8c27558", "sha256": "aa378cec050ea8586ed54d81dd5a3a5a6d813a9216fdc983db799d5b2286a91b" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.8.zip", "has_sig": false, "md5_digest": "1a230f071aa398972f39b56cb8c27558", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54338, "upload_time": "2013-04-18T16:53:26", "url": "https://files.pythonhosted.org/packages/12/1c/1ea0a82a4b5b5af56cdc891510bc7210bbf57d891e7962b6092754e99a07/collective.z3cform.wizard-1.4.8.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1a230f071aa398972f39b56cb8c27558", "sha256": "aa378cec050ea8586ed54d81dd5a3a5a6d813a9216fdc983db799d5b2286a91b" }, "downloads": -1, "filename": "collective.z3cform.wizard-1.4.8.zip", "has_sig": false, "md5_digest": "1a230f071aa398972f39b56cb8c27558", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54338, "upload_time": "2013-04-18T16:53:26", "url": "https://files.pythonhosted.org/packages/12/1c/1ea0a82a4b5b5af56cdc891510bc7210bbf57d891e7962b6092754e99a07/collective.z3cform.wizard-1.4.8.zip" } ] }