{ "info": { "author": "Michael Howitz", "author_email": "zope-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Zope :: 3", "Intended Audience :: Developers", "License :: OSI Approved", "License :: OSI Approved :: Zope Public License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Internet :: WWW/HTTP" ], "description": ".. image:: https://travis-ci.com/zopefoundation/z3c.preference.svg?branch=master\n :target: https://travis-ci.com/zopefoundation/z3c.preference\n\n.. image:: https://coveralls.io/repos/github/zopefoundation/z3c.preference/badge.svg\n :target: https://coveralls.io/github/zopefoundation/z3c.preference\n\n.. image:: https://img.shields.io/pypi/v/z3c.preference.svg\n :target: https://pypi.org/project/z3c.preference/\n :alt: Current version on PyPI\n\n.. image:: https://img.shields.io/pypi/pyversions/z3c.preference.svg\n :target: https://pypi.org/project/z3c.preference/\n :alt: Supported Python versions\n\n\nThis packages provides a user interface for `zope.preference` using\n`z3c.pagelet` and `z3c.form`.\n\n\n.. contents::\n\nChanges\n=======\n\n\n1.0 (2018-12-21)\n----------------\n\n- Update tests to `zope.testbrowser >= 5`.\n\n- Add support for Python 3.6 and 3.7.\n\n\n0.5 (2013-03-09)\n----------------\n\n- Sorting preferences in ``CategoryEditForm`` by their `id` to stabialize\n sort order.\n\n\n0.4 (2012-04-20)\n----------------\n\n- Descriptions of preference groups are now rendered in the ``group-header``\n slot of the form above the error messages for the group.\n\n- Fixed description of version `0.3`, it actually added descriptions for\n preference categories, not preference groups.\n\n\n0.3 (2012-03-15)\n----------------\n\n- Descriptions of preference categories are now rendered in the\n ``extra-info`` slot of the form.\n\n\n0.2 (2012-02-23)\n----------------\n\n- Added form for preference categories, see `Editing preference group trees`_.\n\n\n0.1.1 (2010-07-17)\n------------------\n\n- Documented preconditions to use this package, see `Using\n z3c.preference`_.\n\n0.1.0 (2010-07-10)\n------------------\n\n- Initial Release.\n\n\nOverview\n========\n\n``z3c.preference`` renders forms in the browser for the preference\nsets which were defined using zope.preference_.\n\n.. _zope.preference: http://pypi.python.org/pypi/zope.preference\n\nUsing z3c.preference\n====================\n\nThere are some preconditions to use `z3c.preference`:\n\n* The views for the ``++preferences++`` namespace are registered for\n the layer ``z3c.preference.interfaces.IPreferenceLayer``. So you\n have to add this interface to the browser layer of your application.\n\n* Only users having the permission ``z3c.preference.EditPreference``\n are allowed to access the the preference views. So you have to add this\n permission to the users resp. roles which should be able to access\n the preferences views.\n\nEditing preferences\n===================\n\nSet up for tests\n----------------\n\nAt first we have to define a preference interface:\n\n >>> import zope.interface\n >>> import zope.schema\n >>> class IBackEndSettings(zope.interface.Interface):\n ... \"\"\"Backend User Preferences\"\"\"\n ...\n ... email = zope.schema.TextLine(\n ... title=u\"E-mail Address\",\n ... description=u\"E-mail address used to send notifications\")\n ...\n ... skin = zope.schema.Choice(\n ... title=u\"Skin\",\n ... description=u\"The skin that should be used for the back end.\",\n ... values=['Hipp', 'Lame', 'Basic'],\n ... default='Basic')\n ...\n ... showLogo = zope.schema.Bool(\n ... title=u\"Show Logo\",\n ... description=u\"Specifies whether the logo should be displayed.\",\n ... default=True)\n\nThe interface must be registered for preferences:\n\n >>> from zope.configuration import xmlconfig\n >>> import zope.preference\n >>> context = xmlconfig.file('meta.zcml', zope.preference)\n\n >>> context = xmlconfig.string('''\n ... \n ...\n ... \n ...\n ... ''', context)\n\n\nTo access the forms a browser is needed, the user must be authorized as\nthe preferences are stored in the principal annotations:\n\n>>> from zope.testbrowser.wsgi import Browser\n>>> browser = Browser()\n>>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')\n\n\nEditing preferences using browser\n---------------------------------\n\nThere is a namespace to access the preferences. On the page a form is\ndisplayed which shows the default values:\n\n>>> browser.open('http://localhost/++preferences++/BackEndSettings')\n>>> browser.getControl('E-mail Address').value\n''\n>>> browser.getControl('Skin').displayValue\n['Basic']\n>>> browser.getControl('yes').selected\nTrue\n>>> browser.getControl('no').selected\nFalse\n\nThe values can be changed and submitting the form makes them persistent:\n\n>>> browser.getControl('E-mail Address').value = 'me@example.com'\n>>> browser.getControl('Skin').displayValue = ['Hipp']\n>>> browser.getControl('no').click()\n>>> browser.getControl('Apply').click()\n\nAfter submitting the form gets displayed again and shows the changed values:\n\n>>> 'Data successfully updated.' in browser.contents\nTrue\n>>> browser.getControl('E-mail Address').value\n'me@example.com'\n>>> browser.getControl('Skin').displayValue\n['Hipp']\n>>> browser.getControl('no').selected\nTrue\n\n\nEditing preference group trees\n==============================\n\n`zope.preference` has the concept of `preference group trees`_ and\n`preference categories` to group preferences.\n\n.. _`preference group trees`: http://pypi.python.org/pypi/zope.preference#preference-group-trees\n\nIf a `preference category` is displayed using `z3c.preference` automatically\nall `preference groups` belonging to the category are rendered as groups in the\nedit form (aka ``GroupForm``).\n\n**Note:** Currently only the preference category and its *direct* children\nare rendered in the tree.\n\n\nSet up\n------\n\nAt first we have to define some preference interfaces presenting the tree. In\nthis example we think of a web application with some areas:\n\n >>> import zope.interface\n >>> import zope.schema\n >>> class IGeneralSettings(zope.interface.Interface):\n ... \"\"\"General preferences\"\"\"\n ...\n ... language = zope.schema.Choice(\n ... title=u\"Language\",\n ... description=u\"The language which should be used for display.\",\n ... values=['German', 'English', 'Russian'],\n ... default='German')\n\n >>> class IRSSSettings(zope.interface.Interface):\n ... \"\"\"Preferences for the RSS area of the application.\"\"\"\n ...\n ... number = zope.schema.Int(\n ... title=u\"Item count\",\n ... description=u\"Maximum number of items in each feed.\")\n\n >>> class ISearchSettings(zope.interface.Interface):\n ... \"\"\"Preferences for the search area of the application.\"\"\"\n ...\n ... store_searches = zope.schema.Bool(\n ... title=u\"Store searches?\",\n ... description=u\"Should searches be kept for later use?\",\n ... default=True)\n\nThe interfaces must be registered for preferences:\n\n >>> from zope.configuration import xmlconfig\n >>> import zope.preference\n >>> context = xmlconfig.file('meta.zcml', zope.preference)\n\n >>> context = xmlconfig.string('''\n ... \n ...\n ... \n ...\n ... \n ...\n ... \n ...\n ... ''', context)\n\n\nTo access the forms a browser is needed, the user must be authorized as\nthe preferences are stored in the principal annotations:\n\n>>> from zope.testbrowser.wsgi import Browser\n>>> browser = Browser()\n>>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')\n\nThe form displays the titles and descriptions of the categories:\n\n>>> browser.open('http://localhost/++preferences++/app')\n>>> print(browser.contents)\n>> browser.open('http://localhost/++preferences++/app')\n>>> browser.getControl('Language').displayValue\n['German']\n>>> browser.getControl('Item count').value\n''\n>>> browser.getControl('yes').selected\nTrue\n>>> browser.getControl('no').selected\nFalse\n\nThe values can be changed and submitting the form makes them persistent:\n\n>>> browser.getControl('Language').displayValue = ['English']\n>>> browser.getControl('Item count').value = '20'\n>>> browser.getControl('no').click()\n>>> browser.getControl('Apply').click()\n\nAfter submitting the form gets displayed again and shows the changed values:\n\n>>> 'Data successfully updated.' in browser.contents\nTrue\n>>> browser.getControl('Language').displayValue\n['English']\n>>> browser.getControl('Item count').value\n'20'\n>>> browser.getControl('no').selected\nTrue\n\n\nTo do\n=======\n\n- Document how to use it in own projects. (ZCML and skin)\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/zopefoundation/z3c.preference", "keywords": "zope3 bluebream z3c preference ui", "license": "ZPL 2.1", "maintainer": "", "maintainer_email": "", "name": "z3c.preference", "package_url": "https://pypi.org/project/z3c.preference/", "platform": "", "project_url": "https://pypi.org/project/z3c.preference/", "project_urls": { "Homepage": "https://github.com/zopefoundation/z3c.preference" }, "release_url": "https://pypi.org/project/z3c.preference/1.0/", "requires_dist": [ "setuptools", "z3c.form", "z3c.formui", "z3c.pagelet", "zope.preference", "zope.app.principalannotation; extra == 'test'", "zope.app.wsgi (>=3.7); extra == 'test'", "zope.browserresource; extra == 'test'", "zope.login; extra == 'test'", "zope.principalregistry; extra == 'test'", "zope.securitypolicy; extra == 'test'", "zope.testbrowser (>=5); extra == 'test'", "zope.testing; extra == 'test'" ], "requires_python": "", "summary": "UI for zope.preference using z3c.pagelet and z3c.form.", "version": "1.0" }, "last_serial": 4625891, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "99fffa6e8ccb072cb85582f307988294", "sha256": "db2a2ed506f3468e1438c0f299dabaee1bf5b0fbd19153fb5e5b7d9d993ed5f6" }, "downloads": -1, "filename": "z3c.preference-0.1.0.tar.gz", "has_sig": false, "md5_digest": "99fffa6e8ccb072cb85582f307988294", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6772, "upload_time": "2010-07-10T22:29:26", "url": "https://files.pythonhosted.org/packages/c3/33/6e05fbcc08b97110141afb8a4657609190a1aedce5156e00cc2833dbd228/z3c.preference-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "553608d059f69504475a320637cae4a1", "sha256": "3aeaf5d7a66ece82df350ab505be6ae151c6df5c05cb68ca09642ba3af3e983e" }, "downloads": -1, "filename": "z3c.preference-0.1.1.tar.gz", "has_sig": false, "md5_digest": "553608d059f69504475a320637cae4a1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7054, "upload_time": "2010-07-17T21:03:41", "url": "https://files.pythonhosted.org/packages/81/89/9185042c271394a3b52655fe47284a4928dd08559c55b48c256f0e5252bd/z3c.preference-0.1.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "fe367cab02378a73429138df333508e6", "sha256": "08e59f87f950570fd030ae0e0df224e0e8fabb41016d88c0dea39dedc72cdb7c" }, "downloads": -1, "filename": "z3c.preference-0.2.tar.gz", "has_sig": false, "md5_digest": "fe367cab02378a73429138df333508e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9752, "upload_time": "2012-02-23T21:14:22", "url": "https://files.pythonhosted.org/packages/2f/75/3e9ee7fad397a122658b67f63936cce57502b113a1d6a6006c24e7a48f09/z3c.preference-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "57d53f0db1aa19146b11cd16d2125ccb", "sha256": "d63f07ec4902dac5a5437cfa2c62173ebd3d528b268a76e3c0a421618a878487" }, "downloads": -1, "filename": "z3c.preference-0.3.tar.gz", "has_sig": false, "md5_digest": "57d53f0db1aa19146b11cd16d2125ccb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10014, "upload_time": "2012-03-15T21:51:09", "url": "https://files.pythonhosted.org/packages/51/42/3f18480970ff01bf0c632d3f0bd718f7d90f449bb77f980837ef77151135/z3c.preference-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "8eb09152871f65fe0f4d60b101ad8a02", "sha256": "72a9e91004e3f92b4b9fb967318f6ec661ccb3e6da2fba57479511eaa6ec55a2" }, "downloads": -1, "filename": "z3c.preference-0.4.tar.gz", "has_sig": false, "md5_digest": "8eb09152871f65fe0f4d60b101ad8a02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10795, "upload_time": "2012-04-20T21:42:24", "url": "https://files.pythonhosted.org/packages/ca/a2/03dffb14fac4f39393c5b930c0d0d6976c73c821a795aa484bb069bb879d/z3c.preference-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "acc91d4bcbf23f68beaae4d79caa39ac", "sha256": "7007f29bfc71154987105b76e37e7221bcb8f3c0d39b5a4960665cd49b9dda41" }, "downloads": -1, "filename": "z3c.preference-0.5.zip", "has_sig": false, "md5_digest": "acc91d4bcbf23f68beaae4d79caa39ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24325, "upload_time": "2013-03-09T14:04:10", "url": "https://files.pythonhosted.org/packages/56/bb/4e3a331cc0747b34a90bed9c009cd745e3c2cda6930c0a6557b5d802330f/z3c.preference-0.5.zip" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "232b93ac5c58f3a973b741562aad787a", "sha256": "b843693f6e8c57ebdde36c01f4fa690e569a3ed52b72902705e8564a66f828f5" }, "downloads": -1, "filename": "z3c.preference-1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "232b93ac5c58f3a973b741562aad787a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17168, "upload_time": "2018-12-21T17:21:33", "url": "https://files.pythonhosted.org/packages/86/d1/d4156aea034b91082a2e6b8ad47f19e15e12b386703c524b82f6377f66f6/z3c.preference-1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "044ba1f1ab3f13ac71995be90301df90", "sha256": "2d1842395de171260f470f0e63985dea9cd0cbe125789e54010137de579416fd" }, "downloads": -1, "filename": "z3c.preference-1.0.tar.gz", "has_sig": false, "md5_digest": "044ba1f1ab3f13ac71995be90301df90", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11633, "upload_time": "2018-12-21T17:21:35", "url": "https://files.pythonhosted.org/packages/50/c1/2bd4e621361d17af3fd72d04e676f885b562239595ce2c2d0624eced6c16/z3c.preference-1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "232b93ac5c58f3a973b741562aad787a", "sha256": "b843693f6e8c57ebdde36c01f4fa690e569a3ed52b72902705e8564a66f828f5" }, "downloads": -1, "filename": "z3c.preference-1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "232b93ac5c58f3a973b741562aad787a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17168, "upload_time": "2018-12-21T17:21:33", "url": "https://files.pythonhosted.org/packages/86/d1/d4156aea034b91082a2e6b8ad47f19e15e12b386703c524b82f6377f66f6/z3c.preference-1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "044ba1f1ab3f13ac71995be90301df90", "sha256": "2d1842395de171260f470f0e63985dea9cd0cbe125789e54010137de579416fd" }, "downloads": -1, "filename": "z3c.preference-1.0.tar.gz", "has_sig": false, "md5_digest": "044ba1f1ab3f13ac71995be90301df90", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11633, "upload_time": "2018-12-21T17:21:35", "url": "https://files.pythonhosted.org/packages/50/c1/2bd4e621361d17af3fd72d04e676f885b562239595ce2c2d0624eced6c16/z3c.preference-1.0.tar.gz" } ] }