plonezope.interface

Storing pairs of strings inside plone.app.registry


I need to build a configuration panel in the Plone control panel that store couples, and I'd like to use plone.app.registry on Plone 3.


If I limit myself to the user interface, it's quite simple to define a schema interface that automatically build this:

class IMyPair(Interface):
value = schema.TextLine(title=u"value", required=True)
title = schema.TextLine(title=u"title", required=False)

class MyPair(object):
    implements(IMyPair)
    def __init__(self, value='', title=''):
    self.value = value
    self.title = title

class IMyConfigPanel(Interface):

    entry = schema.List(
        title=_(u'Foo'),
        value_type=schema.Object(IMyPair, title=u"entry"),
        required=True
    )

We used this is a project that store couples inside portal_properties as a single string (with a delimiter).


Using this approach (with the "value_type=schema.Object") with plone.app.registry I get an exception as IObjectField has no IPersistent adapter defined.

Before going deeper and becoming crazy providing my own adapter: there is a simpler way to reach the initial need of my problem?


Solution

  • You should probably re-read the plone.(app.)registry docs, especially the plone.registry docs for "Persistent fields".

    Not all zope.schema types are supported and for some of them you need to use the persistent variants from plone.registry.field. In general anything that's not a primitive type in Python (int, unicode, float, etc.) needs special handling. This has been a deliberate design choice to keep the registry working even if an add-on that has provided some settings is later removed from the file system.

    There's examples for using plone.registry.field.Tuple in both the base docs and a GenericSetup example in the plone.app.registry docs.