{ "info": { "author": "Martin Aspeli", "author_email": "optilude@gmail.com", "bugtrack_url": null, "classifiers": [ "Framework :: Plone", "Framework :: Plone :: 5.1", "Framework :: Plone :: 5.2", "License :: OSI Approved :: GNU General Public License (GPL)", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Introduction\n============\n\n``plone.app.registry`` provides Plone UI and GenericSetup integration for\n`plone.registry`_, which in turn implements a configuration registry for\nZope applications. For details about how the registry works, please see the\n`plone.registry`_ documentation. What follows is a brief overview of common\nusage patterns in Plone.\n\n.. contents:: Table of contents\n\nOverview\n========\n\nThe registry provided by `plone.registry`_ is intended to store settings in\na safe, easily accessible manner. This makes it well-suited for applications\nand add-on products that need to manage some configurable, user-editable\nvalues. It is intended to replace the use of (less powerful and user friendly)\nZope 2 property sheets, as well as (less safe and more difficult to access)\npersistent local utilities for managing such configuration.\n\nThe registry is *not* an arbitrary data store. For the most part, you can\nstore any Python primitive there, but not more complex data structures or\nobjects. This means that the registry cannot be broken by packages being\nuninstalled, and that it can provide a simple, generic user interface for\nediting values.\n\nThe registry is made up of *records*. A record consists of a *field*,\ndescribing the record, and a *value*. Fields are based on the venerable\n``zope.schema``, although the standard allowable field types are defined in\nthe module ``plone.registry.field``. (This is partly because the field\ndefinitions are actually persisted with the record, and partly because\n``plone.registry`` performs some additional validation to ensure the integrity\nof the registry).\n\nA record can be created programmatically, though in a Plone context it is more\ncommon to install records using the ``records.xml`` GenericSetup syntax. Once\nthe record has been created, its value can be read and set using standard\nPython dictionary syntax. Accessing the record and field is just as easy.\n\nEach record has a unique name, which must be a *dotted name* prefixed by the\npackage owning the record. For example, a record owned by the package\n``my.package`` could have a name like ``my.package.myrecord``.\n\nAs of version 1.6, it is possible to split ``registry.xml`` into\nmultiple files; to import and export registry entries via the control\npanel; and to add and delete records via the control panel.\n\nNotes about versions\n====================\n\n- versions 1.3 and later are for Plone 5.\n\n- versions 1.2.x are for Plone 4.\n\nUsage\n=====\n\nThis section describes how the registry is most commonly used in a Plone\ncontext. For more details, please see the `plone.registry`_ documentation.\n\nUsing GenericSetup to manipulate the registry\n---------------------------------------------\n\nThe best way to create, modify and delete registry records when writing Plone\nadd-on products is normally to use GenericSetup.\n\nCreating records\n~~~~~~~~~~~~~~~~\n\nOnce you have decided that you need a particular record, you need to answer\ntwo questions:\n\n1. What should the record be called?\n2. What type of data should it hold?\n\nLet's say you wanted to create a record call ``my.package.timeout``, holding\nan integer. Integers are described by the field type\n``plone.registry.field.Int``. Almost all the standard fields you would find\nin ``zope.schema`` have an equivalent field in ``plone.registry.field``. The\nmain exception is ``Object``, which is unsupported. Also, ``Choice`` fields\nonly support vocabularies given by string name, or as a list of string values.\nFinally, you cannot use the ``constraint`` property to set a validator\nfunction, although other validation (such as min/max values) will work.\n\nTo install such a record, you could add a ``registry.xml`` step to the\nGenericSetup profile of your product like this::\n\n \n\n \n \n Timeout\n 0\n \n 100\n \n\n \n\nLet's look at this in more detail:\n\n* There is one record declared. The name is given in the ``name`` attribute.\n* In the record, we first define the field type, by giving the full dotted\n name to the field class. Unless you have installed a third party package\n providing additional persistent fields, this will be a class in\n ``plone.registry.field`` mirroring a corresponding class in ``zope.schema``.\n* Inside the ```` element, we list any required or optional\n attributes of the field. This uses `plone.supermodel`_ syntax. In essence,\n each allowed field attribute is represented by a tag (so the ``title``\n attribute can be set with the ```` tag), with the attribute value\n given as the tag body. If an attribute is required for a field, the\n corresponding tag is required here.\n* We then set the value. This must obviously be a valid value for the field\n type.\n\nNote that the ``<value />`` is optional. If not given, the field will default\nto its ``missing_value`` until it is set. The ``<field />`` is optional if\nthe record has already been initialised elsewhere.\n\nMost field attributes are simple tags like the ones shown above, with the\nfield name used as the tag name, and a string representation of the value\nused as the contents of the tag. Collection fields are a little more involved,\nhowever. A collection field (like a ``List`` or ``Tuple``) has a\n``value_type`` property containing another field. Also, their values and\ndefaults are sequences. Let's look at an example::\n\n <record name=\"my.package.animals\">\n <field type=\"plone.registry.field.Tuple\">\n <title>Animals\n A list of cool animals\n \n \n \n Dog\n Cat\n Elephant\n \n \n\nNotice how the ```` tag takes a ``type`` attribute just like\nthe outer ```` tag. Here we have shown a value type with no options,\nbut if you need, you can put tags for additional field attributes inside the\n```` tag.\n\nAlso notice how the value is represented. Each element in the sequence (a\ntuple in this case) is given by an ```` tag, with the element\nvalue given as the body of that tag.\n\n``Dict`` fields also have a ```` and elements that are key/value\npairs. They can be configured like so::\n\n \n \n Food eaten by animals\n \n \n \n \n Dog food\n Cat food\n Squirrels\n \n \n\nUsing multiple registry XML files\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nInstead of storing registry entries in a single, large\n``registry.xml`` file, you can have Generic Setup load and process\nregistry entries from multiple files. This makes it easier to manage\nand organize the registry entries provided by your applications and\nadd-ons.\n\nYour add-on should include a folder named ``registry`` in its\nprofile(s) folders, e.g. ``profiles/default/registry``. Any XML files\nin that folder will be read and processed by the registry the same way\nit would have read and processed a single ``registry.xml`` file in\nthe ``profiles/default`` folder.\n\nAs an example, see how `Castle CMS\n`_ uses multiple XML files in\nits `profiles/default/registry\n`_\nfolder.\n\nThe registry will process both the ``registry.xml`` file and the\ncontents of a ``registry`` folder, if both exist.\n\n\nConditional records\n~~~~~~~~~~~~~~~~~~~\n\nImportable records in ``registry.xml`` can be marked conditional with\n``condition`` attribute, which supports the following condition values:\n\n* ``installed my.package``, which causes record to be imported only when\n python module ``my.package`` is available to be imported.\n\n* ``not-installed my.package``, which causes record to be imported only when\n python module ``my.package`` is *not* available to be imported:\n\n* ``have my-feature``, which causes record to be imported only when\n ZCML feature flag ``my-feature`` has been registered (Zope2 only)\n\n* ``not-have my-feature``, which causes record to be imported only when\n ZCML feature flag ``my-feature`` has *not* been registered (Zope2 only)\n\nFor example, the following ``registry.xml`` step at the GenericSetup profile of\nyour policy product, would only import records when module ``my.package`` is\navailable::\n\n \n \n 40\n We've got lions and tigers!\n \n \n\n\nField references\n~~~~~~~~~~~~~~~~\n\nIt is possible to define record to use another record's field. This is often\nuseful if you want one record to act as an optional override for another.\nFor example::\n\n \n\n \n \n Timeout\n 0\n \n 100\n \n\n \n \n 300\n \n\n \n\nIn this example, we have defined the ``my.package.timeout`` record with an\ninteger field. We then have a separate record, with a separate value,\ncalled ``my.package.timeout.slowconnection``, which uses the same field\n(with the same type, validation, title, description, etc). This avoids having\nto explicitly re-define a complete field.\n\nNote: The field in this case is actually a ``FieldRef`` object. See the\n`plone.registry`_ documentation for details.\n\nSetting values\n~~~~~~~~~~~~~~\n\nOnce a record has been defined, its value can be set or updated using\nGenericSetup like so::\n\n \n \n Nuts\n Other piranha\n \n \n\nThis is often useful if you have a record defined in one package that is\nappended to or customised in another package.\n\nIn the example above, we used the ``purge`` attribute. When setting the value\nof a multi-valued field such as a tuple, list, set or dictionary, setting this\nattribute to ``false`` will cause the values listed to be added to the\nexisting collection, rather than overriding the collection entirely, as would\nhappen if the ``purge`` attribute was set to ``true`` or omitted.\n\nDeleting records\n~~~~~~~~~~~~~~~~\n\nTo delete a record, use the ``remove`` attribute::\n\n \n\nIf the record does not exist, a warning will be logged, but processing will\ncontinue.\n\nCreating records based on an interface\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn the examples above, we created individual records directly in the registry.\nSometimes, however, it is easier to work with traditional schema interfaces\nthat group together several related fields. As we will see below,\n``plone.registry`` and ``plone.app.registry`` provide certain additional\nfunctionality for groups of records created from an interface.\n\nFor example, we could have an interface like this::\n\n from zope.interface import Interface\n from zope import schema\n\n class IZooSettings(Interface):\n\n entryPrice = schema.Decimal(title=u\"Admission charge\")\n messageOfTheDay = schema.TextLine(title=u\"A banner message\", default=u\"Welcome!\")\n\nNotice how we are using standard ``zope.schema`` fields. These will be\nconverted to persistent fields (by adapting them to ``IPersistentField`` from\n``plone.registry``) when the registry is populated. If that is not possible,\nan error will occur on import.\n\nTo register these records, we simply add the following to ``registry.xml``::\n\n \n\n\nThis will create one record for each field. The record names are the full\ndotted names to the fields, so in this case they would be\n``my.package.interfaces.IZooSettings.entryPrice`` and\n``my.package.interfaces.IZooSettings.messageOfTheDay``.\n\nIf you just want to use the interface as a template you can supply a\n``prefix`` attribute::\n\n \n\nwhich will generate fields named ``my.zoo.entryPrice`` and\n``my.zoo.messageOfTheDay``.\n\nIn order to set the values of the fields created by a directive\nyou must provide ``value`` entries with keys corresponding to the fields on\nthe interface, as follows::\n\n \n 40\n We've got lions and tigers!\n \n\nValues can be set as above using the full record name. However, we can also\nexplicitly state that we are setting a record bound to an interface, like so::\n\n \n 10.0\n \n\nThis is equivalent to::\n\n \n 10.0\n \n\nYou can also use the ``interface``/``field`` syntax to register a new record\nfrom an individual field.\n\nFinally, if the interface contains fields that cannot or should be set, they\nmay be omitted::\n\n \n someField\n \n\nThe ```` tag can be repeated to exclude multiple fields.\n\nDeleting records based on an interface\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo delete a set of records, based on an interface use the ``remove``\nattribute::\n\n \n\nIf the record does not exist for any of the interface fields, a warning will\nbe logged, but processing will continue.\n\nIf you do not wish to delete, or wish to exclude certain fields, they may be\nomitted::\n\n \n someField\n \n\nThe ```` tag can be repeated to exclude multiple fields.\n\nUsing the registry in Python code\n---------------------------------\n\nNow that we have seen how to manage records through GenericSetup, we can start\nusing values from the registry in our code.\n\nAccessing the registry\n~~~~~~~~~~~~~~~~~~~~~~\n\nTo get or set the value of a record, we must first look up the registry\nitself. The registry is registered as a local utility, so we can look it up\nwith::\n\n from zope.component import getUtility\n from plone.registry.interfaces import IRegistry\n\n registry = getUtility(IRegistry)\n\nValues can now get read or set using simple dictionary syntax::\n\n timeout = registry['my.package.timeout']\n\nWe can also use ``get()`` to get the value conditionally, and an ``in`` check\nto test whether the registry contains a particular record.\n\nThe returned value will by of a type consistent with the field for the record\nwith the given name. It can be set in the same manner::\n\n registry['my.package.timeout'] = 120\n\nIf you need to access the underlying record, use the ``records`` attribute::\n\n timeoutRecord = registry.records['my.package.timeout']\n\nThe record returned conforms to ``plone.registry.interfaces.IRecord`` and has\ntwo main attributes: ``value`` is the current record value, and ``field`` is\nthe persistent field instance. If the record was created from an interface,\nit will also provide ``IInterfaceAwareRecord`` and have three additional\nattributes: ``interfaceName``, the string name of the interface;\n``interface``, the interface instance itself, and ``fieldName``, the name of\nthe field in the interface from which this record was created.\n\nYou can delete the whole record programmatically with the Python ``del``\nstatement::\n\n del registry.records['my.package.timeout']\n\nIn unit tests, it may be useful to create a new record programmatically.\nYou can do that like so::\n\n from plone.registry.record import Record\n from plone.registry import field\n\n registry.records['my.record'] = Record(field.TextLine(title=u\"A record\"), u\"Test\")\n\nThe constructor takes a persistent field and the initial value as parameters.\n\nTo register records for an interface programmatically, we can do::\n\n registry.registerInterface(IZooSettings)\n\nYou can omit fields by passing an ``omit`` parameter giving a sequence of\nomitted field names.\n\nSee ``plone.registry`` for more details about how to introspect and manipulate\nthe registry records programmatically.\n\nAccessing the registry in page templates\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can also access the registry from page templates. Example TALES expression::\n\n python:context.portal_registry['plone.app.theming.interfaces.IThemeSettings.enabled']\n\nUsing the records proxy\n~~~~~~~~~~~~~~~~~~~~~~~\n\nAbove, we used dictionary syntax to access individual records and values. This\nwill always work, but for so-called interface-aware records - those which were\ncreated from an interface e.g. using the ```` syntax - we have\nanother option: the records proxy. This allows us to look up all the records\nthat belong to a particular interface at the same time, returning an object\nthat provides the given interface and can be manipulated like an object, that\nis still connected to the underlying registry.\n\nTo look up a records proxy for our ``IZooSettings`` interface, we can do::\n\n zooSettings = registry.forInterface(IZooSettings)\n\nThe ``zooSettings`` object now provides ``IZooSettings``. Values may be\nread and set using attribute notation::\n\n zooSettings.messageOfTheDay = u\"New message\"\n currentEntryPrice = zooSettings.entryPrice\n\nWhen setting a value, it is immediately validated and written to the registry.\nA validation error exception may be raised if the value is not permitted by\nthe field for the corresponding record.\n\nWhen fetching the records proxy, ``plone.registry`` will by default verify\nthat records exists for each field in the interface, and will raise an error\nif this is not the case. To disable this check, you can do::\n\n zooSettings = registry.forInterface(IZooSettings, check=False)\n\nThis is sometimes useful in cases where it is not certain that the registry\nhas been initialised. You can also omit checking for individual fields, by\npassing an ``omit`` parameter giving a tuple of field names.\n\nDelete records\n~~~~~~~~~~~~~~\n\nTo delete a record is as simple as::\n\n del registry.records['plone.app.theming.interfaces.IThemeSettings.enabled']\n\nRegistry events\n~~~~~~~~~~~~~~~\n\nThe registry emits events when it is modified:\n\n* ``plone.registry.interfaces.IRecordAddedEvent`` is fired when a record has\n been added to the registry.\n* ``plone.registry.interfaces.IRecordRemovedEvent`` is fired when a record\n has been removed from the registry.\n* ``plone.registry.interfaces.IRecordModifiedEvent`` is fired when a record's\n value is modified.\n\nYou can register subscribers for these to catch any changes to the registry.\nIn addition, you can register an event handler that only listens to changes\npertaining to records associated with specific interfaces. For example::\n\n from zope.component import adapter\n from plone.registry.interfaces import IRecordModifiedEvent\n\n from logging import getLogger\n log = getLogger('my.package')\n\n @adapter(IZooSettings, IRecordModifiedEvent)\n def detectPriceChange(settings, event):\n if record.fieldName == 'entryPrice':\n log.warning(\"Someone change the price from %d to %d\" % (event.oldValue, event.newValue,))\n\nSee `plone.registry`_ for details about these event types.\n\nCreating a custom control panel\n-------------------------------\n\nThe generic control panel is useful as a system administrator's tool for low-\nlevel configuration. If you are writing a package aimed more at system\nintegrators and content managers, you may want to provide a more user-friendly\ncontrol panel to manage settings.\n\nIf you register your records from an interface as shown above, this package\nprovides a convenience framework based on `plone.autoform`_ and `z3c.form`_\nthat makes it easy to create your own control panel.\n\nTo use it, create a module like this::\n\n from plone.app.registry.browser.controlpanel import RegistryEditForm\n from plone.app.registry.browser.controlpanel import ControlPanelFormWrapper\n\n from my.package.interfaces import IZooSettings\n from plone.z3cform import layout\n from z3c.form import form\n\n class ZooControlPanelForm(RegistryEditForm):\n form.extends(RegistryEditForm)\n schema = IZooSettings\n\n ZooControlPanelView = layout.wrap_form(ZooControlPanelForm, ControlPanelFormWrapper)\n ZooControlPanelView.label = u\"Zoo settings\"\n\nRegister the ``ZooControlPanelView`` as a view::\n\n \n\nThen install this in the Plone control panel using the ``controlpanel.xml``\nimport step in your GenericSetup profile::\n\n \n \n\n \n Manage portal\n \n\n \n\nThe ``icon_expr`` attribute should give a URL for the icon. Here, we have\nassumed that a resource directory called ``my.package`` is registered and\ncontains the file ``icon.png``. You may omit the icon as well.\n\nUsing the Configuration Registry control panel\n----------------------------------------------\n\nViewing and editing records through the control panel\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis package provides the \"Configuration Registry\" control panel in\nPlone's Site Setup. Here, you can view all registry records, you can\nsearch for records using a case sensitive filter field, and you can\nselect sets of records according to their prefix\n(e.g. \"IDiscussionSettings\", \"plone.app.caching\").\n\nRegistry records' names, titles, descriptions, data types and current\nvalues are displayed.\n\n.. figure:: https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_screenshot.jpg\n\n\t The Configuration Registry control panel\n\nIf you click on a record, an edit form appears that allows you to\nchange its value.\n\n.. figure:: https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_edit_record_screenshot.jpg\n\n\t How to change the value of a registry record\n\n\nExporting and importing records through the control panel\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can use the Configuration Registry control panel's Export tab to\nexport the entire registry into a single XML file. When you click the\nExport Now button, a file named ``registry.xml`` will be downloaded to\nyour computer.\n\n.. figure:: https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_export_screenshot.jpg\n\n\t How to export the entire registry\n\nTo import registry entries, use the Configuration Registry control\npanel's Import tab, use the Choose File button to select an XML file\nfrom your computer containing the registry entries, then press the\nImport File button.\n\n.. figure:: https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_import_screenshot.jpg\n\n\t How to import a registry file\n\n\nAdding and deleting records through the control panel\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can add individual registry records using the Configuration\nRegistry control panel's \"Add new record\" tab.\n\nEnter the registry record's name, (human readable) title, select a\ndata type, and optionally check the Required box if the record must\nhave a value. Then press the \"Add field\" button.\n\n.. figure:: https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_add_record_screenshot.jpg\n\n\nControl panel widget settings\n=============================\n\nplone.app.registry provides ``RegistryEditForm`` class which is a subclass of\n``z3c.form.form.Form``.\n\n``RegistryEditForm`` has two methods to override which and how widgets are going\nto be used in the control panel form.\n\n* ``updateFields()`` may set widget factories i.e. widget type to be used\n\n* ``updateWidgets()`` may play with widget properties and widget value\n shown to the user\n\nExample (*collective.gtags* project controlpanel.py)::\n\n class TagSettingsEditForm(controlpanel.RegistryEditForm):\n\n schema = ITagSettings\n label = _(u\"Tagging settings\")\n description = _(u\"Please enter details of available tags\")\n\n def updateFields(self):\n super(TagSettingsEditForm, self).updateFields()\n self.fields['tags'].widgetFactory = TextLinesFieldWidget\n self.fields['unique_categories'].widgetFactory = TextLinesFieldWidget\n self.fields['required_categories'].widgetFactory = TextLinesFieldWidget\n\n def updateWidgets(self):\n super(TagSettingsEditForm, self).updateWidgets()\n self.widgets['tags'].rows = 8\n self.widgets['tags'].style = u'width: 30%;'\n\nTroubleshooting\n===============\n\nThe following sections describe some commonly encountered problems, with\nsuggestions for how to resolve them.\n\nRequired dependency add-ons installed\n-------------------------------------\n\nBoth ``plone.app.z3cform`` (Plone z3c.form support) and ``plone.app.registry``\n(Configuration registry) add-ons must be installed at Plone site before you\ncan use any control panel configlets using plone.app.registry framework.\n\nKeyError: a field for which there is no record\n----------------------------------------------\n\nExample traceback::\n\n Module plone.app.registry.browser.controlpanel, line 44, in getContent\n Module plone.registry.registry, line 56, in forInterface\n KeyError: 'Interface `mfabrik.plonezohointegration.interfaces.ISettings` defines a field `username`, for which there is no record.'\n\nThis means that\n\n* Your registry.xml does not define default values for your configuration keys\n* You have changed your configuration schema, but haven't rerun add-on\n installer to initialize default values\n* You might need to use the same prefix as you use for the interface name in\n your settings::\n\n \n\n.. _plone.registry: http://pypi.python.org/pypi/plone.registry\n.. _plone.supermodel: http://pypi.python.org/pypi/plone.supermodel\n.. _plone.autoform: http://pypi.python.org/pypi/plone.autoform\n.. _z3c.form: http://pypi.python.org/pypi/z3c.form\n\nChangelog\n=========\n\n.. You should *NOT* be adding new change log entries to this file.\n You should create a file in the news directory instead.\n For helpful instructions, please see:\n https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst\n\n.. towncrier release notes start\n\n1.7.5 (2019-05-01)\n------------------\n\nBug fixes:\n\n\n- broken value in records table in Python 3\n [petschki] (#36)\n\n\n1.7.4 (2019-03-03)\n------------------\n\nBug fixes:\n\n\n- Fix export of registry with Generic Setup. [pbauer] (#34)\n\n\n1.7.3 (2019-02-13)\n------------------\n\nBug fixes:\n\n\n- Fix some deprecation warnings. [gforcada] (#32)\n\n\n1.7.2 (2018-06-19)\n------------------\n\nNew features:\n\n- Added a pragmatic XML exporter for registry records in a format meant to be used in add-ons or policy profiles.\n [jensens]\n\n\n1.7.1 (2018-04-08)\n------------------\n\nBug fixes:\n\n- Python 2 / 3 compatible imports.\n [pbauer]\n\n\n1.7 (2018-02-04)\n----------------\n\nNew features:\n\n- Added traceback info of filename to importer in order to ease debugging.\n [jensens]\n\nBug fixes:\n\n- Python 2 / 3 compatible imports.\n [pbauer]\n\n- Minor refactoring of registry import (DRY).\n [jensens]\n\n\n1.6.1 (2017-06-04)\n------------------\n\nBug fixes:\n\n- remove unittest2 dependency\n [kakshay21]\n\n\n1.6 (2017-05-23)\n----------------\n\nNew features:\n\n- be able to split your registry.xml file into multiple files in a sub-directory `registry`\n [vangheem]\n\n- Add ability to import/export records through control panel\n [vangheem]\n\n- Add ability to add new record through control panel\n [vangheem]\n\n- Add ability to delete record through control panel\n [vangheem]\n\n- Document new features\n [tkimnguyen]\n\n\n1.5 (2016-10-23)\n----------------\n\nNew features:\n\n- Add support for *have* and *have-not* import conditions in\n registry.xml\n [datakurre]\n\n\n1.4 (2016-09-14)\n----------------\n\nNew features:\n\n- Add support for optional condition attribute in registry.xml entries\n to allow conditional importing of records. Conditions themselves are\n not import (nor exported).\n [datakurre]\n\n\n1.3.12 (2016-06-27)\n-------------------\n\nNew:\n\n- Add traceback info with record name to importer in order to ease debugging.\n [jensens]\n\n\n1.3.11 (2016-03-31)\n-------------------\n\nNew:\n\n- For ``ControlPanelFormWrapper`` and ``@@configuration_registry``, construct the base url to the ``@@overview-controlpanel`` from the nearest site.\n This gives more flexibility when calling controlpanels on sub sites with local registries while in standard Plone installations the controlpanel is still bound to the portal url.\n [thet]\n\n\n1.3.10 (2016-02-27)\n-------------------\n\nFixes:\n\n- Saving registry value in modal no longer reloads whole page\n [vangheem]\n\n\n1.3.9 (2016-02-20)\n------------------\n\nFixes:\n\n- Document how to remove a registry record with Python.\n [gforcada]\n\n\n1.3.8 (2016-02-08)\n------------------\n\nNew:\n\n- Updated to work with new plone.batching ``pagination`` selector as\n well as with old one. [davilima6]\n\n\n1.3.7 (2015-11-28)\n------------------\n\nFixes:\n\n- Updated Site Setup link in all control panels.\n Fixes https://github.com/plone/Products.CMFPlone/issues/1255\n [davilima6]\n\n\n1.3.6 (2015-10-27)\n------------------\n\nNew:\n\n- Show loading icon in control panel when searching.\n [vangheem]\n\nFixes:\n\n- Cleanup: pep8, utf8 headers, readability, etc.\n [jensens]\n\n- Let our ``plone.app.registry`` import step depend on ``typeinfo``.\n The portal types may be needed for vocabularies. For example, you\n could get an error when adding a not yet installed type to\n ``types_not_searched``.\n Fixes https://github.com/plone/Products.CMFPlone/issues/1118\n [maurits]\n\n\n1.3.5 (2015-09-20)\n------------------\n\n- Fix styling alignment issues with the buttons.\n [sneridagh]\n\n\n1.3.4 (2015-09-14)\n------------------\n\n- registry javascript fix to not auto-expand search field as it was\n not working well\n [vangheem]\n\n\n1.3.3 (2015-09-08)\n------------------\n\n- Fix modal in control panel\n [vangheem]\n\n\n1.3.2 (2015-08-20)\n------------------\n\n- Added the `structure` keyword to the TALES expression that returns the description for registry entries.\n This ensures that descriptions are properly escaped and HTML entities don't show up in descriptions.\n [pigeonflight]\n\n\n1.3.1 (2015-07-18)\n------------------\n\n- Change the category of the configlet to 'plone-advanced'.\n [sneridagh]\n\n- Make configlets titles consistent across the site, first letter capitalized.\n [sneridagh]\n\n\n1.3.0 (2015-03-13)\n------------------\n\n- fix control panel filtering to work with plone 5 and patterns\n [vangheem]\n\n\n1.2.3 (2013-05-23)\n------------------\n\n- Fix control panel filtering (https://dev.plone.org/ticket/13557)\n [vangheem, danjacka]\n\n\n1.2.2 (2013-01-13)\n------------------\n\n- Acquisition-wrap value dictionary such that widgets get a useful\n context.\n [malthe]\n\n- Allow XML comments in registry.xml\n [gweis]\n\n- allow using purge=false in dict.value_type == list registry\n imports.\n [vangheem]\n\n\n1.2.1 (2012-10-16)\n------------------\n\n- Unified the control panel html structure.\n [TH-code]\n\n- Fix jquery selectors\n [vangheem]\n\n- handle control panel prefixes for fields that do not\n have interfaces better.\n [vangheem]\n\n\n1.2 (2012-08-29)\n----------------\n\n- Control panel: Records without interface no longer cause\n \"AttributeError: 'NoneType' object has no attribute 'split'\".\n [kleist]\n\n- Allow deletion of records by interface in GenericSetup.\n [mitchellrj]\n\n- Deprecated the 'delete' attribute of and nodes\n in GenericSetup, in favor of 'remove'.\n [mitchellrj]\n\n- Show 'Changes canceled.' message after control panel edit form is canceled\n to comply with plone.app.controlpanel behavior.\n [timo]\n\n- Redirect to the form itself on control panel edit form submit to comply with\n plone.app.controlpanel behavior.\n [timo]\n\n\n1.2a1 (2012-06-29)\n------------------\n\n- Use lxml instead of elementtree.\n [davisagli]\n\n- Remove unused zope.app.component import.\n [hannosch]\n\n- Better control panel view.\n [vangheem]\n\n\n1.1 (2012-04-15)\n----------------\n\n- Add support for internationalization of strings imported into the\n registry.\n [davisagli]\n\n\n1.0.1 (2011-09-19)\n------------------\n\n- On the portal_registry configlet, enable the left-menu, to be more consistent\n with all other configlets.\n Fixes http://dev.plone.org/plone/ticket/11737\n [WouterVH]\n\n- On the portal_registry configlet, add link to \"Site Setup\".\n Fixes http://dev.plone.org/plone/ticket/11855\n [WouterVH]\n\n\n1.0 - 2011-05-13\n----------------\n\n- 1.0 Final release.\n [esteele]\n\n- Add MANIFEST.in.\n [WouterVH]\n\n\n1.0b6 - 2011-04-06\n------------------\n\n- Add ``collectionOfInterface`` export/import support.\n [elro]\n\n\n1.0b5 - 2011-02-04\n------------------\n\n- Declare Products.CMFCore zcml dependency to fix zcml loading under Zope\n 2.13.\n [elro]\n\n- Add support for the syntax to import FieldRefs.\n Requires plone.registry >= 1.0b4.\n [optilude]\n\n\n1.0b4 - 2011-01-18\n------------------\n\n- Switch controlpanel slot to prefs_configlet_main.\n [toutpt]\n\n\n1.0b3 - 2011-01-04\n------------------\n\n- Depend on ``Products.CMFPlone`` instead of ``Plone``.\n [elro]\n\n- Show status messages and a back link in the control panel view.\n [timo]\n\n- Use plone domain to translate messages of this package.\n [vincentfretin]\n\n- Add a prefix support to controlpanel.RegistryEditForm\n [garbas]\n\n\n1.0b2 - 2010-04-21\n------------------\n\n- Ensure fields that are imported from XML only (no interface) have a name.\n This fixes a problem with edit forms breaking.\n [optilude]\n\n- Capitalize the control panel link to match the Plone standard.\n [esteele]\n\n- Overlay now reloads the registry listing on successful submit.\n [esteele]\n\n- Pass the name of the interface, not the interface itself to the \n importer.\n [esteele]\n\n- Modify JS overlay call to pull in the #content div.\n [esteele]\n\n- Allow elements inside if they contain a key attribute.\n This uses the record importer to set the values after creation.\n [MatthewWilkes]\n\n- Add a prefix attribute to the importer to take advantage of the\n interfaces-as-templates pattern from plone.registry\n [MatthewWilkes]\n\n- Improved the look and feel of the registry records control panel.\n [optilude]\n\n- Added explanation how to plug-in custom widgets for the registry [miohtama]\n\n\n1.0b1 - 2009-08-02\n------------------\n\n- Test with plone.registry 1.0b1\n [optilude]\n\n\n1.0a3 - 2009-07-12\n------------------\n\n- Catch up with changes in plone.supermodel's API.\n [optilude]\n\n\n1.0a2 - 2009-04-17\n------------------\n\n- Fixed typo in ZCML registration; tuple has a 'p' in it. This fixes exportimport of tuple fields.\n [MatthewWilkes]\n\n- Add missing handlers.zcml include\n [MatthewWilkes]\n\n\n1.0a1 - 2009-04-17\n------------------\n\n- Initial release\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://pypi.org/project/plone.app.registry", "keywords": "plone registry settings configuration", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "plone.app.registry", "package_url": "https://pypi.org/project/plone.app.registry/", "platform": "", "project_url": "https://pypi.org/project/plone.app.registry/", "project_urls": { "Homepage": "https://pypi.org/project/plone.app.registry" }, "release_url": "https://pypi.org/project/plone.app.registry/1.7.5/", "requires_dist": [ "lxml", "plone.app.z3cform", "plone.autoform (>=1.0b2)", "plone.registry (>=1.0b1)", "plone.supermodel (>=1.1dev)", "Products.CMFCore", "Products.CMFPlone", "Products.GenericSetup", "Products.statusmessages", "setuptools", "zope.component", "zope.dottedname", "zope.i18nmessageid", "zope.interface", "Zope2", "plone.app.testing ; extra == 'test'" ], "requires_python": "", "summary": "Zope 2 and Plone integration for plone.registry", "version": "1.7.5" }, "last_serial": 5214812, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "958ad78d5b58c2cb3f4067965f4dc130", "sha256": "f87e5e12ccd68dd2f53da3e985d7da4bfd2f476d58897b3f68e2f242d7cef0bc" }, "downloads": -1, "filename": "plone.app.registry-1.0.zip", "has_sig": false, "md5_digest": "958ad78d5b58c2cb3f4067965f4dc130", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 75116, "upload_time": "2011-05-13T17:27:07", "url": "https://files.pythonhosted.org/packages/e0/88/171b3abf146cd9ee65b0332ed6e3aa2dae1183b30328296964c256e635c0/plone.app.registry-1.0.zip" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "e2bef48f39750a4c2b2afcc883b8badf", "sha256": "9ef72ac9270b52e5d3b29900f30c48bfac82bf426bf801db74ea9bc7dc41dcbb" }, "downloads": -1, "filename": "plone.app.registry-1.0.1.tar.gz", "has_sig": false, "md5_digest": "e2bef48f39750a4c2b2afcc883b8badf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35712, "upload_time": "2011-09-19T15:44:55", "url": "https://files.pythonhosted.org/packages/45/ba/2100febe9293b314b8f3ac744265d29562548b4f8173c81950a8f3c9e6eb/plone.app.registry-1.0.1.tar.gz" } ], "1.0a1": [ { "comment_text": "", "digests": { "md5": "2b6329f096b56781c06bc717d4048329", "sha256": "0c62752e28dd823096ddfc50a8ef69cd2275c53a9cc62c5e3e8511e04d269b0e" }, "downloads": -1, "filename": "plone.app.registry-1.0a1.tar.gz", "has_sig": false, "md5_digest": "2b6329f096b56781c06bc717d4048329", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18784, "upload_time": "2009-04-17T06:37:43", "url": "https://files.pythonhosted.org/packages/ff/eb/d183292bd7930925c70af3e64c077eb35e433c7a4f6bb64658338867dc93/plone.app.registry-1.0a1.tar.gz" } ], "1.0a2": [ { "comment_text": "", "digests": { "md5": "a128b301579db2651eb6b58519c1339d", "sha256": "a34cb48cfce518f462626c232d610ebacdaafa8f494a868a071868b2143d0dc5" }, "downloads": -1, "filename": "plone.app.registry-1.0a2.tar.gz", "has_sig": false, "md5_digest": "a128b301579db2651eb6b58519c1339d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18988, "upload_time": "2009-07-12T10:30:06", "url": "https://files.pythonhosted.org/packages/b0/b8/c0177f770d6a8efb86f462e2e27e5ad00e632b9973bf857efddb6b0f6d78/plone.app.registry-1.0a2.tar.gz" } ], "1.0b1": [ { "comment_text": "", "digests": { "md5": "aeb497bbaa4ad68f5e3f9a2027acb943", "sha256": "62e40e1780103836a71e14cdf1960d829273478f6244a261f8f4a124a5b3467c" }, "downloads": -1, "filename": "plone.app.registry-1.0b1.tar.gz", "has_sig": false, "md5_digest": "aeb497bbaa4ad68f5e3f9a2027acb943", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19014, "upload_time": "2009-08-02T07:50:59", "url": "https://files.pythonhosted.org/packages/6e/33/324eaab546b9fe6b3c83a5afb3240ddb3be64914a958ec6df3fb765812d8/plone.app.registry-1.0b1.tar.gz" } ], "1.0b2": [ { "comment_text": "", "digests": { "md5": "d0cb5fc4642b47270530fbd3158d3135", "sha256": "cb18a8197c168cc053b2606118fefb0e90ab776767e4de9293f055276f6d35ed" }, "downloads": -1, "filename": "plone.app.registry-1.0b2.zip", "has_sig": false, "md5_digest": "d0cb5fc4642b47270530fbd3158d3135", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50656, "upload_time": "2010-04-21T19:04:16", "url": "https://files.pythonhosted.org/packages/e5/6f/feee1f6b06f535621e7bef325d2c36d51b5771f3e6420ee7f908e11eb9b1/plone.app.registry-1.0b2.zip" } ], "1.0b3": [ { "comment_text": "", "digests": { "md5": "90e6ba7f26e950cc6798818e8aade422", "sha256": "de2d161de8808ec94de121d3875bf7c40eac10e6bba1a2353e03de193417136e" }, "downloads": -1, "filename": "plone.app.registry-1.0b3.zip", "has_sig": false, "md5_digest": "90e6ba7f26e950cc6798818e8aade422", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53280, "upload_time": "2011-01-04T17:06:58", "url": "https://files.pythonhosted.org/packages/50/58/82dd3dd677c389b967b1d292af49e6f995780a243ad78034a7bf8f701762/plone.app.registry-1.0b3.zip" } ], "1.0b4": [ { "comment_text": "", "digests": { "md5": "6c7c306a883db691f50c93b89894d366", "sha256": "06ca47bcf17920161ab25b95d273e0e8ecc82b54e0105540cb600da628ba9239" }, "downloads": -1, "filename": "plone.app.registry-1.0b4.zip", "has_sig": false, "md5_digest": "6c7c306a883db691f50c93b89894d366", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53368, "upload_time": "2011-01-18T19:41:46", "url": "https://files.pythonhosted.org/packages/14/9a/6102eaad212b76458cc940e69c36403af6147c26f6bf4ef9b87a1330c687/plone.app.registry-1.0b4.zip" } ], "1.0b5": [ { "comment_text": "", "digests": { "md5": "d21339785f2a6a891a8f82dc31ecb545", "sha256": "9e9ee7d181117682ec15134da571e756fa03971e53aa23234c9270d02721e7cc" }, "downloads": -1, "filename": "plone.app.registry-1.0b5.zip", "has_sig": false, "md5_digest": "d21339785f2a6a891a8f82dc31ecb545", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55194, "upload_time": "2011-02-04T20:48:35", "url": "https://files.pythonhosted.org/packages/b4/32/92b8af2358a8a6a3217337c3d542d6c6bd4fff94e7045dba31129306e25a/plone.app.registry-1.0b5.zip" } ], "1.0b6": [ { "comment_text": "", "digests": { "md5": "7ee526d7df987b2b50bc262dfae2d0ed", "sha256": "518a60fbf404f7df3a9a369cd93a5eca9ecb90a4308d74d73796e7d644468613" }, "downloads": -1, "filename": "plone.app.registry-1.0b6.zip", "has_sig": false, "md5_digest": "7ee526d7df987b2b50bc262dfae2d0ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55340, "upload_time": "2011-04-07T01:13:59", "url": "https://files.pythonhosted.org/packages/07/4d/74a063621b8b07b17f69c90251b77715f2c80dd2a173c598eaa8f567b9c4/plone.app.registry-1.0b6.zip" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "0fdbb01e9ff71108f1be262c39b41b81", "sha256": "34f340d0d653fdf3455e354e0251d737c6504ffc2f1ad7bb6a0b4b19b4a366e4" }, "downloads": -1, "filename": "plone.app.registry-1.1.zip", "has_sig": false, "md5_digest": "0fdbb01e9ff71108f1be262c39b41b81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56080, "upload_time": "2012-04-15T21:31:41", "url": "https://files.pythonhosted.org/packages/e3/75/f2458f341daec40713ec6b6aae80ed79dd23506ec551adb04b58074dad57/plone.app.registry-1.1.zip" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "d22749d005ec4319400260131460db5c", "sha256": "355140c996c1858008dd411dda9e70339f5534d4015ccf8f4841cab6b5b7f05a" }, "downloads": -1, "filename": "plone.app.registry-1.2.zip", "has_sig": false, "md5_digest": "d22749d005ec4319400260131460db5c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59456, "upload_time": "2012-08-30T01:51:58", "url": "https://files.pythonhosted.org/packages/a5/a0/dbcc8c75e3ea01de8c5bab9afa56a66c5f34a3b4a9be501f787f4d5756ce/plone.app.registry-1.2.zip" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "9f9d82bb672e6662a4f182ddcf794f4f", "sha256": "fffcf675296e73fad481165602d71496789e2efa5741299b827bcf5e9dad84b4" }, "downloads": -1, "filename": "plone.app.registry-1.2.1.zip", "has_sig": false, "md5_digest": "9f9d82bb672e6662a4f182ddcf794f4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60298, "upload_time": "2012-10-16T16:09:00", "url": "https://files.pythonhosted.org/packages/c3/05/57a2ed285225a543afa02c7994778901eda6a39fd6577d0b1fb63a3acd55/plone.app.registry-1.2.1.zip" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "d4659a2c4cfb3a66cd6c7ff1ca17be7f", "sha256": "7a3f0f0e29141e39503f70f851fae5f3cff36e2cb766c3dc2b923bf9aa1c874f" }, "downloads": -1, "filename": "plone.app.registry-1.2.2.zip", "has_sig": false, "md5_digest": "d4659a2c4cfb3a66cd6c7ff1ca17be7f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61029, "upload_time": "2013-01-14T04:01:46", "url": "https://files.pythonhosted.org/packages/eb/a3/fc15a4849da45476dc590f3875fe166ddd962838380ea922f90f5f592ae3/plone.app.registry-1.2.2.zip" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "b2269e10516e8f2faf83545e3d0163d8", "sha256": "da6eaa0a102943aae12ec796de83f525b9a382bbb8be52fad2a315f388f8bcd0" }, "downloads": -1, "filename": "plone.app.registry-1.2.3.zip", "has_sig": false, "md5_digest": "b2269e10516e8f2faf83545e3d0163d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61453, "upload_time": "2013-05-24T01:42:14", "url": "https://files.pythonhosted.org/packages/29/6d/cef5c7c5f001049073f0317322965a469c43cd2bb2bf429c3f2e04841a5c/plone.app.registry-1.2.3.zip" } ], "1.2.4": [ { "comment_text": "", "digests": { "md5": "4820c33235196c7b445e3d9ab28eb05e", "sha256": "43d6b7a15e8a73d3dc3aa23e14d66e8555d0d3f8a02a0f70d2256d8f63490940" }, "downloads": -1, "filename": "plone.app.registry-1.2.4.tar.gz", "has_sig": false, "md5_digest": "4820c33235196c7b445e3d9ab28eb05e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48086, "upload_time": "2015-05-04T14:26:22", "url": "https://files.pythonhosted.org/packages/1a/52/7e59cb0e4cbfda2d161ad7c8d3e9e25e1ae94a1bacddd9d3221ccd754f15/plone.app.registry-1.2.4.tar.gz" } ], "1.2.5": [ { "comment_text": "", "digests": { "md5": "fcdfa9ec03967a855435f2c2145da461", "sha256": "0dfb8fd2dd69cbea61a128892aea41c0d23e2d086e8f95dce98f90f28f0e90da" }, "downloads": -1, "filename": "plone.app.registry-1.2.5.tar.gz", "has_sig": false, "md5_digest": "fcdfa9ec03967a855435f2c2145da461", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49677, "upload_time": "2017-03-09T21:02:15", "url": "https://files.pythonhosted.org/packages/97/b9/dee6fca6edb8b40c4bd173fd94d8de604d1ee1fb20d0e6980b50ad791001/plone.app.registry-1.2.5.tar.gz" } ], "1.2a1": [ { "comment_text": "", "digests": { "md5": "51a2a726073fcacadf14863cf20bfd99", "sha256": "1e43e926f9b8eead6ce934e465264c74c82087eadb6c5812df3bd5fc97d61a11" }, "downloads": -1, "filename": "plone.app.registry-1.2a1.zip", "has_sig": false, "md5_digest": "51a2a726073fcacadf14863cf20bfd99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58513, "upload_time": "2012-06-30T04:51:02", "url": "https://files.pythonhosted.org/packages/0e/b9/85b3dac70454b7e444257faa9cefbfb311aa8d5fbbcbf19c97a2756f6a62/plone.app.registry-1.2a1.zip" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "47fd6bf8da1869773502fac7a9a7d30b", "sha256": "4f5913d309d70fe678558e8b1b8400e2a0172434dac128bb27d531f877fe1e46" }, "downloads": -1, "filename": "plone.app.registry-1.3.0.zip", "has_sig": false, "md5_digest": "47fd6bf8da1869773502fac7a9a7d30b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61804, "upload_time": "2015-03-13T20:57:50", "url": "https://files.pythonhosted.org/packages/07/92/9ec43ed4e2569ec9ba44a12153cb31f6bc56691624941bb18a4f6a6d232d/plone.app.registry-1.3.0.zip" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "3cddba5d7d2c44cfcb61480f99df531a", "sha256": "23708231e9491b459e6eb5b3dc93970dd498f34752fbf9c585bc3ed197fec209" }, "downloads": -1, "filename": "plone.app.registry-1.3.1.tar.gz", "has_sig": false, "md5_digest": "3cddba5d7d2c44cfcb61480f99df531a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48523, "upload_time": "2015-07-18T06:37:40", "url": "https://files.pythonhosted.org/packages/15/79/b62c4ae628362d16750f03aa93eb8c425c1af934399b3b973f25c59a5a99/plone.app.registry-1.3.1.tar.gz" } ], "1.3.10": [ { "comment_text": "", "digests": { "md5": "db15dcafdb2fb83fff9f6f528fbfd5ce", "sha256": "d1aa242df28bfdbd21488d999eee236d097c7092c09d1b6fcceec4377e7494f6" }, "downloads": -1, "filename": "plone.app.registry-1.3.10.tar.gz", "has_sig": false, "md5_digest": "db15dcafdb2fb83fff9f6f528fbfd5ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51273, "upload_time": "2016-02-27T22:12:37", "url": "https://files.pythonhosted.org/packages/f0/bc/7e1a66afa2fe73e92e70eee37724979d1c46b5d472e9dce665347ec7c068/plone.app.registry-1.3.10.tar.gz" } ], "1.3.11": [ { "comment_text": "", "digests": { "md5": "a93ac557a0bcc290599e3584fb1b08dd", "sha256": "fcc5ebd96a4bc75d461621fcce4592ff67d88a2de5bdf254ca78edae5624ae2d" }, "downloads": -1, "filename": "plone.app.registry-1.3.11.tar.gz", "has_sig": false, "md5_digest": "a93ac557a0bcc290599e3584fb1b08dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52202, "upload_time": "2016-03-31T10:32:02", "url": "https://files.pythonhosted.org/packages/97/32/ec4a344fbaf8e2fe2b21c6fb027060759a90abf04abb1b2eac443fffd8b6/plone.app.registry-1.3.11.tar.gz" } ], "1.3.12": [ { "comment_text": "", "digests": { "md5": "e99c504aaf82c82163cea2ed17b446d8", "sha256": "aa0a481af772715fc37839edcb94ce56e1d41d40e0d56fd1db014b8e2eb9d0ed" }, "downloads": -1, "filename": "plone.app.registry-1.3.12.tar.gz", "has_sig": false, "md5_digest": "e99c504aaf82c82163cea2ed17b446d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52213, "upload_time": "2016-06-27T08:42:42", "url": "https://files.pythonhosted.org/packages/62/98/9e341bfa6bb6ef421071e2602b4a63e03e5ea060a51e479cfe00897398a8/plone.app.registry-1.3.12.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "11f0e29abbb7e861be83348d4d8fc236", "sha256": "62531c669c516057bff93c26764cff0b393742cfbad81acb6cc6c3dfc0c0f0c9" }, "downloads": -1, "filename": "plone.app.registry-1.3.2.tar.gz", "has_sig": false, "md5_digest": "11f0e29abbb7e861be83348d4d8fc236", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49004, "upload_time": "2015-08-20T11:49:08", "url": "https://files.pythonhosted.org/packages/e0/ee/7a4c0e8d44b64b7021ec54e43a30971b6513797901c1bbf9a06cbb096335/plone.app.registry-1.3.2.tar.gz" } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "e435a8c3d10a84d9e7966c8d3f447560", "sha256": "9bead77110530270e23c2819350318236483d996c2acccd042d5c6c8a6402839" }, "downloads": -1, "filename": "plone.app.registry-1.3.3.tar.gz", "has_sig": false, "md5_digest": "e435a8c3d10a84d9e7966c8d3f447560", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49295, "upload_time": "2015-09-08T16:22:53", "url": "https://files.pythonhosted.org/packages/cc/61/57127368ccfafb10c84ce64728a66cf087801f9bae93b3fcea052c26f564/plone.app.registry-1.3.3.tar.gz" } ], "1.3.4": [ { "comment_text": "", "digests": { "md5": "f447cfda77ab678a6d400f5287f076a2", "sha256": "9b70585bb614f84f449d4f3feeafd9aef012ea9347b63e475a7f648aaf4d0184" }, "downloads": -1, "filename": "plone.app.registry-1.3.4.tar.gz", "has_sig": false, "md5_digest": "f447cfda77ab678a6d400f5287f076a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49282, "upload_time": "2015-09-14T15:09:03", "url": "https://files.pythonhosted.org/packages/1e/59/55ba9818137ed1ba798f4bbf0c8ab7b765a4f9ff9b227727452147dc8b24/plone.app.registry-1.3.4.tar.gz" } ], "1.3.5": [ { "comment_text": "", "digests": { "md5": "647101ef5642cf9cc7ceea25cff3b72d", "sha256": "56e77b2e6eed8967197e2efd4e1f106d80ab1b4a2f66e671011a4800d0a0038e" }, "downloads": -1, "filename": "plone.app.registry-1.3.5.tar.gz", "has_sig": false, "md5_digest": "647101ef5642cf9cc7ceea25cff3b72d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49376, "upload_time": "2015-09-20T19:14:12", "url": "https://files.pythonhosted.org/packages/e1/66/b62bfad925467c7f9273e0b5b78dd7fc94e0c36f08ddb309d3bcebf2396a/plone.app.registry-1.3.5.tar.gz" } ], "1.3.6": [ { "comment_text": "", "digests": { "md5": "79214fa992f247b70fe728b0aeda7fc0", "sha256": "4881ed1010fa3899ad3d48efe8dd3620801cd0be56ce361d077d57542383d9cc" }, "downloads": -1, "filename": "plone.app.registry-1.3.6.tar.gz", "has_sig": false, "md5_digest": "79214fa992f247b70fe728b0aeda7fc0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50443, "upload_time": "2015-10-27T22:16:01", "url": "https://files.pythonhosted.org/packages/fd/3f/c5a944508fd38cfb4e7a81f0364439fe6659ff27f1a86faf0f4578ae39e8/plone.app.registry-1.3.6.tar.gz" } ], "1.3.7": [ { "comment_text": "", "digests": { "md5": "ab387cc6635ba36f705f75e7969c3623", "sha256": "92c17ad993cc26d8171d79459c2e85b9627d74ee1dcd6e4bc142948fd8100967" }, "downloads": -1, "filename": "plone.app.registry-1.3.7.tar.gz", "has_sig": false, "md5_digest": "ab387cc6635ba36f705f75e7969c3623", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50704, "upload_time": "2015-11-27T23:04:08", "url": "https://files.pythonhosted.org/packages/8c/6f/8da944a231db60539d9c6ac54563d493918ef30d6116520e19186a4288d5/plone.app.registry-1.3.7.tar.gz" } ], "1.3.8": [ { "comment_text": "", "digests": { "md5": "f4b997ce81c7af92ee0ca3e1871ba770", "sha256": "80c81e1d2d531c5ea41c1529724629e516981e56771f0f3db87066eb60ab8ac8" }, "downloads": -1, "filename": "plone.app.registry-1.3.8.tar.gz", "has_sig": false, "md5_digest": "f4b997ce81c7af92ee0ca3e1871ba770", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50851, "upload_time": "2016-02-08T21:43:28", "url": "https://files.pythonhosted.org/packages/5e/ef/7db549d5a92bf38d2b97844b1aeeb4a4a0f507129488e460e6af63407142/plone.app.registry-1.3.8.tar.gz" } ], "1.3.9": [ { "comment_text": "", "digests": { "md5": "68c5adeddf9f7c2d50ecbf50df8240ea", "sha256": "aa509423b6402c14c4be997369459bcde2ab5b6d64dccd1c1a10a58438637587" }, "downloads": -1, "filename": "plone.app.registry-1.3.9.tar.gz", "has_sig": false, "md5_digest": "68c5adeddf9f7c2d50ecbf50df8240ea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51032, "upload_time": "2016-02-20T19:45:54", "url": "https://files.pythonhosted.org/packages/2a/92/30e98bc98452b38637113852db106f52fc879137673d5dfcb6a3a3340b7e/plone.app.registry-1.3.9.tar.gz" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "bda45d455ce1cf409d31cf1b30231fdc", "sha256": "c3153f8606cdf57b227bc6ce39be75497d58e489f3fb56a790679ea14e844cb4" }, "downloads": -1, "filename": "plone.app.registry-1.4.tar.gz", "has_sig": false, "md5_digest": "bda45d455ce1cf409d31cf1b30231fdc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53427, "upload_time": "2016-09-13T23:43:45", "url": "https://files.pythonhosted.org/packages/98/41/ef22bacff259e480762bd10f604b0258857d28c3b8d1d5d8712e3bfed4d2/plone.app.registry-1.4.tar.gz" } ], "1.5": [ { "comment_text": "", "digests": { "md5": "8dc16fc45bf4028e3416ccedf698a9cd", "sha256": "cc161810b836c66ac7577a4f51a23a56ba075f43ebb40fe96757ceb46c0edccc" }, "downloads": -1, "filename": "plone.app.registry-1.5.tar.gz", "has_sig": false, "md5_digest": "8dc16fc45bf4028e3416ccedf698a9cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53657, "upload_time": "2016-10-23T13:22:59", "url": "https://files.pythonhosted.org/packages/90/66/e43e9dce34a08af7c42d912752d0930ef6fe54ce1f50c7b3b6f2b9cf86f3/plone.app.registry-1.5.tar.gz" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "d22fed9ce4176fa28f5eaacdf8a8d995", "sha256": "ec2657f2e3e3aa6fc45e553a249d91db2bac376779b3960bb29b61fc9a3207f6" }, "downloads": -1, "filename": "plone.app.registry-1.6.tar.gz", "has_sig": false, "md5_digest": "d22fed9ce4176fa28f5eaacdf8a8d995", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 361538, "upload_time": "2017-05-23T17:01:16", "url": "https://files.pythonhosted.org/packages/35/ea/3afc6c786970acd8b9cf0b953170833d48fda3b76776d5d1659a5ac6192e/plone.app.registry-1.6.tar.gz" } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "7ecfb1b535e8a112cb690c2579f1c697", "sha256": "ed574e4314f84a402ce17561d92f5f161bac6bdf192161afd238cbdb6967c659" }, "downloads": -1, "filename": "plone.app.registry-1.6.1-py2-none-any.whl", "has_sig": false, "md5_digest": "7ecfb1b535e8a112cb690c2579f1c697", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 54249, "upload_time": "2017-06-04T17:36:34", "url": "https://files.pythonhosted.org/packages/07/1e/91abe31e685086c51067892d806d60c860f06b5d86debe3b08069c460d3c/plone.app.registry-1.6.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c7ee8a439375f2fe5229b2ff0e1efa2b", "sha256": "db827a77acce51d56129054d7a4f3ed4949af3e74a72b299c971f9554ff7a327" }, "downloads": -1, "filename": "plone.app.registry-1.6.1.tar.gz", "has_sig": false, "md5_digest": "c7ee8a439375f2fe5229b2ff0e1efa2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 361833, "upload_time": "2017-06-04T17:36:36", "url": "https://files.pythonhosted.org/packages/1e/51/2b6958327f88007b071d469a0fabf60603845379f3b50c2d5c0b164351e8/plone.app.registry-1.6.1.tar.gz" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "3556066432df984e8e08557b165e2b9b", "sha256": "11d3cdb538a7b8c5ba402f46b6c7a8f43c638a1b556bd017ce154a108e3fed89" }, "downloads": -1, "filename": "plone.app.registry-1.7-py2-none-any.whl", "has_sig": false, "md5_digest": "3556066432df984e8e08557b165e2b9b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 54519, "upload_time": "2018-02-04T22:19:24", "url": "https://files.pythonhosted.org/packages/3c/6d/5fcd925030642b308a082c77fc169b4aba434b573afaf500d740f4e35a92/plone.app.registry-1.7-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ce4c2e055be809381d6bbb5e933ad334", "sha256": "ad7bf2ce2214d0636bce446d0eea63cf767a364d1cc7011bb344fcfa6d011ec0" }, "downloads": -1, "filename": "plone.app.registry-1.7.tar.gz", "has_sig": false, "md5_digest": "ce4c2e055be809381d6bbb5e933ad334", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 361820, "upload_time": "2018-02-04T22:19:26", "url": "https://files.pythonhosted.org/packages/d4/1e/60350c9f5155a1b3ab07d93db7e4d35b13de1e1cd06e2ccc44932cf0cbac/plone.app.registry-1.7.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "b024da676b880305ff879f2dd57a37b3", "sha256": "5518fc6e19d154665afd3441b167c5643058e481312faa2be4bee91ab7fc24a4" }, "downloads": -1, "filename": "plone.app.registry-1.7.1-py2-none-any.whl", "has_sig": false, "md5_digest": "b024da676b880305ff879f2dd57a37b3", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 54557, "upload_time": "2018-04-08T18:35:27", "url": "https://files.pythonhosted.org/packages/97/7b/83f030e767143e8a6beb4ffa1f14113e77dd85d1c94a995c392c62b1e8ed/plone.app.registry-1.7.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "99f28050e7fe0f12626e1ff5b90226d2", "sha256": "976a1f9aabae6ee353459987bf2460aa14cf335f55cadf577fe8fb3ea5ca1f0d" }, "downloads": -1, "filename": "plone.app.registry-1.7.1.tar.gz", "has_sig": false, "md5_digest": "99f28050e7fe0f12626e1ff5b90226d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 365253, "upload_time": "2018-04-08T18:35:34", "url": "https://files.pythonhosted.org/packages/a1/0a/1126682a940d0997f810fd0b6e0003f9f30e6c5040cdaaf759d183ed0e40/plone.app.registry-1.7.1.tar.gz" } ], "1.7.2": [ { "comment_text": "", "digests": { "md5": "ffad24656ff25ca96f03827fb73566ca", "sha256": "e5a0075634d75f07d53b1c353200827159adcc7b35613354ade96ebf510573a2" }, "downloads": -1, "filename": "plone.app.registry-1.7.2-py2-none-any.whl", "has_sig": false, "md5_digest": "ffad24656ff25ca96f03827fb73566ca", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 44499, "upload_time": "2018-06-19T14:01:55", "url": "https://files.pythonhosted.org/packages/8f/69/f9470edc5aaa74f6c242e95e48017749f12a2e73f2c3c74a25fd05338db2/plone.app.registry-1.7.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c64469ee721bdfa1206e15b27872477", "sha256": "022eac9906db251415750d9b5401dd046c7fc8ca988fc9837b79a6a20da51b51" }, "downloads": -1, "filename": "plone.app.registry-1.7.2.tar.gz", "has_sig": false, "md5_digest": "5c64469ee721bdfa1206e15b27872477", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 366944, "upload_time": "2018-06-19T14:01:57", "url": "https://files.pythonhosted.org/packages/05/d8/b66ceec26d9edda3abebabe48ecf7221faec00fd0fe2fe5d45acd809439e/plone.app.registry-1.7.2.tar.gz" } ], "1.7.3": [ { "comment_text": "", "digests": { "md5": "41c581a8087819d79d9df40607c2d2da", "sha256": "f07c0d03b47b8faa6e8c9b317debeb2107548e40ffb15e236248e6fe493d65f3" }, "downloads": -1, "filename": "plone.app.registry-1.7.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "41c581a8087819d79d9df40607c2d2da", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 44671, "upload_time": "2019-02-12T23:21:26", "url": "https://files.pythonhosted.org/packages/8e/33/54e7b26eef9fe3fc98121246c9efe9d821a2eb44d0711ea9bc471a7e4f6e/plone.app.registry-1.7.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2e2aa4a9408fa79aa75823a4d24f0f5e", "sha256": "2e2b5cfb5c84609ce76c6a7a08350e3b75b801efc5be02559a7389dff7c2f00c" }, "downloads": -1, "filename": "plone.app.registry-1.7.3.tar.gz", "has_sig": false, "md5_digest": "2e2aa4a9408fa79aa75823a4d24f0f5e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 363532, "upload_time": "2019-02-12T23:21:29", "url": "https://files.pythonhosted.org/packages/d3/d7/1c333f4dc8590c69d31cf6a8375f3e19dc647d443709ca679d95095a5d17/plone.app.registry-1.7.3.tar.gz" } ], "1.7.4": [ { "comment_text": "", "digests": { "md5": "96c81375da5a535975010d0d16899be8", "sha256": "2ea0ecba9066aebeeec8917707d2c8337c684e81ceab234ca4a4bdc5b2536e23" }, "downloads": -1, "filename": "plone.app.registry-1.7.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "96c81375da5a535975010d0d16899be8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 44735, "upload_time": "2019-03-04T02:40:06", "url": "https://files.pythonhosted.org/packages/4f/94/d19db8034ae3a503278a2f995fda0446edf32842eb17f489a65d814cf9fe/plone.app.registry-1.7.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "846f177584bcf98d5e747b5e3b5f39bd", "sha256": "0077c55c1f6aee9a3e6b436a67834568075fd53b1d415e76d284bf066df25238" }, "downloads": -1, "filename": "plone.app.registry-1.7.4.tar.gz", "has_sig": false, "md5_digest": "846f177584bcf98d5e747b5e3b5f39bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 363595, "upload_time": "2019-03-04T02:40:10", "url": "https://files.pythonhosted.org/packages/20/e1/2a86b36dc56f416f5cc9e8406b95cac9efc54f08f28667f6d39a3cd74af1/plone.app.registry-1.7.4.tar.gz" } ], "1.7.5": [ { "comment_text": "", "digests": { "md5": "0be85605adfff372fa0ee498d8568686", "sha256": "64fceba8d6b6f67ed4d25e5628d799cad54be2093b41e909dc08d9f70e773f35" }, "downloads": -1, "filename": "plone.app.registry-1.7.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0be85605adfff372fa0ee498d8568686", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 44765, "upload_time": "2019-05-01T23:37:52", "url": "https://files.pythonhosted.org/packages/16/88/169ae286844263b38a01d5aabfe5ab54123024941d9cff8873bcda2e07f0/plone.app.registry-1.7.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b9ba5bad444775dc4cf074ca32299a49", "sha256": "53f0806aaafaf188f0f9f7b4569c5fc0c42fa45ed1dd58e9fb89013bd5e71ac1" }, "downloads": -1, "filename": "plone.app.registry-1.7.5.tar.gz", "has_sig": false, "md5_digest": "b9ba5bad444775dc4cf074ca32299a49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 363701, "upload_time": "2019-05-01T23:37:55", "url": "https://files.pythonhosted.org/packages/07/cc/01757b446d967316d0a98885e6a8c41920c89e7897c5cccfa2b10923e583/plone.app.registry-1.7.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0be85605adfff372fa0ee498d8568686", "sha256": "64fceba8d6b6f67ed4d25e5628d799cad54be2093b41e909dc08d9f70e773f35" }, "downloads": -1, "filename": "plone.app.registry-1.7.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0be85605adfff372fa0ee498d8568686", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 44765, "upload_time": "2019-05-01T23:37:52", "url": "https://files.pythonhosted.org/packages/16/88/169ae286844263b38a01d5aabfe5ab54123024941d9cff8873bcda2e07f0/plone.app.registry-1.7.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b9ba5bad444775dc4cf074ca32299a49", "sha256": "53f0806aaafaf188f0f9f7b4569c5fc0c42fa45ed1dd58e9fb89013bd5e71ac1" }, "downloads": -1, "filename": "plone.app.registry-1.7.5.tar.gz", "has_sig": false, "md5_digest": "b9ba5bad444775dc4cf074ca32299a49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 363701, "upload_time": "2019-05-01T23:37:55", "url": "https://files.pythonhosted.org/packages/07/cc/01757b446d967316d0a98885e6a8c41920c89e7897c5cccfa2b10923e583/plone.app.registry-1.7.5.tar.gz" } ] }