Skip to main content

UI for zope.preference using z3c.pagelet and z3c.form.

Project description

https://github.com/zopefoundation/z3c.preference/actions/workflows/tests.yml/badge.svg https://coveralls.io/repos/github/zopefoundation/z3c.preference/badge.svg Current version on PyPI Supported Python versions

This packages provides a user interface for zope.preference using z3c.pagelet and z3c.form.

Changes

2.0 (2023-02-21)

  • Drop support for Python 2.7, 3.5, 3.6.

  • Add support for Python 3.8, 3.9, 3.10, 3.11.

1.0 (2018-12-21)

  • Update tests to zope.testbrowser >= 5.

  • Add support for Python 3.6 and 3.7.

0.5 (2013-03-09)

  • Sorting preferences in CategoryEditForm by their id to stabialize sort order.

0.4 (2012-04-20)

  • Descriptions of preference groups are now rendered in the group-header slot of the form above the error messages for the group.

  • Fixed description of version 0.3, it actually added descriptions for preference categories, not preference groups.

0.3 (2012-03-15)

  • Descriptions of preference categories are now rendered in the extra-info slot of the form.

0.2 (2012-02-23)

0.1.1 (2010-07-17)

0.1.0 (2010-07-10)

  • Initial Release.

Overview

z3c.preference renders forms in the browser for the preference sets which were defined using zope.preference.

Using z3c.preference

There are some preconditions to use z3c.preference:

  • The views for the ++preferences++ namespace are registered for the layer z3c.preference.interfaces.IPreferenceLayer. So you have to add this interface to the browser layer of your application.

  • Only users having the permission z3c.preference.EditPreference are allowed to access the the preference views. So you have to add this permission to the users resp. roles which should be able to access the preferences views.

Editing preferences

Set up for tests

At first we have to define a preference interface:

>>> import zope.interface
>>> import zope.schema
>>> class IBackEndSettings(zope.interface.Interface):
...     """Backend User Preferences"""
...
...     email = zope.schema.TextLine(
...         title=u"E-mail Address",
...         description=u"E-mail address used to send notifications")
...
...     skin = zope.schema.Choice(
...         title=u"Skin",
...         description=u"The skin that should be used for the back end.",
...         values=['Hipp', 'Lame', 'Basic'],
...         default='Basic')
...
...     showLogo = zope.schema.Bool(
...         title=u"Show Logo",
...         description=u"Specifies whether the logo should be displayed.",
...         default=True)

The interface must be registered for preferences:

>>> from zope.configuration import xmlconfig
>>> import zope.preference
>>> context = xmlconfig.file('meta.zcml', zope.preference)
>>> context = xmlconfig.string('''
...     <configure
...         xmlns="http://namespaces.zope.org/zope"
...         i18n_domain="test">
...
...       <preferenceGroup
...           id="BackEndSettings"
...           title="Back End Settings"
...           schema="z3c.preference.README.IBackEndSettings"
...           />
...
...     </configure>''', context)

To access the forms a browser is needed, the user must be authorized as the preferences are stored in the principal annotations:

>>> from zope.testbrowser.wsgi import Browser
>>> browser = Browser()
>>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')

Editing preferences using browser

There is a namespace to access the preferences. On the page a form is displayed which shows the default values:

>>> browser.open('http://localhost/++preferences++/BackEndSettings')
>>> browser.getControl('E-mail Address').value
''
>>> browser.getControl('Skin').displayValue
['Basic']
>>> browser.getControl('yes').selected
True
>>> browser.getControl('no').selected
False

The values can be changed and submitting the form makes them persistent:

>>> browser.getControl('E-mail Address').value = 'me@example.com'
>>> browser.getControl('Skin').displayValue = ['Hipp']
>>> browser.getControl('no').click()
>>> browser.getControl('Apply').click()

After submitting the form gets displayed again and shows the changed values:

>>> 'Data successfully updated.' in browser.contents
True
>>> browser.getControl('E-mail Address').value
'me@example.com'
>>> browser.getControl('Skin').displayValue
['Hipp']
>>> browser.getControl('no').selected
True

Editing preference group trees

zope.preference has the concept of preference group trees and preference categories to group preferences.

If a preference category is displayed using z3c.preference automatically all preference groups belonging to the category are rendered as groups in the edit form (aka GroupForm).

Note: Currently only the preference category and its direct children are rendered in the tree.

Set up

At first we have to define some preference interfaces presenting the tree. In this example we think of a web application with some areas:

>>> import zope.interface
>>> import zope.schema
>>> class IGeneralSettings(zope.interface.Interface):
...     """General preferences"""
...
...     language = zope.schema.Choice(
...         title=u"Language",
...         description=u"The language which should be used for display.",
...         values=['German', 'English', 'Russian'],
...         default='German')
>>> class IRSSSettings(zope.interface.Interface):
...     """Preferences for the RSS area of the application."""
...
...     number = zope.schema.Int(
...         title=u"Item count",
...         description=u"Maximum number of items in each feed.")
>>> class ISearchSettings(zope.interface.Interface):
...     """Preferences for the search area of the application."""
...
...     store_searches = zope.schema.Bool(
...         title=u"Store searches?",
...         description=u"Should searches be kept for later use?",
...         default=True)

The interfaces must be registered for preferences:

>>> from zope.configuration import xmlconfig
>>> import zope.preference
>>> context = xmlconfig.file('meta.zcml', zope.preference)
>>> context = xmlconfig.string('''
...     <configure
...         xmlns="http://namespaces.zope.org/zope"
...         i18n_domain="test">
...
...       <preferenceGroup
...           id="app"
...           title="General Settings"
...           description="Settings for the whole app"
...           schema="z3c.preference.categories.IGeneralSettings"
...           category="true"
...           />
...
...       <preferenceGroup
...           id="app.search"
...           title="Search Settings"
...           schema="z3c.preference.categories.ISearchSettings"
...           category="false"
...           />
...
...       <preferenceGroup
...           id="app.rss"
...           title="RSS Settings"
...           description="Settings for the RSS feeds"
...           schema="z3c.preference.categories.IRSSSettings"
...           category="false"
...           />
...
...     </configure>''', context)

To access the forms a browser is needed, the user must be authorized as the preferences are stored in the principal annotations:

>>> from zope.testbrowser.wsgi import Browser
>>> browser = Browser()
>>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')

The form displays the titles and descriptions of the categories:

>>> browser.open('http://localhost/++preferences++/app')
>>> print(browser.contents)
<!DOCTYPE ...
...General Settings...
...Settings for the whole app...
...RSS Settings...
...Settings for the RSS feeds...
...Search Settings...

Editing preference group trees using browser

There is a namespace to access the preferences. On the page a form is displayed which shows the default values:

>>> browser.open('http://localhost/++preferences++/app')
>>> browser.getControl('Language').displayValue
['German']
>>> browser.getControl('Item count').value
''
>>> browser.getControl('yes').selected
True
>>> browser.getControl('no').selected
False

The values can be changed and submitting the form makes them persistent:

>>> browser.getControl('Language').displayValue = ['English']
>>> browser.getControl('Item count').value = '20'
>>> browser.getControl('no').click()
>>> browser.getControl('Apply').click()

After submitting the form gets displayed again and shows the changed values:

>>> 'Data successfully updated.' in browser.contents
True
>>> browser.getControl('Language').displayValue
['English']
>>> browser.getControl('Item count').value
'20'
>>> browser.getControl('no').selected
True

To do

  • Document how to use it in own projects. (ZCML and skin)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

z3c.preference-2.0.tar.gz (13.2 kB view details)

Uploaded Source

Built Distribution

z3c.preference-2.0-py3-none-any.whl (14.8 kB view details)

Uploaded Python 3

File details

Details for the file z3c.preference-2.0.tar.gz.

File metadata

  • Download URL: z3c.preference-2.0.tar.gz
  • Upload date:
  • Size: 13.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for z3c.preference-2.0.tar.gz
Algorithm Hash digest
SHA256 9a1649b7f8b5d529beb64eeecb62bd53b50c29d3e80255b67eeaba025ab45682
MD5 ac9d7d87a39a9f820b61df4697a3e211
BLAKE2b-256 6f9c7791ac88874a68ca95517546c7de8e56c7dd08b26628ecc7075ab6bc1984

See more details on using hashes here.

File details

Details for the file z3c.preference-2.0-py3-none-any.whl.

File metadata

  • Download URL: z3c.preference-2.0-py3-none-any.whl
  • Upload date:
  • Size: 14.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for z3c.preference-2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9142295973a5c10aab62bb1d7634922319c91654fd3113b43eeca0fc38e041bf
MD5 b8aa33d9a120833a59e3541ca1e99fc0
BLAKE2b-256 49c305374025858f122dc1824e1e1cf904a66a60031d1be502f1088b59863ecb

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page