Skip to main content
Archived

This project has been archived by its maintainers, and is no longer receiving any updates.

This package provides a UI to maintain hierarchical user preferences in the ZMI.

zope.app.preference

This package provides a user interface in the ZMI, so the user can edit the preferences.

Set up

To show the user interface functions we need some setup beforehand:

>>> from zope.testbrowser.wsgi import Browser
>>> browser = Browser()
>>> browser.handleErrors = False

As the preferences cannot be defined through the web we have to define them in python code:

>>> import zope.interface
>>> import zope.schema
>>> class IZMIUserSettings(zope.interface.Interface):
...     """Basic 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 ZMI.",
...         values=['Rotterdam', 'ZopeTop', 'Basic'],
...         default='Rotterdam')
...
...     showZopeLogo = zope.schema.Bool(
...         title=u"Show Zope Logo",
...         description=u"Specifies whether Zope logo should be displayed "
...                     u"at the top of the screen.",
...         default=True)
>>> class INotCategorySettings(zope.interface.Interface):
...    """An example that's not a categary"""
...    comment = zope.schema.TextLine(
...        title=u'A comment',
...        description=u'A description')

The preference schema is usually registered using a ZCML statement:

>>> 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="ZMISettings"
...           title="ZMI Settings"
...           schema="zope.app.preference.README.IZMIUserSettings"
...           category="true"
...           />
...
...       <preferenceGroup
...           id="NotCategory"
...           title="Not Category"
...           schema="zope.app.preference.README.INotCategorySettings"
...           category="false"
...           />
...
...     </configure>''', context)

Editing Preferences

The preferences are accessable in the ++preferences++ namespace:

>>> browser.open('http://localhost/++preferences++')

The page shows a form which allows editing the preference values:

>>> browser.getControl("comment").value = "A comment"
>>> browser.getControl('E-mail').value = 'hans@example.com'
>>> browser.getControl('Skin').displayOptions
['Rotterdam', 'ZopeTop', 'Basic']
>>> browser.getControl('Skin').displayValue = ['ZopeTop']
>>> browser.getControl('Show Zope Logo').selected
True
>>> browser.getControl('Show Zope Logo').click()

After selecting Change the values get persisted:

>>> browser.getControl('Change').click()
>>> browser.url
'http://localhost/++preferences++/@@index.html'
>>> browser.getControl('E-mail').value
'hans@example.com'
>>> browser.getControl('Skin').displayValue
['ZopeTop']
>>> browser.getControl('Show Zope Logo').selected
False

The preference group is shown in a tree. It has a link to the form:

>>> browser.getLink('ZMISettings').click()
>>> browser.url
'http://localhost/++preferences++/ZMISettings/@@index.html'
>>> browser.getControl('E-mail').value
'hans@example.com'

Preference Group Trees

The preferences would not be very powerful, if you could create a full preferences. So let’s create a sub-group for our ZMI user settings, where we can adjust the look and feel of the folder contents view:

>>> class IFolderSettings(zope.interface.Interface):
...     """Basic Folder Settings"""
...
...     shownFields = zope.schema.Set(
...         title=u"Shown Fields",
...         description=u"Fields shown in the table.",
...         value_type=zope.schema.Choice(['name', 'size', 'creator']),
...         default=set(['name', 'size']))
...
...     sortedBy = zope.schema.Choice(
...         title=u"Sorted By",
...         description=u"Data field to sort by.",
...         values=['name', 'size', 'creator'],
...         default='name')

And register it:

>>> context = xmlconfig.string('''
...     <configure
...         xmlns="http://namespaces.zope.org/zope"
...         i18n_domain="test">
...
...       <preferenceGroup
...           id="ZMISettings.Folder"
...           title="Folder Content View Settings"
...           schema="zope.app.preference.README.IFolderSettings"
...           />
...
...     </configure>''', context)

The sub-group is displayed inside the parent group as a form:

>>> browser.reload()
>>> browser.getControl('Shown Fields').displayOptions
['name', 'size', 'creator']
>>> browser.getControl('Shown Fields').displayValue
['name', 'size']
>>> browser.getControl('Shown Fields').displayValue = ['size', 'creator']
>>> browser.getControl('Sorted By').displayOptions
['name', 'size', 'creator']
>>> browser.getControl('Sorted By').displayValue = ['creator']

Selecing Change persists these values, too:

>>> browser.getControl('Change').click()
>>> browser.getControl('Shown Fields').displayValue
['size', 'creator']
>>> browser.getControl('Sorted By').displayValue
['creator']
>>> browser.open("http://localhost/++preferences++/ZMISettings.Folder/@@index.html")

CHANGES

4.1.0 (2022-08-05)

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

  • Drop support for Python 3.4.

4.0.0 (2017-05-17)

  • Add support for Python 3.4, 3.5, 3.6 and PyPy.

  • Removed test dependency on zope.app.zcmlfiles and zope.app.renderer, among others. zope.app.renderer is still required at runtime.

  • Broke test dependency on zope.app.testing by using zope.app.wsgi.testlayer.

3.8.1 (2010-06-15)

  • Fixed BBB imports which pointed to a not existing zope.preferences package.

3.8.0 (2010-06-12)

  • Depend on split out zope.preference.

3.7.0 (2010-06-11)

  • Added HTML labels to ZMI forms.

  • Removed edit.pt as it seems to be unused.

  • Added tests for the ZMI views.

3.6.0 (2009-02-01)

  • Use zope.container instead of zope.app.container.

3.5.0 (2009-01-17)

  • Got rid of zope.app.zapi dependency, replacing its uses with direct imports from original places.

  • Change mailing address from zope3-dev to zope-dev, as the first one is retired now.

  • Fix tests for python 2.6.

  • Remove zpkg stuff and zcml include files for old mkzopeinstance-based instances.

3.4.1 (2007-10-30)

  • Avoid deprecation warnings for ZopeMessageFactory.

3.4.0 (2007-10-25)

  • Initial release independent of the main Zope tree.

Release files for zope.app.preference 4.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for zope.app.preference 4.1.0
File Size Uploaded
zope.app.preference-4.1.0.tar.gz 16.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for zope.app.preference 4.1.0
File Interpreter ABI Platform
zope.app.preference-4.1.0-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 36.1 kB

Release files / zope.app.preference-4.1.0.tar.gz

Download URL zope.app.preference-4.1.0.tar.gz
Size 16.0 kB
Tags Source
SHA-256 checksum
How to use checksums
57a85ebc37d551af5331a5d5b848bb3f1eeed8a11160d3cad1bf248bf2f92793
BLAKE2b-256 checksum
How to use checksums
c1038d7c49f544026b841e139cb4de0ff6215ce8d3f242fcfcf70147713d524f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.8.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.13

Release files / zope.app.preference-4.1.0-py2.py3-none-any.whl

Download URL zope.app.preference-4.1.0-py2.py3-none-any.whl
Size 20.0 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
97e518339dd543c8ba477e81cb6c0e4cd050d24ad7304cf7f480fdbe595aec33
BLAKE2b-256 checksum
How to use checksums
4f4e1495d9d5330c103455aa248800fd7239a5b700ac3adccf88b53e60bdbce5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.8.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.13
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page