{ "info": { "author": "Zope Community", "author_email": "zope-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Zope3", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "License :: OSI Approved :: Zope Public License", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": ".. contents::\n\n\n\n======================\nChanges for z3c.widget\n======================\n\n0.3.0 (2010-11-16)\n==================\n\n - Added translation for french.\n\n - Updated tests to run with `zope.formlib` 4.0 and `zope.schema` 3.6.\n\n - Using Python's ``doctest`` module instead of depreacted\n ``zope.testing.doctest[unit]``.\n\n - Added doctests to ``long_description`` to be visible on PyPI.\n\n2008/01/29 0.2.1\n================\n\n - add translation for hungarian and romanian languages\n\n2007/09/21 0.2.0\n================\n\n - feature: Added a date-selection widget.\n - feature: Added a social security number widget.\n - feature: Added a US phone number widget.\n\n2007/09/19 0.1.7\n================\n\n - added translation for english to get i18n working in some browsers\n\n\n2007/09/19 0.1.6\n================\n\n - added cheesehop classification, registered there\n - fixed typos\n\n2007/09/05 0.1.5\n================\n\n - bugfix: browse butten will now be enabled after cancel was clicked in\n the open file dialog\n - do not set the progessbar to 100% before the upload was started\n - bugfix: files will not be uploaded if no limit was set\n\n\n2007/09/05 0.1.4\n================\n\n - dealing file size during upload. If one or more files are bigger than\n the passed size each one of them will be ignored during upload but listed\n below the progress bar after the upload of the working files is done.\n - displaying the maximal allowed file size (if it's contained in the config\n file)\n\n\n2007/09/03 0.1.3\n================\n\n - bugfix: too much quoting.\n\n\n2007/09/03 0.1.2\n================\n\n - using passed config url instead of hard coded flashuploadvars.xml\n\n\n2007/08/06 0.1.1\n================\n\n - flashupload: better skinnability for upload.swf. cleanup folder\n structure for flash stuff.\n\n\n2007/06/14 0.1.0:\n=================\n\n - z3c.widget.image: added translations for es\n\n - update to newest bootstrap.py version\n\n\n======================\n Autocomplete Widgets\n======================\n\nAutocomplete widgets are an alternative to normal select widgets.\n\n >>> from z3c.widget.autocomplete.widget import AutoCompleteWidget\n\nLet us create a vocabulary.\n\n >>> from zope.schema.vocabulary import SimpleVocabulary\n >>> from zope.publisher.browser import TestRequest\n >>> from zope import schema, component, interface\n >>> items = ((u'value1',1,u'Title1'),\n ... (u'value2',2,u'Title2'),\n ... (u'value3',3,u'Title3'))\n >>> terms = map(lambda i: SimpleVocabulary.createTerm(*i),items)\n >>> voc = SimpleVocabulary(terms)\n >>> [term.title for term in voc]\n [u'Title1', u'Title2', u'Title3']\n >>> field = schema.Choice(__name__='foo',\n ... missing_value=None,\n ... vocabulary=voc)\n >>> request = TestRequest()\n >>> widget = AutoCompleteWidget(field, request)\n >>> widget\n \n >>> print widget()\n \n
\n \n\nLet's add some input. Note that the input must match the title of the\nvocabulary term.\n\n >>> request.form['field.foo']=u'Title1'\n >>> widget.getInputValue()\n u'value1'\n\nIf we have no matching title a ConversionError is raised.\n\n >>> request.form['field.foo']=u'Unknown'\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n ConversionError: ('Invalid value', u'Unknown')\n\nAlso the form value is the title of the term with the given value.\n\n >>> widget._toFormValue('value1')\n u'Title1'\n\n >>> suggestions = widget.getSuggestions('Title')\n >>> [title for title in suggestions]\n [u'Title1', u'Title2', u'Title3']\n >>> suggestions = widget.getSuggestions('Title1')\n >>> [title for title in suggestions]\n [u'Title1']\n >>> suggestions = widget.getSuggestions('ABC')\n >>> [title for title in suggestions]\n []\n >>> suggestions = widget.getSuggestions('title')\n >>> [title for title in suggestions]\n [u'Title1', u'Title2', u'Title3']\n\n\n=======================\nAutoCompleteWidget Demo\n=======================\n\nThis demo packe provides a simple content class which uses the\nz3c autocomplete widget.\n\n >>> from zope.testbrowser.testing import Browser\n >>> browser = Browser()\n >>> browser.handleErrors = False\n >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')\n >>> browser.open('http://localhost/@@contents.html')\n\nIt can be added by clicking on the \"Autocomplete Widget Demo\" link in the\nadd menu. And giving it a name.\n\n >>> link = browser.getLink('Autocomplete Widget Demo')\n >>> link.click()\n >>> nameCtrl = browser.getControl(name='new_value')\n >>> nameCtrl.value = 'mydemo'\n >>> applyCtrl = browser.getControl('Apply')\n >>> applyCtrl.click()\n >>> link = browser.getLink('mydemo')\n >>> link.click()\n >>> browser.url\n 'http://localhost/mydemo/@@edit.html'\n\nLet us test the widget rendering by direct access.\n\n >>> browser.open('http://localhost/mydemo/@@edit.html/++widget++country')\n >>> print browser.contents\n \n\nThe suggestions are proveded by its own view. \n\n >>> browser.open('http://localhost/mydemo/@@edit.html/++widget++country/suggestions')\n >>> print browser.contents\n\n >>> browser.open('http://localhost/++lang++en/mydemo/@@edit.html/++widget++country/suggestions?value=a')\n >>> print browser.contents\n \n \n \n \n\nSuggestions are translated.\n\n >>> browser.open('http://localhost/++lang++de/mydemo/@@edit.html/++widget++country/suggestions?value=a')\n >>> print browser.contents\n \n
    \n
  • Amerikanische Jungferninseln
  • \n
  • Amerikanisch-Ozeanien
  • \n
  • Algerien
  • \n
  • Andorra
  • \n
  • Antigua und Barbuda
  • \n
  • Afghanistan
  • \n
  • Anguilla
  • \n
  • Armenien
  • \n
  • Albanien
  • \n
  • Angola
  • \n
  • Antarktis
  • \n
  • Amerikanisch-Samoa
  • \n
  • Argentinien
  • \n
  • Australien
  • \n
  • Aruba
  • \n
  • Aserbaidschan
  • \n
\n \n \n\n\n=========================\nCountry selection Widgets\n=========================\n\nThis package provides widgets to select a country.\nThe dropdown type is registered as a default for the Country schema.\n\nThe pain was to sort the options after the translation.\n\n\n\nBefore we can start, we have to do a little bit of setup:\n\n >>> import zope.component\n >>> import zope.schema\n >>> import zope.app.form.browser\n >>> from z3c.widget.country.widget import CountryInputDropdown\n >>> from z3c.widget.country import ICountry\n >>> from z3c.i18n.iso import territoryVocabularyFactory\n >>> from zope.publisher.interfaces.browser import IBrowserRequest\n\nFirst we have to create a field and a request:\n\n >>> from z3c.widget.country import Country\n\n >>> countryFld = Country(\n ... __name__='country',\n ... title=u'Country',\n ... description=u'Select a Country')\n\n >>> from zope.publisher.browser import TestRequest\n >>> request = TestRequest()\n\nNow we can initialize the widget.\n\n >>> class Content(object):\n ... country = None\n >>> content = Content()\n >>> boundCountry = countryFld.bind(content)\n\n >>> widget = CountryInputDropdown(boundCountry,\n ... territoryVocabularyFactory(None), request)\n\nLet's make sure that all fields have the correct value:\n\n >>> widget.name\n 'field.country'\n\n >>> widget.label\n u'Country'\n\n >>> widget.hint\n u'Select a Country'\n\n >>> widget.visible\n True\n\nLet's see how the widget is rendered:\n\n >>> print widget()\n
\n
\n \n ...\n\n#Let's see the german translation:\n#z3c.i18n registrations required!!!\n#\n# >>> request = TestRequest(HTTP_ACCEPT_LANGUAGE='de')\n#\n# >>> widget = CountryInputDropdown(boundCountry,\n# ... territoryVocabularyFactory(None), request)\n#\n# >>> print widget()\n#
\n#
\n# \n# ...\n\n\n=====================\nDate Selection Widget\n=====================\n\nThe ``DateSelectWidget`` widget provides three select boxes presenting the\nday, month and year.\n\nFirst we have to create a field and a request. Note that we can set the\nyear range in this widget:\n\n >>> import datetime\n >>> from z3c.schema.dateselect import DateSelect\n >>> from z3c.widget.dateselect.browser import DateSelectWidget\n\n >>> field = DateSelect(\n ... title=u'Birthday',\n ... description=u'Somebodys birthday',\n ... yearRange=range(1930, 2007),\n ... required=True)\n >>> field.__name__ = 'field'\n\n >>> from zope.publisher.browser import TestRequest\n >>> request = TestRequest()\n\nNow we can initialize widget.\n\n >>> widget = DateSelectWidget(field, request)\n\nLet's make sure that all fields have the correct value:\n\n >>> widget.name\n 'field.field'\n\n >>> widget.label\n u'Birthday'\n\n >>> widget.hint\n u'Somebodys birthday'\n\n >>> widget.visible\n True\n\n >>> widget.required\n True\n\nThe constructor should have also created 3 widgets:\n\n >>> widget.widgets['year']\n \n >>> widget.widgets['month']\n \n >>> widget.widgets['day']\n \n\nlet's also test the year range:\n\n >>> '1929' in widget.widgets['year'].vocabulary.by_token.keys()\n False\n >>> '1930' in widget.widgets['year'].vocabulary.by_token.keys()\n True\n >>> '2006' in widget.widgets['year'].vocabulary.by_token.keys()\n True\n >>> '2007' in widget.widgets['year'].vocabulary.by_token.keys()\n False\n\nTest another year range:\n\n >>> field2 = DateSelect(\n ... title=u'Another Birthday',\n ... yearRange=range(2000, 2010))\n >>> field2.__name__ = 'field'\n >>> widget2 = DateSelectWidget(field2, request)\n\n >>> '1930' in widget2.widgets['year'].vocabulary.by_token.keys()\n False\n >>> '2000' in widget2.widgets['year'].vocabulary.by_token.keys()\n True\n >>> '2009' in widget2.widgets['year'].vocabulary.by_token.keys()\n True\n >>> '2010' in widget2.widgets['year'].vocabulary.by_token.keys()\n False\n\n\n``setRenderedValue(value)`` Method\n==================================\n\nThe first method is ``setRenderedValue()``. The widget has two use cases,\nbased on the type of value. If the value is a custom score system, it will\nsend the information to the custom, min and max widget:\n\n >>> widget = DateSelectWidget(field, request)\n >>> year = 2000\n >>> month = 12\n >>> day = 31\n >>> data = datetime.date(year, month, day)\n >>> widget.setRenderedValue(data)\n\n >>> 'value=\"2000\"' in widget()\n True\n >>> 'value=\"12\"' in widget()\n True\n >>> 'value=\"31\"' in widget()\n True\n\n\n``setPrefix(prefix)`` Method\n============================\n\nThe prefix determines the name of the widget and all its sub-widgets.\n\n >>> widget.name\n 'field.field'\n >>> widget.widgets['year'].name\n 'field.field.year'\n >>> widget.widgets['month'].name\n 'field.field.month'\n >>> widget.widgets['day'].name\n 'field.field.day'\n\n >>> widget.setPrefix('test.')\n\n >>> widget.name\n 'test.field'\n >>> widget.widgets['year'].name\n 'test.field.year'\n >>> widget.widgets['month'].name\n 'test.field.month'\n >>> widget.widgets['day'].name\n 'test.field.day'\n\nIf the prefix does not end in a dot, one is added:\n\n >>> widget.setPrefix('test')\n\n >>> widget.name\n 'test.field'\n >>> widget.widgets['year'].name\n 'test.field.year'\n >>> widget.widgets['month'].name\n 'test.field.month'\n >>> widget.widgets['day'].name\n 'test.field.day'\n\n\n``getInputValue()`` Method\n==========================\n\nThis method returns a date object:\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006',\n ... 'field.field.month': '2',\n ... 'field.field.day': '24'})\n\n >>> widget = DateSelectWidget(field, request)\n\n >>> value = widget.getInputValue()\n >>> value.year\n 2006\n >>> value.month\n 2\n >>> value.day\n 24\n\nIf a set of values does not produce a valid date object, a value error is\nraised:\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006',\n ... 'field.field.month': '2',\n ... 'field.field.day': '29'})\n\n >>> widget = DateSelectWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('field', u'Birthday', u'day is out of range for month')\n\n >>> widget._error.__class__\n \n\n\n``applyChanges(content)`` Method\n================================\n\nThis method applies the new date to the passed content. However, it\nmust be smart enough to detect whether the values really changed.\n\n >>> class Content(object):\n ... field = None\n >>> content = Content()\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006',\n ... 'field.field.month': '2',\n ... 'field.field.day': '24'})\n\n >>> widget = DateSelectWidget(field, request)\n >>> widget.applyChanges(content)\n True\n >>> content.field\n datetime.date(2006, 2, 24)\n\n >>> widget.applyChanges(content)\n False\n\n\n``hasInput()`` Method\n=====================\n\nThis method checks for any input, but does not validate it.\n\n >>> request = TestRequest()\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.month': '2'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.day': '24'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006',\n ... 'field.field.month': '2',\n ... 'field.field.day': '24'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasInput()\n True\n\n\n``hasValidInput()`` Method\n==========================\n\nAdditionally to checking for any input, this method also checks whether the\ninput is valid:\n\n >>> request = TestRequest()\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.month': '2'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.day': '24'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006',\n ... 'field.field.month': '2',\n ... 'field.field.day': '24'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.hasValidInput()\n True\n\n\n``hidden()`` Method\n===================\n\nThis method is renders the output as hidden fields:\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006',\n ... 'field.field.month': '2',\n ... 'field.field.day': '24'})\n >>> widget = DateSelectWidget(field, request)\n >>> print widget.hidden()\n \n \n \n\n\n``error()`` Method\n==================\n\nLet's test some bad data and check the error handling.\n\nThe day field contains an invalid value:\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006',\n ... 'field.field.month': '2',\n ... 'field.field.day': '99'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n ConversionError: (u'Invalid value', InvalidValue(\"token '99' not found in vocabulary\"))\n >>> print widget.error()\n Invalid value\n\nThe month field contains an invalid value:\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006',\n ... 'field.field.month': '0',\n ... 'field.field.day': '31'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n ConversionError: (u'Invalid value', InvalidValue(\"token '0' not found in vocabulary\"))\n >>> print widget.error()\n Invalid value\n\nThe year field contains an invalid value:\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '1900',\n ... 'field.field.month': '1',\n ... 'field.field.day': '31'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n ConversionError: (u'Invalid value', InvalidValue(\"token '1900' not found in vocabulary\"))\n >>> print widget.error()\n Invalid value\n\nThe single inputs were correct, but did not create a valid date.\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '1980',\n ... 'field.field.month': '2',\n ... 'field.field.day': '31'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('field', u'Birthday', u'day is out of range for month')\n\n >>> print widget.error()\n day is out of range for month\n\nNo error occurred:\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '1980',\n ... 'field.field.month': '1',\n ... 'field.field.day': '31'})\n >>> widget = DateSelectWidget(field, request)\n >>> widget.getInputValue()\n datetime.date(1980, 1, 31)\n >>> widget.error()\n ''\n\n\n``__call__()`` Method\n=====================\n\nThis method renders the widget using the sub-widgets. Let's see the output:\n\n >>> request = TestRequest(form={\n ... 'field.field.year': '2006',\n ... 'field.field.month': '2',\n ... 'field.field.day': '24'})\n >>> widget = DateSelectWidget(field, request)\n >>> print widget()\n  \n  \n \n \n\n\nDropDownDateWidget\n==================\n\n >>> from z3c.widget.dropdowndatewidget.widget import DropDownDateWidget\n\n >>> from zope.publisher.browser import TestRequest\n >>> request = TestRequest()\n\nWidgets are use for fields.\n\n >>> from zope.schema import Date\n >>> dateField = Date(__name__='foo', title=u'Foo')\n\n >>> widget = DropDownDateWidget(dateField, request)\n\n >>> widget.name\n 'field.foo'\n >>> widget.label\n u'Foo'\n >>> widget.hasInput()\n False\n\nWe need to provide some input.\n\n >>> request.form['field.foo.day'] = '1'\n >>> widget.hasInput()\n False\n >>> request.form['field.foo.month'] = '6'\n >>> widget.hasInput()\n False\n >>> request.form['field.foo.year'] = '1963'\n >>> widget.hasInput()\n True\n\nRead the value.\n\n >>> widget.getInputValue()\n datetime.date(1963, 6, 1)\n\nLet's render the widget.\n\n >>> print widget()\n
\n \n \n
\n\nAnd if we set a value.\n\n >>> from datetime import date\n >>> widget.setRenderedValue(date(1977, 4, 3))\n >>> print widget()\n
...\n
\n delete image\n
\n\n\n\n\n\n\n====================\nThe Widget Namespace\n====================\n\nThe widget namespace provides a way to traverse to the widgets of a\nformlib form.\n\n >>> from z3c.widget.namespace.namespace import WidgetHandler\n\nLet us define a form to test this behaviour.\n\n >>> from zope.formlib import form\n >>> from zope import interface, schema\n >>> class IMyContent(interface.Interface):\n ... title = schema.TextLine(title=u'Title')\n >>> class MyContent(object):\n ... interface.implements(IMyContent)\n ... title=None\n >>> content = MyContent()\n >>> from zope.publisher.browser import TestRequest\n >>> request = TestRequest()\n >>> class MyForm(form.EditForm):\n ... form_fields = form.Fields(IMyContent)\n >>> view = MyForm(content,request)\n >>> handler = WidgetHandler(view,request)\n >>> handler.traverse('title',None)\n \n\n\n\n=========================\nOptional Dropdown Widgets\n=========================\n\nThe Optional Dropdown Widget simulates the common desktop widget of a combo\nbox, which can also receive a custom entry.\n\nBefore we can start, we have to do a little bit of setup:\n\n >>> import zope.component\n >>> import zope.schema\n >>> import zope.app.form.browser\n >>> from zope.publisher.interfaces.browser import IBrowserRequest\n\n >>> zope.component.provideAdapter(\n ... zope.app.form.browser.TextWidget,\n ... (zope.schema.interfaces.ITextLine, IBrowserRequest),\n ... zope.app.form.interfaces.IInputWidget)\n\n\nFirst we have to create a field and a request:\n\n >>> from z3c.schema.optchoice import OptionalChoice\n\n >>> optchoice = OptionalChoice(\n ... __name__='occupation',\n ... title=u'Occupation',\n ... description=u'The Occupation',\n ... values=(u'Programmer', u'Designer', u'Project Manager'),\n ... value_type=zope.schema.TextLine())\n\n >>> from zope.publisher.browser import TestRequest\n >>> request = TestRequest()\n\nNow we can initialize widget.\n\n >>> class Content(object):\n ... occupation = None\n >>> content = Content()\n >>> boundOptChoice = optchoice.bind(content)\n\n >>> from z3c.widget.optdropdown import OptionalDropdownWidget\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n\nLet's make sure that all fields have the correct value:\n\n >>> widget.name\n 'field.occupation'\n\n >>> widget.label\n u'Occupation'\n\n >>> widget.hint\n u'The Occupation'\n\n >>> widget.visible\n True\n\n >>> widget.required\n True\n\nThe constructor should have also created 2 widgets:\n\n >>> widget.customWidget\n \n >>> widget.dropdownWidget\n \n\n\n``setRenderedValue(value)`` Method\n==================================\n\nThe first method is ``setRenderedValue()``. The widget has two use cases,\nbased on the type of value. If the value is a custom value, it will\nsend the information to the custom widget:\n\n >>> print widget.customWidget()\n <... value=\"\" />\n >>> 'selected=\"\"' in widget.dropdownWidget()\n False\n\n >>> widget.setRenderedValue(u'Scientist')\n\n >>> print widget.customWidget()\n <... value=\"Scientist\" />\n >>> 'selected=\"\"' in widget.dropdownWidget()\n False\n\nAfter resetting the widget passing in one of the choices in the\nvocabulary, the value should be displayed in the dropdown:\n\n >>> widget.setRenderedValue(u'Designer')\n\n >>> print widget.customWidget()\n <... value=\"\" />\n >>> print widget.dropdownWidget()\n
\n ...\n \n ...\n
\n\n\n``setPrefix(prefix)`` Method\n============================\n\nThe prefix determines the name of the widget and the sub-widgets.\n\n >>> widget.name\n 'field.occupation'\n >>> widget.dropdownWidget.name\n 'field.occupation.occupation'\n >>> widget.customWidget.name\n 'field.occupation.custom'\n\n >>> widget.setPrefix('test.')\n\n >>> widget.name\n 'test.occupation'\n >>> widget.dropdownWidget.name\n 'test.occupation.occupation'\n >>> widget.customWidget.name\n 'test.occupation.custom'\n\n\n``getInputValue()`` Method\n==========================\n\nThis method returns a value based on the input; the data is assumed to\nbe valid. In our case that means, if we entered a custom value, it is\nreturned:\n\n >>> request = TestRequest(form={\n ... 'field.occupation.custom': u'Teacher'})\n\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n\n >>> widget.getInputValue()\n u'Teacher'\n\nOn the other hand, if we selected a choice from the vocabulary, it should be\nreturned:\n\n >>> request = TestRequest(form={\n ... 'field.occupation.occupation': u'Designer'})\n\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n\n >>> widget.getInputValue()\n u'Designer'\n\n\n``applyChanges(content)`` Method\n================================\n\nThis method applies the new value to the passed content. However, it\nmust be smart enough to detect whether the values really changed.\n\n >>> request = TestRequest(form={\n ... 'field.occupation.custom': u'Teacher'})\n\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.applyChanges(content)\n True\n >>> content.occupation\n u'Teacher'\n\n >>> widget.applyChanges(content)\n False\n\n >>> request = TestRequest(form={\n ... 'field.occupation.occupation': u'Designer'})\n\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n\n >>> widget.applyChanges(content)\n True\n >>> content.occupation\n u'Designer'\n\n >>> widget.applyChanges(content)\n False\n\n\n``hasInput()`` Method\n=====================\n\nThis mehtod checks for any input, but does not validate it. In our case this\nmeans that either a choice has been selected or the the custom value has been\nentered.\n\n >>> request = TestRequest()\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.occupation.custom': u'Teacher\\nBad Stuff'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.hasInput()\n True\n\n >>> request = TestRequest(form={\n ... 'field.occupation.occupation': u'Waitress'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.hasInput()\n True\n\n\n``hasValidInput()`` Method\n==========================\n\nAdditionally to checking for any input, this method also checks whether the\ninput is valid:\n\n >>> request = TestRequest()\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.occupation.occupation': u'Waitress'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.occupation.occupation': u'Designer'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.hasValidInput()\n True\n\n >>> request = TestRequest(form={\n ... 'field.occupation.custom': u'Teacher\\nBad Stuff'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.occupation.custom': u'Teacher'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.hasValidInput()\n True\n\n\nhidden() Method\n===============\n\nThis method is implemented by simply concatenating the two widget's hidden\noutput:\n\n >>> request = TestRequest()\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.setRenderedValue(u'Designer')\n >>> print widget.hidden()\n \n \n\n >>> widget.setRenderedValue(u'Teacher')\n >>> print widget.hidden()\n \n \n\n\nerror() Method\n==============\n\nAgain, we have our two cases. If an error occured in the dropdown, it is\nreported:\n\n >>> from zope.app.form.interfaces import IWidgetInputError\n >>> from zope.app.form.browser.exception import WidgetInputErrorView\n >>> from zope.app.form.browser.interfaces import IWidgetInputErrorView\n\n >>> zope.component.provideAdapter(\n ... WidgetInputErrorView,\n ... (IWidgetInputError, IBrowserRequest), IWidgetInputErrorView)\n\n >>> request = TestRequest(form={\n ... 'field.occupation.occupation': u'Designer'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.getInputValue()\n u'Designer'\n >>> widget.error()\n ''\n\n >>> request = TestRequest(form={\n ... 'field.occupation.occupation': u'Waitress'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n ConversionError: (u'Invalid value', InvalidValue(\"token u'Waitress' not found in vocabulary\"))\n >>> widget.error()\n u'Invalid value'\n\nOtherwise the custom widget's errors are reported:\n\n >>> request = TestRequest(form={\n ... 'field.occupation.custom': u'Teacher'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.getInputValue()\n u'Teacher'\n >>> widget.error()\n ''\n\n >>> request = TestRequest(form={\n ... 'field.occupation.custom': u'Teacher\\nBad Stuff'})\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('custom', u'', ConstraintNotSatisfied(u'Teacher\\nBad Stuff'))\n >>> widget.error()\n u'Constraint not satisfied'\n\n\n__call__() Method\n=================\n\nThis method renders the widget using the sub-widgets. It simply adds the two\nwidgets' output placing the ``connector`` between them:\n\n >>> request = TestRequest(form={\n ... 'field.occupation.custom': u'Teacher'})\n\n >>> widget = OptionalDropdownWidget(boundOptChoice, request)\n >>> widget.connector\n u'
\\n'\n\n >>> print widget()\n
\n
\n \n
\n \n

\n \n\n\n====================\nSequenceTable Widget\n====================\n\nThis package provides a Sequence Widget just as\nzope.app.form.browser.sequencewidget.\nThe main difference is that it places the subobject's fields horizontally in\na table. That means a kind of voucher-item forms are piece of cake to do.\n\nThere is also a widget (SequenceTableJSWidget) which does the add/remove item\nin the browser with javascript.\nThe trick is to embed an invisible template of an empty row in the HTML,\nadd that each time a new row is required.\n\nDrawbacks of JS:\n * Validation is done ONLY when the complete form is submitted to the server.\n * Submitting the form and using the Back button of the browser does not work.\n\nWARNING!\n========\nThe subobject MUST have subwidgets. That is usually the case if the subobject\nis based on zope.schema.Object.\n\nTODO\n====\nTests.\nSome are there, some are copied from z.a.form.browser and need fix.\n\n==========\nSSN Widget\n==========\n\nThe social security number widget can be used as a custom widget for text line\nfields, enforcing a particular layout.\n\nFirst we have to create a field and a request:\n\n >>> import datetime\n >>> import zope.schema\n\n >>> field = zope.schema.TextLine(\n ... title=u'SSN',\n ... description=u'Social Security Number',\n ... required=True)\n >>> field.__name__ = 'field'\n\n >>> from zope.publisher.browser import TestRequest\n >>> request = TestRequest()\n\nNow we can initialize widget.\n\n >>> from z3c.widget.ssn.browser import SSNWidget\n >>> widget = SSNWidget(field, request)\n\nLet's make sure that all fields have the correct value:\n\n >>> widget.name\n 'field.field'\n\n >>> widget.label\n u'SSN'\n\n >>> widget.hint\n u'Social Security Number'\n\n >>> widget.visible\n True\n\n >>> widget.required\n True\n\nThe constructor should have also created 3 sub-widgets:\n\n >>> widget.widgets['first']\n \n >>> widget.widgets['second']\n \n >>> widget.widgets['third']\n \n\n\n``setRenderedValue(value)`` Method\n==================================\n\nThe first method is ``setRenderedValue()``. The widget has two use cases,\nbased on the type of value:\n\n >>> widget = SSNWidget(field, request)\n >>> widget.setRenderedValue(u'123-45-6789')\n >>> print widget()\n  — \n  — \n \n\n\n``setPrefix(prefix)`` Method\n============================\n\nThe prefix determines the name of the widget and all its sub-widgets.\n\n >>> widget.name\n 'field.field'\n >>> widget.widgets['first'].name\n 'field.field.first'\n >>> widget.widgets['second'].name\n 'field.field.second'\n >>> widget.widgets['third'].name\n 'field.field.third'\n\n >>> widget.setPrefix('test.')\n\n >>> widget.name\n 'test.field'\n >>> widget.widgets['first'].name\n 'test.field.first'\n >>> widget.widgets['second'].name\n 'test.field.second'\n >>> widget.widgets['third'].name\n 'test.field.third'\n\nIf the prefix does not end in a dot, one is added:\n\n >>> widget.setPrefix('test')\n\n >>> widget.name\n 'test.field'\n >>> widget.widgets['first'].name\n 'test.field.first'\n >>> widget.widgets['second'].name\n 'test.field.second'\n >>> widget.widgets['third'].name\n 'test.field.third'\n\n\n``getInputValue()`` Method\n==========================\n\nThis method returns the full SSN string:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '45',\n ... 'field.field.third': '6789'})\n\n >>> widget = SSNWidget(field, request)\n\n >>> value = widget.getInputValue()\n >>> value\n u'123-45-6789'\n\nIf a set of values does not produce a valid string, a value error is\nraised:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '1234',\n ... 'field.field.second': '56',\n ... 'field.field.third': '7890'})\n\n >>> widget = SSNWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('first', u'Frst three digits', ConstraintNotSatisfied(u'1234'))\n\n >>> widget._error.__class__\n \n\n\n``applyChanges(content)`` Method\n================================\n\nThis method applies the new SSN to the passed content. However, it\nmust be smart enough to detect whether the values really changed.\n\n >>> class Content(object):\n ... field = None\n >>> content = Content()\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '45',\n ... 'field.field.third': '6789'})\n\n >>> widget = SSNWidget(field, request)\n >>> widget.applyChanges(content)\n True\n >>> content.field\n u'123-45-6789'\n\n >>> widget.applyChanges(content)\n False\n\n\n``hasInput()`` Method\n=====================\n\nThis method checks for any input, but does not validate it.\n\n >>> request = TestRequest()\n >>> widget = SSNWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123'})\n >>> widget = SSNWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.second': '45'})\n >>> widget = SSNWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.third': '6789'})\n >>> widget = SSNWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '45',\n ... 'field.field.third': '6789'})\n >>> widget = SSNWidget(field, request)\n >>> widget.hasInput()\n True\n\n\n``hasValidInput()`` Method\n==========================\n\nAdditionally to checking for any input, this method also checks whether the\ninput is valid:\n\n >>> request = TestRequest()\n >>> widget = SSNWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123'})\n >>> widget = SSNWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.second': '45'})\n >>> widget = SSNWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.third': '6789'})\n >>> widget = SSNWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '45',\n ... 'field.field.third': '6789'})\n >>> widget = SSNWidget(field, request)\n >>> widget.hasValidInput()\n True\n\n\n``hidden()`` Method\n===================\n\nThis method is renders the output as hidden fields:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '45',\n ... 'field.field.third': '6789'})\n >>> widget = SSNWidget(field, request)\n >>> print widget.hidden()\n \n \n \n\n\n``error()`` Method\n==================\n\nLet's test some bad data and check the error handling.\n\nThe third field contains an invalid value:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '45',\n ... 'field.field.third': '678'})\n >>> widget = SSNWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('third', u'Third four digits', ConstraintNotSatisfied(u'678'))\n >>> print widget.error()\n Constraint not satisfied\n\nThe second field contains an invalid value:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '4-',\n ... 'field.field.third': '6789'})\n >>> widget = SSNWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('second', u'Second two digits', ConstraintNotSatisfied(u'4-'))\n >>> print widget.error()\n Constraint not satisfied\n\nThe first field contains an invalid value:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': 'xxx',\n ... 'field.field.second': '45',\n ... 'field.field.third': '6789'})\n >>> widget = SSNWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('first', u'Frst three digits', ConstraintNotSatisfied(u'xxx'))\n >>> print widget.error()\n Constraint not satisfied\n\nNo error occurred:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '45',\n ... 'field.field.third': '6789'})\n >>> widget = SSNWidget(field, request)\n >>> widget.getInputValue()\n u'123-45-6789'\n >>> widget.error()\n ''\n\n\n``__call__()`` Method\n=====================\n\nThis method renders the widget using the sub-widgets. Let's see the output:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '45',\n ... 'field.field.third': '6789'})\n >>> widget = SSNWidget(field, request)\n >>> print widget()\n  — \n  — \n \n\n\n==========================\nHTML-Editor Widget TinyMCE\n==========================\n\nThis package provides a WYSIWYG-Editor-Widget for HTML-Content, by\nusing the greate TinyMCE editor (see: http://tinymce.moxiecode.com/).\n\n\n\n\n===============\nUS Phone Widget\n===============\n\nThe US phone number widget can be used as a custom widget for text line\nfields, enforcing a particular layout.\n\nFirst we have to create a field and a request:\n\n >>> import datetime\n >>> import zope.schema\n\n >>> field = zope.schema.TextLine(\n ... title=u'Phone',\n ... description=u'Phone Number',\n ... required=True)\n >>> field.__name__ = 'field'\n\n >>> from zope.publisher.browser import TestRequest\n >>> request = TestRequest()\n\nNow we can initialize widget.\n\n >>> from z3c.widget.usphone.browser import PhoneWidget\n >>> widget = PhoneWidget(field, request)\n\nLet's make sure that all fields have the correct value:\n\n >>> widget.name\n 'field.field'\n\n >>> widget.label\n u'Phone'\n\n >>> widget.hint\n u'Phone Number'\n\n >>> widget.visible\n True\n\n >>> widget.required\n True\n\nThe constructor should have also created 3 sub-widgets:\n\n >>> widget.widgets['first']\n \n >>> widget.widgets['second']\n \n >>> widget.widgets['third']\n \n\n\n``setRenderedValue(value)`` Method\n==================================\n\nThe first method is ``setRenderedValue()``. The widget has two use cases,\nbased on the type of value:\n\n >>> widget = PhoneWidget(field, request)\n >>> widget.setRenderedValue(u'123-456-7890')\n >>> print widget()\n () \n  — \n \n\n\n``setPrefix(prefix)`` Method\n============================\n\nThe prefix determines the name of the widget and all its sub-widgets.\n\n >>> widget.name\n 'field.field'\n >>> widget.widgets['first'].name\n 'field.field.first'\n >>> widget.widgets['second'].name\n 'field.field.second'\n >>> widget.widgets['third'].name\n 'field.field.third'\n\n >>> widget.setPrefix('test.')\n\n >>> widget.name\n 'test.field'\n >>> widget.widgets['first'].name\n 'test.field.first'\n >>> widget.widgets['second'].name\n 'test.field.second'\n >>> widget.widgets['third'].name\n 'test.field.third'\n\nIf the prefix does not end in a dot, one is added:\n\n >>> widget.setPrefix('test')\n\n >>> widget.name\n 'test.field'\n >>> widget.widgets['first'].name\n 'test.field.first'\n >>> widget.widgets['second'].name\n 'test.field.second'\n >>> widget.widgets['third'].name\n 'test.field.third'\n\n\n``getInputValue()`` Method\n==========================\n\nThis method returns the full phone string:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '456',\n ... 'field.field.third': '7890'})\n\n >>> widget = PhoneWidget(field, request)\n\n >>> value = widget.getInputValue()\n >>> value\n u'123-456-7890'\n\nIf a set of values does not produce a valid string, a value error is\nraised:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '1234',\n ... 'field.field.second': '56',\n ... 'field.field.third': '7890'})\n\n >>> widget = PhoneWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('first', u'Area Code', ConstraintNotSatisfied(u'1234'))\n\n >>> widget._error.__class__\n \n\n\n``applyChanges(content)`` Method\n================================\n\nThis method applies the new phone number to the passed content. However, it\nmust be smart enough to detect whether the values really changed.\n\n >>> class Content(object):\n ... field = None\n >>> content = Content()\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '456',\n ... 'field.field.third': '7890'})\n\n >>> widget = PhoneWidget(field, request)\n >>> widget.applyChanges(content)\n True\n >>> content.field\n u'123-456-7890'\n\n >>> widget.applyChanges(content)\n False\n\n\n``hasInput()`` Method\n=====================\n\nThis method checks for any input, but does not validate it.\n\n >>> request = TestRequest()\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.second': '456'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.third': '7890'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '456',\n ... 'field.field.third': '7890'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasInput()\n True\n\n\n``hasValidInput()`` Method\n==========================\n\nAdditionally to checking for any input, this method also checks whether the\ninput is valid:\n\n >>> request = TestRequest()\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.second': '456'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.third': '7890'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasValidInput()\n False\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '456',\n ... 'field.field.third': '7890'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.hasValidInput()\n True\n\n\n``hidden()`` Method\n===================\n\nThis method is renders the output as hidden fields:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '456',\n ... 'field.field.third': '7890'})\n >>> widget = PhoneWidget(field, request)\n >>> print widget.hidden()\n \n \n \n\n\n``error()`` Method\n==================\n\nLet's test some bad data and check the error handling.\n\nThe third field contains an invalid value:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '456',\n ... 'field.field.third': '78901'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('third', u'Four Digits', ConstraintNotSatisfied(u'78901'))\n\n >>> print widget.error()\n Constraint not satisfied\n\nThe second field contains an invalid value:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '45-',\n ... 'field.field.third': '7890'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('second', u'Three Digits', ConstraintNotSatisfied(u'45-'))\n\n >>> print widget.error()\n Constraint not satisfied\n\nThe first field contains an invalid value:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': 'xxx',\n ... 'field.field.second': '456',\n ... 'field.field.third': '7890'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.getInputValue()\n Traceback (most recent call last):\n ...\n WidgetInputError: ('first', u'Area Code', ConstraintNotSatisfied(u'xxx'))\n\n >>> print widget.error()\n Constraint not satisfied\n\nNo error occurred:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '456',\n ... 'field.field.third': '7890'})\n >>> widget = PhoneWidget(field, request)\n >>> widget.getInputValue()\n u'123-456-7890'\n >>> widget.error()\n ''\n\n\n``__call__()`` Method\n=====================\n\nThis method renders the widget using the sub-widgets. Let's see the output:\n\n >>> request = TestRequest(form={\n ... 'field.field.first': '123',\n ... 'field.field.second': '456',\n ... 'field.field.third': '7890'})\n >>> widget = PhoneWidget(field, request)\n >>> print widget()\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.zope.org/z3c.widget", "keywords": "zope zope3 form formlib", "license": "ZPL 2.1", "maintainer": null, "maintainer_email": null, "name": "z3c.widget", "package_url": "https://pypi.org/project/z3c.widget/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/z3c.widget/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://svn.zope.org/z3c.widget" }, "release_url": "https://pypi.org/project/z3c.widget/0.3.0/", "requires_dist": null, "requires_python": null, "summary": "Additional zope.formlib Widgets", "version": "0.3.0" }, "last_serial": 802126, "releases": { "0.1.6": [ { "comment_text": "", "digests": { "md5": "4d99a2fe65774b2c1fe1bcdc671de181", "sha256": "acad0b89c80c6e55eab191ef4761bf363e2918b9c3fe1982d240e152b0f8bf37" }, "downloads": -1, "filename": "z3c.widget-0.1.6-py2.4.egg", "has_sig": false, "md5_digest": "4d99a2fe65774b2c1fe1bcdc671de181", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 1602934, "upload_time": "2007-09-18T22:29:15", "url": "https://files.pythonhosted.org/packages/f6/71/df78e63ba3e1ccbe80217e5683df08da785ad7337d1231a934aaa1c633cb/z3c.widget-0.1.6-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "906a825302e40aaa515c64ba5c3f8431", "sha256": "35b1e9328471d833f3ef7618408cd8899f467a9da11e238008a7798d9658bef0" }, "downloads": -1, "filename": "z3c.widget-0.1.6.tar.gz", "has_sig": false, "md5_digest": "906a825302e40aaa515c64ba5c3f8431", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1259191, "upload_time": "2007-09-18T22:28:45", "url": "https://files.pythonhosted.org/packages/6a/58/2438b51fe2dcfd3464049159289f0980184a0a09b5da1b1ebae2b60aee20/z3c.widget-0.1.6.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "e5936e943a9fb4f75ed45c51111a5790", "sha256": "f5432f07ee9f28586eeea573a48a4af10a950efad8651de815bc043407f03f0d" }, "downloads": -1, "filename": "z3c.widget-0.3.0.tar.gz", "has_sig": false, "md5_digest": "e5936e943a9fb4f75ed45c51111a5790", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1287836, "upload_time": "2010-11-16T08:43:54", "url": "https://files.pythonhosted.org/packages/ff/81/fc884bb8c411579254401e626e517f1b456257cc58b8b27ebff8a58d2574/z3c.widget-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e5936e943a9fb4f75ed45c51111a5790", "sha256": "f5432f07ee9f28586eeea573a48a4af10a950efad8651de815bc043407f03f0d" }, "downloads": -1, "filename": "z3c.widget-0.3.0.tar.gz", "has_sig": false, "md5_digest": "e5936e943a9fb4f75ed45c51111a5790", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1287836, "upload_time": "2010-11-16T08:43:54", "url": "https://files.pythonhosted.org/packages/ff/81/fc884bb8c411579254401e626e517f1b456257cc58b8b27ebff8a58d2574/z3c.widget-0.3.0.tar.gz" } ] }