{ "info": { "author": "Martin Aspeli", "author_email": "optilude@gmail.com", "bugtrack_url": null, "classifiers": [ "Framework :: Plone", "Framework :: Plone :: 4.3", "Framework :: Plone :: 5.0", "Framework :: Plone :: 5.1", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "=====================\nplone.directives.form\n=====================\n\nThis package provides optional, Grok-like directives for configuring\nforms, as defined by the `z3c.form`_ library, using XML schemata as defined by\n`plone.supermodel`_ and/or using widget form layout as defined by\n`plone.autoform`_. It depends on `five.grok`_, which in turn depends on the\nvarious re-usable grokcore.* packages, but not Grok itself.\n\n.. contents:: Contents\n\nInstallation\n------------\n\nTo use this package you must first install it, either by depending on it\nin your own ``setup.py`` (under the ``install_requires`` list), or by adding\nit directly to your buildout.\n\nThis will pull in a number of dependencies. You probably want to pin those\ndown to known-good versions by using a known-good version set. See the\ninstallation instructions of `five.grok`_ for a starting point.\n\nYou must also load the relevant configuration from ``meta.zcml`` and\n``configure.zcml``. For example, you could use statements like the following\nin your ``configure.zcml``::\n\n \n \n\nor if you declare dependencies in setup.py using install_requires::\n\n \n\nSchemata loaded from XML\n------------------------\n\n``plone.directives.form`` used to contain a directive for loading an XML-based\nschema model into a Python interface. This directive has moved to ``plone.supermodel``, as ``plone.supermodel.model.load``.\n\nForm widget hints\n-----------------\n\n``plone.directives.form`` used to contain a number of directives for generating\na form from a schema, using hints stored in tagged values on that schema to\ncontrol the form's layout and field widgets. These directives have now moved\nto other packages to avoid a dependency of Dexterity on grok.\n\nThe ``fieldset`` and ``primary`` directives are now in\n``plone.supermodel.model``.\n\nThe ``omitted``, ``no_omit``, ``mode``, ``widget``, ``order_before``,\n``order_after``, ``read_permission``, and ``write_permission`` directives are\nnow in ``plone.autoform.directives``.\n\nValue adapters\n--------------\n\nz3c.form has the concept of a \"value adapter\", a component that can provide\na value for an attribute (usually of widgets and buttons) at runtime. This\npackage comes with some helpful decorators to register value adapters for\ncomputed values. For example::\n\n from plone.directives import form\n from zope import schema\n\n class IMySchema(form.Schema):\n\n title = schema.TextLine(title=u\"Title\")\n\n @form.default_value(field=IMySchema['title'])\n def default_title(data):\n return data.context.suggested_title\n\nThe decorator takes one or more discriminators. The available discriminators\nfor ``default_value`` are:\n\ncontext\n The type of context (e.g. an interface)\n\nrequest\n The type of request (e.g. a layer marker interface). You can\n use 'layer' as an alias for 'request', but note that the data passed\n to the function will have a 'request' attribute only.\n\nview\n The type of form (e.g. a form instance or interface). You can\n use 'form' as an alias for 'view', but note that the data passed to\n the function will have 'view' attribute only.\n\nfield\n The field instance (or a field interface).\n\nwidget\n The widget type (e.g. an interface).\n\nYou must specify either ``field`` or ``widget``. The object passed to the\ndecorated function has an attribute for each discriminator.\n\nThere are two more decorators:\n\nwidget_label\n Provide a dynamic label for a widget. Takes the same discriminators as the\n ``default_value`` decorator.\n\nbutton_label -- Provide a dynamic label for a button. Takes parameters\n content (alias context), request (alias layer), form (alias view),\n manager and button.\n\nPlease note the rather unfortunate differences in naming between the button\ndescriptors (content vs. context, form vs. view) and the widget ones. The\ndescriptor will accept the same names, but the data object passed to the\nfunction will only contain the names as defined in z3c.form, so be careful.\n\nValidators\n----------\n\nBy default, z3c.form uses fields' native validation, as implemented by the\n``IField.validate()`` method, as well as field constraints (functions passed\nas the ``constraint`` parameter to fields) and schema invariants (using the\n``@zope.interface.invariant`` decorator in a schema interface). In addition,\nyou can define your own widget validators (for an individual field of the\nform) and widget manager validators (which cover the entire form). This is\nuseful if you do not want to define a validator on the schema, e.g. because\nthe schema is also used elsewhere, or if you want to create a more generic\nvalidator that is applied to any fields that match its discriminators.\n\nThis package provides a grokked decorator which you can use to define a simple\nwidget validator, called ``@form.validator()``::\n\n from plone.directives import form\n from zope import schema\n\n class IMySchema(form.Schema):\n\n title = schema.TextLine(title=u\"Title\")\n\n @form.validator(field=IMySchema['title'])\n def validateTitle(value):\n if value == value.upper():\n raise schema.ValidationError(u\"Please don't shout\")\n\nThe validator should return nothing if the field is valid, or raise an\n``zope.schema.ValidationError`` exception with an error message.\n\nThe ``@form.validator()`` decorator can take various keyword arguments that\ndetermine when the validator is invoked. These are:\n\ncontext\n The type of context (e.g. an interface)\n\nrequest\n The type of request (e.g. a layer marker interface).\n\nview\n The type of form (e.g. a form instance or interface).\n\nfield\n The field instance (or a field interface).\n\nwidget\n The widget type (e.g. an interface).\n\nNote that this validator function does not give access to the full context\nof the standard validator, such as the field, widget, context or request.\nIf you need that, you can create a standard validator adapter, e.g. using\n``grok.Adapter``. See the `z3c.form`_ documentation for details.\n\nAlso note that the standard field validator will be called before the custom\nvalidator is invoked. If you need to override the validator wholesale, you\ncan again do so with a custom adapter.\n\nError messages\n--------------\n\nWhen using custom validators, it is easy to supply a tailored error message.\nHowever, the error messages that arise from the default field validation\nmechanism (e.g. when a required field is omitted) are by necessity more\ngeneric. Sometimes, it may be necessary to override these messages to make\nthem more user friendly.\n\nTo customise an error message, you can use the ``@form.error_message`` grokked\ndecorator. For example::\n\n from plone.directives import form\n from zope import schema\n\n from zope.schema.interfaces import TooShort\n\n class IMySchema(form.Schema):\n\n title = schema.TextLine(title=u\"Title\", min_length=2)\n\n @form.error_message(error=TooShort, field=IMySchema['title'])\n def titleTooShort(value):\n return u\"The title '%s' is too short\" % value\n\nThe decorated function will be called when constructing an error message for\nthe given field. It should return a unicode string or translatable message.\nThe value passed is the value that failed validation.\n\nThe ``@form.error_message`` validator takes keyword arguments that determine\nwhen the message is used. It is possible to register a generic error message\nfor a given type of error that applies to all fields, or, as shown above,\na message specific to an individual field and error. The latter is more\ncommon. In general, you should be careful if you omit either or both of the\n``error`` and ``field`` discriminators.\n\nerror\n An exception class that represents the error. All errors inherit from\n ``zope.interface.Invalid``, and most error also inherit from\n ``zope.schema.interfaces.ValidationError``. See below for a list of\n common exception types.\nrequest\n The current request. Use this to tie the error to a specific browser\n layer interface.\nwidget\n The widget that was used. May be either a widget interface or a specific\n widget class.\nfield\n The field that was used, normally given as a field instance obtained from\n an interface, as illustrated above.\nform\n The current form, either as a class or an interface. This is useful if\n the same interface is used in more than one form, but you only want the\n error to be shown in one form.\ncontent\n The content item that is acting as the context for the form. May be given\n as either an interface or a class.\n\nNone of these parameters is required, but you would normally supply at least\n``error``. In most cases, you should also supply the ``field``, as shown\nabove.\n\nThe most common validation error exception types are defined in\n``zope.schema``, and can be imported from ``zope.schema.interfaces``:\n\n* ``RequiredMissing``, used when a required field is submitted without a value\n* ``WrongType``, used when a field is passed a value of an invalid type\n* ``TooBig`` and ``TooSmall``, used when a value is outside the ``min`` and/or\n ``max`` range specified for ordered fields (e.g. numeric or date fields)\n* ``TooLong`` and ``TooShort``, used when a value is outside the\n ``min_length`` and/or ``max_length`` range specified for length-aware fields\n (e.g. text or sequence fields)\n* ``InvalidValue``, used when a value is invalid, e.g. a non-ASCII character\n passed to an ASCII field\n* ``ConstraintNotSatisfied``, used when a ``constraint`` method returns\n ``False``\n* ``WrongContainedType``, used if an object of an invalid type is added\n to a sequence (i.e. the type does not conform to the field's\n ``value_type``)\n* ``NotUnique``, used if a uniqueness constraint is violated\n* ``InvalidURI``, used for ``URI`` fields if the value is not a valid URI\n* ``InvalidId``, used for ``Id`` fields if the value is not a valid id\n* ``InvalidDottedName``, used for ``DottedName`` fields if the value is not\n a valid dotted name\n\nForm base classes\n-----------------\n\nIf you need to create your own forms, this package provides a number of\nconvenient base classes that will be grokked much like a ``grok.View``.\n\nIn Zope 2.10, the grokkers take care of wrapping the form in a\n`plone.z3cform`_ FormWrapper as well. In Zope 2.12 and later, there is no\nwrapper by default. If you want one (e.g. if you are using a custom template\nand you need it to work in both Zope 2.10 and 2.12), you can use the\n``form.wrap()`` directive in the form class.\n\nThe base classes can all be imported from ``plone.directives.form``, e.g::\n\n from five import grok\n from plone.directives import form, button\n from z3c.form import field\n\n class MyForm(form.Form):\n grok.context(ISomeContext)\n grok.require('zope2.View')\n\n fields = field.Fields(IMyFormSchema)\n\n @button.buttonAndHandler(u'Submit')\n def handleApply(self, action):\n data, errors = self.extractData()\n ...\n\nThe allowed directives are:\n\n* ``grok.context()``, to specify the context of form view. If not given, the\n grokker will look for a module-level context, much like the standard\n ``grok.View``.\n* ``grok.require()``, to specify a permission. The default is ``zope2.View``\n for standard forms, ``cmf.ModifyPortalContent`` for edit forms, and\n ``cmf.AddPortalContent`` for add forms.\n* ``grok.layer()`` to specify a browser layer\n* ``grok.name()`` to set a different name. By default your form will be\n available as view @@yourformclassnamelowercase, but you can use\n ``grok.name()`` to set name explicitly.\n* ``form.wrap()`` to wrap the form in a layout wrapper view. You can pass\n an argument of ``True`` or ``False`` to enable or disable wrapping. If no\n argument is given, it defaults to ``True``. If omitted, the global default\n is used, which is to wrap in Zope 2.11 or earlier, and to not wrap in Zope\n 2.12 or later\n\nMore complex example how to use Grok directives with a form::\n\n from plone.directives import form\n from Products.CMFCore.interfaces import ISiteRoot\n\n class CompanyCreationForm(form.SchemaForm):\n \"\"\" A sample form how to \"create companies\".\n\n \"\"\"\n\n # Which plone.directives.form.Schema subclass is used to define\n # fields for this form (not shown on this example)\n schema = ICompanyCreationFormSchema\n\n # Permission required to view/submit the form\n grok.require(\"cmf.ManagePortal\")\n\n # The form does not care about the context object\n # and should not try to extract field value\n # defaults out of it\n ignoreContext = True\n\n # This form is available at the site root only\n grok.context(ISiteRoot)\n\n # The form will be available in Plone site root only\n # Use http://yourhost/@@create_company URL to access this form\n grok.name(\"create_company\")\n\n\n\n\nEach of the form base classes has a \"schema\" equivalent, which can be\ninitialised with a ``schema`` attribute instead of the ``fields`` attribute.\nThese forms use `plone.autoform`_'s ``AutoExtensibleForm`` as a base class,\nallowing schema hints as shown above to be processed::\n\n from plone.directives import form\n from z3c.form import button\n\n class MyForm(form.SchemaForm):\n grok.context(ISomeContext)\n grok.require('zope2.View')\n\n schema = IMySchema\n\n @button.buttonAndHandler(u'Submit')\n def handleApply(self, action):\n data, errors = self.extractData()\n ...\n\nNote that the ``schema`` can be omitted if you are using ``SchemaForm`` or\n``SchemaEditForm`` and you have given an interface as the argument to\n``grok.context()``. In this case, the context interface will be used as the\ndefault schema.\n\nThe available form base classes are:\n\nForm\n A simple page form, basically a grokked version of ``z3c.form.form.Form``.\n\nSchemaForm\n A page form that uses `plone.autoform`_. You must set the ``schema`` class\n variable (or implement it as a property) to a schema interface form which\n the form will be built. Form widget hints will be taken into account.\n\nAddForm\n A simple add form with \"Add\" and \"Cancel\" buttons. You must implement\n the ``create()`` and ``add()`` methods. See the `z3c.form`_ documentation\n for more details.\n\nSchemaAddForm\n An add form using `plone.autoform`_. Again, you must set the ``schema``\n class variable.\n\nEditForm\n A simple edit form with \"Save\" and \"Cancel\" buttons. See the `z3c.form`_\n documentation for more details.\n\nSchemaEditForm\n An edit form using `plone.autoform`_. Again, you must set the ``schema``\n class variable.\n\nDisplayForm\n A view with an automatically associated template (like ``grok.View``),\n that is initialised with display widgets. See `plone.autoform`_'s\n ``WidgetsView`` for more details.\n\nAll of the grokked form base classes above support associating a custom\ntemplate with the form. This uses the same semantics as ``grok.View``. See\n`grokcore.view`_ for details, but briefly:\n\n* If you want to completely customise rendering, you can override the\n ``render()`` method.\n* If you want to use a page template to render a form called ``MyForm`` in\n the module ``my.package.forms``, create a directory inside ``my.package``\n called ``forms_templates`` (the prefix should match the module name),\n and place a file there called ``myform.pt``.\n* If you do neither, the default form template will be used, as is the\n standard behaviour in z3c.form.\n\nNote that the automatically associated form template can use ``grok.View``\nmethods, such as ``view.url()`` and ``view.redirect()``, which are defined\nin the grokked form base classes.\n\nAlso note that you can use the view ``@@ploneform-macros`` from\n`plone.app.z3cform`_ if you want to use some of the standard form markup.\nFor example, the ``titlelessform`` macro will render the ``
`` element\nand all fieldsets and fields::\n\n \n\nTroubleshooting\n---------------\n\nForms are not found\n=====================\n\nWhen you try to access your form on the site, you'll get page not found (NotFound exception).\n\n* Make sure that you typed your form name correctly and it matches ``grok.name()``\n or lowercased class name\n\n* Make sure you have \n or similar in configure.zcml of your add-on product\n\n.. _five.grok: http://pypi.python.org/pypi/five.grok\n.. _z3c.form: http://pypi.python.org/pypi/z3c.form\n.. _plone.z3cform: http://pypi.python.org/pypi/plone.z3cform\n.. _plone.app.z3cform: http://pypi.python.org/pypi/plone.app.z3cform\n.. _plone.supermodel: http://pypi.python.org/pypi/plone.supermodel\n.. _plone.autoform: http://pypi.python.org/pypi/plone.autoform\n.. _grokcore.view: http://pypi.python.org/pypi/grokcore.view\n\nChangelog\n=========\n\n2.0.3 (2017-05-09)\n------------------\n\nBug fixes:\n\n- Remove unused import and added a missing import on example.\n [bruno]\n\n- Update setup.py to point to github repository.\n [esteele]\n\n2.0.2 (2015-11-28)\n------------------\n\nFixes:\n\n- Changed i18n_domain to \"plone\".\n [staeff]\n\n- Removed unneeded i18n-attribute.\n [staeff]\n\n\n2.0.1 (2015-05-04)\n------------------\n\n- pep8.\n [maurits]\n\n- Whitespaces cleanup.\n [gforcada]\n\n\n2.0 (2012-08-30)\n----------------\n\n* Update to work with grokcore.view >= 2.2. This generally means that this\n package is no longer compatible with Plone < 4.3.\n [davisagli]\n\n* Change i18n domain to plone.dexterity to reuse the translations. plone.dexterity\n already has all the strings needed.\n [gaudenz]\n\n* Fixes documentation mistake of documented ``form.wrapped()`` directive\n which is in fact ``form.wrap()``\n [romanofski]\n\n* A number of schema directives were moved to other packages and reimplemented\n to not depend on grok. The ``Schema`` class and the ``model``, ``fieldset``,\n and ``primary`` directives were moved to ``plone.supermodel.model``. The\n ``omitted``, ``no_omit``, ``mode``, ``widget``, ``order_before``,\n ``order_after``, ``read_permission``, and ``write_permission`` directives were\n moved to ``plone.autoform.directives``.\n\n For now the directives are still available under their old names in this\n package, but they are deprecated and may be removed at some point.\n\n Some minor related changes:\n\n * Tagged values are now stored on schemas as soon as they are defined, rather\n than when the schemas are grokked. Additional actions required by the\n directives, if any, are performed at the end of ZCML configuration.\n * Due to a bug in zope.interface, ``plone.supermodel.model.Schema`` must be\n the `first` base class of any schema to which the directives should apply.\n Also, unfortunately it is no longer possible to give an error if the schema\n directives are called on an interface that is not a ``Schema``.\n\n [davisagli]\n\n1.0 - 2011-05-20\n----------------\n\n* No changes.\n\n1.0b7 - 2010-04-20\n------------------\n\n* Allow arbitrary extra parameters for the fieldset directive. This is useful\n for extensions that want to tweak fieldset behaviour or rendering.\n [wichert]\n\n* Add ``no_omit`` directive, so that fields that have been omitted can be\n re-included again on for a more specific form interface.\n [davisagli]\n\n* Accept a form interface as an optional positional argument for the ``mode``\n and ``omitted`` directives, and store it in the tagged values using the new\n format expected by plone.autoform.\n [davisagli]\n\n* Add ``@form.error_message()`` decorator for registering custom error\n messages for errors and/or fields.\n [optilude]\n\n* Add ``@form.validator()`` decorator to register a simple field validator.\n See README.txt for details.\n [optilude]\n\n* Support unwrapped forms (in Zope 2.12). The default is to wrap in Zope <\n 2.12, and not to wrap in Zope >= 2.12. A new ``form.wrapped()`` directive\n can be used to force wrapping or non-wrapping (by passing ``False`` as an\n argument).\n [optilude]\n\n* Warn more forcefully when using form directives on interfaces not deriving\n from ``Schema``, or using schema hints that refer to field names that cannot\n be found.\n [optilude]\n\n1.0b6 - 2009-10-08\n------------------\n\n* Add support for the ``primary()`` directive, which is used to set the\n primary field for marshalling. See the ``plone.rfc822`` for details.\n [optilude]\n\n1.0b5 - 2009-07-21\n------------------\n\n* Updated to new five.grok release.\n [optilude]\n\n1.0b3 - 2009-07-12\n------------------\n\n* Made adjustments for changes in plone.supermodel's API.\n [optilude]\n\n1.0b2 - 2009-06-15\n------------------\n\n* Make sure that we don't lose the function when using the\n @form.default_value() decorator and the other value decorators.\n [optilude]\n\n1.0b1 - 2009-04-17\n------------------\n\n* Initial release", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/plone/plone.directives.form", "keywords": "grok plone dexterity form content", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "plone.directives.form", "package_url": "https://pypi.org/project/plone.directives.form/", "platform": "", "project_url": "https://pypi.org/project/plone.directives.form/", "project_urls": { "Homepage": "https://github.com/plone/plone.directives.form" }, "release_url": "https://pypi.org/project/plone.directives.form/2.0.3/", "requires_dist": null, "requires_python": "", "summary": "Grok-like directives configuring forms", "version": "2.0.3" }, "last_serial": 2861907, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "e40a4b3fdde3768a137a450374934565", "sha256": "ff5ca82da9cf6f3e87a2cb02c4069c93f4e6cd327f3a67ae962c6981dc4edb41" }, "downloads": -1, "filename": "plone.directives.form-1.0.zip", "has_sig": false, "md5_digest": "e40a4b3fdde3768a137a450374934565", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55058, "upload_time": "2011-05-20T23:47:07", "url": "https://files.pythonhosted.org/packages/6c/96/017aa7f7c000f40e13463d6b2b84b524ff85aaa62e0a149f1d48d4a8caa0/plone.directives.form-1.0.zip" } ], "1.0b1": [ { "comment_text": "", "digests": { "md5": "23fad180bdb5e1c7bee683d8f5098d44", "sha256": "472901a0c4401d0e4603a11259c862360d62891b5fe0362c09dc90bf89a2c391" }, "downloads": -1, "filename": "plone.directives.form-1.0b1.tar.gz", "has_sig": false, "md5_digest": "23fad180bdb5e1c7bee683d8f5098d44", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21802, "upload_time": "2009-04-17T06:48:48", "url": "https://files.pythonhosted.org/packages/b6/c2/0777f0e9d6149967deb14c626fd10b6d014ba164f6fdc094d5814c58cfdf/plone.directives.form-1.0b1.tar.gz" } ], "1.0b2": [ { "comment_text": "", "digests": { "md5": "754a59c10966941ab2dfab19eda08bf9", "sha256": "c7d2d882ad142dbcbe9d7b8a604a6446f7992be554d0e77c1519efd3be9fbd96" }, "downloads": -1, "filename": "plone.directives.form-1.0b2.tar.gz", "has_sig": false, "md5_digest": "754a59c10966941ab2dfab19eda08bf9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21926, "upload_time": "2009-06-15T17:30:31", "url": "https://files.pythonhosted.org/packages/fc/f0/193c87f9c6a149d2f7bf29a479003bdd5e6585132423e5e27a137f2ffdc2/plone.directives.form-1.0b2.tar.gz" } ], "1.0b3": [ { "comment_text": "", "digests": { "md5": "fcb38e732d54d1a96477fdb96136773b", "sha256": "aff3ac690d5090d043614d49e9da696de75c46a03c72d543c2be8ac3f4c95779" }, "downloads": -1, "filename": "plone.directives.form-1.0b3.tar.gz", "has_sig": false, "md5_digest": "fcb38e732d54d1a96477fdb96136773b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22012, "upload_time": "2009-07-12T10:23:27", "url": "https://files.pythonhosted.org/packages/d3/b3/18005970fc51478763c3be90c282cd24ac20334d21dc9242b80976e0608d/plone.directives.form-1.0b3.tar.gz" } ], "1.0b4": [ { "comment_text": "", "digests": { "md5": "19e5bc5a41ef05d8d1dfaf0eaf14574b", "sha256": "5a2473b564be7985b5fff63a1200b44285f20595649e9e6e37ed07702f7f9c20" }, "downloads": -1, "filename": "plone.directives.form-1.0b4.tar.gz", "has_sig": false, "md5_digest": "19e5bc5a41ef05d8d1dfaf0eaf14574b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23187, "upload_time": "2009-07-12T16:43:06", "url": "https://files.pythonhosted.org/packages/db/89/de43cab98124455cbb2d4374b5dcbce73ec669f17d6a92d874e47c4e6781/plone.directives.form-1.0b4.tar.gz" } ], "1.0b5": [ { "comment_text": "", "digests": { "md5": "92ac1160873067fc1662524f5bce6fd3", "sha256": "5cdefed7b8ea7cc0d58632024d46300bb34b842bb4fdedfa95b0a9ae61296f0b" }, "downloads": -1, "filename": "plone.directives.form-1.0b5.tar.gz", "has_sig": false, "md5_digest": "92ac1160873067fc1662524f5bce6fd3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23246, "upload_time": "2009-07-21T17:21:19", "url": "https://files.pythonhosted.org/packages/ac/1b/48db93a4465ce0fe2de9d09de3cb42decfc1149a1c1a986acd8b83cc7b6f/plone.directives.form-1.0b5.tar.gz" } ], "1.0b6": [ { "comment_text": "", "digests": { "md5": "1978be2438263a1c8d167b3126d3a130", "sha256": "edc7da83e59e78b1048a8ac43591e445c2ba7922bd3bbdb9cfbfc280ef3fd556" }, "downloads": -1, "filename": "plone.directives.form-1.0b6.tar.gz", "has_sig": false, "md5_digest": "1978be2438263a1c8d167b3126d3a130", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21419, "upload_time": "2009-10-09T17:36:55", "url": "https://files.pythonhosted.org/packages/fb/4f/c4bc9dd1d64c504b1efd2e1dd47d26eae960d268ca6fed081cedb9a89ce1/plone.directives.form-1.0b6.tar.gz" } ], "1.0b7": [ { "comment_text": "", "digests": { "md5": "b46f70489c33fbb8454bcd7b70410c25", "sha256": "364e6b36e4b7d1b874a4112a9dc8f25c86a5c6f6d5147b91688f110a451c53c1" }, "downloads": -1, "filename": "plone.directives.form-1.0b7.zip", "has_sig": true, "md5_digest": "b46f70489c33fbb8454bcd7b70410c25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54841, "upload_time": "2010-04-20T09:39:54", "url": "https://files.pythonhosted.org/packages/fc/a1/22c0cb51a78e0e767256ee462422b7950109164d6275240654dd7e4d929f/plone.directives.form-1.0b7.zip" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "83b04b7f68563260baeede77bbf18027", "sha256": "6fa9bf067fe9cfb6e0e2bbc2d41e505d58ba8578dc80cdd5bf9b413becab3c6a" }, "downloads": -1, "filename": "plone.directives.form-1.1.zip", "has_sig": false, "md5_digest": "83b04b7f68563260baeede77bbf18027", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52385, "upload_time": "2013-08-14T15:58:20", "url": "https://files.pythonhosted.org/packages/69/35/0e02d4cc86654a61ca6a2b02d6d53a813d8d2f65dd2e3b271b8e7182eaa9/plone.directives.form-1.1.zip" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "b1a1d7c3399deecce914a5694f5281e8", "sha256": "2135e196b1a03c6709fdd4ffe9758b2854f33c7a06eb65c5b286bd733671f20f" }, "downloads": -1, "filename": "plone.directives.form-2.0.zip", "has_sig": false, "md5_digest": "b1a1d7c3399deecce914a5694f5281e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52419, "upload_time": "2012-08-30T19:52:36", "url": "https://files.pythonhosted.org/packages/80/25/83448bfa49edfd4eabdfa3de0bce7fde00215e12038ff63119cb537544f8/plone.directives.form-2.0.zip" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "c04c80c710b270156dcb0d58a8dbc339", "sha256": "1a23bdab5011430993ffa713a74be31ec5833f0156bc2111ceaba971e9f5e02f" }, "downloads": -1, "filename": "plone.directives.form-2.0.1.tar.gz", "has_sig": false, "md5_digest": "c04c80c710b270156dcb0d58a8dbc339", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36141, "upload_time": "2015-05-04T14:37:04", "url": "https://files.pythonhosted.org/packages/5e/c8/06a72d95e3405b4cc0bca4298bdfee447fddb6ed9ca262c01d749c80c13f/plone.directives.form-2.0.1.tar.gz" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "992987f80d522aea29492d35dcf8a2b2", "sha256": "04303c12fe0ae87d1e2a9304dceaf08e2257055abdac80f5aa5d912a61ac7e07" }, "downloads": -1, "filename": "plone.directives.form-2.0.2.tar.gz", "has_sig": false, "md5_digest": "992987f80d522aea29492d35dcf8a2b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36456, "upload_time": "2015-11-28T00:29:26", "url": "https://files.pythonhosted.org/packages/42/f5/42ba334b71e3510895e4c67de76c7e7be225f59f9619e6e71fe85a613936/plone.directives.form-2.0.2.tar.gz" } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "ced9a2ab2a46fc0c679345109ef723aa", "sha256": "c94f1dd061cb3eab3f3186e65803abd638029be4680e6dd456af92e995c67c64" }, "downloads": -1, "filename": "plone.directives.form-2.0.3.tar.gz", "has_sig": false, "md5_digest": "ced9a2ab2a46fc0c679345109ef723aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36728, "upload_time": "2017-05-09T15:21:03", "url": "https://files.pythonhosted.org/packages/06/05/787c8bb8db3047c2f75ef702b16fcf2505921714f00784d0558490cac872/plone.directives.form-2.0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ced9a2ab2a46fc0c679345109ef723aa", "sha256": "c94f1dd061cb3eab3f3186e65803abd638029be4680e6dd456af92e995c67c64" }, "downloads": -1, "filename": "plone.directives.form-2.0.3.tar.gz", "has_sig": false, "md5_digest": "ced9a2ab2a46fc0c679345109ef723aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36728, "upload_time": "2017-05-09T15:21:03", "url": "https://files.pythonhosted.org/packages/06/05/787c8bb8db3047c2f75ef702b16fcf2505921714f00784d0558490cac872/plone.directives.form-2.0.3.tar.gz" } ] }