0
我在寫一個升級步驟,該記錄將一個記錄添加到將用於控制面板配置文件的註冊表中。如何以編程方式添加plone.registry記錄
我一開始就新增個人資料上有一個registry.xml文件,但後來我雖然有應以編程方式實現這一目標,避免只爲這一個GS配置文件的創建和註冊的方式。
我讀的plone.registtry文件,並根據它,列表的VALUE_TYPE性能可能只包含持久字段,所以我想出了這個代碼:
from collective.cover import _
from collective.cover.config import DEFAULT_AVAILABLE_TILES
from collective.cover.config import PROJECTNAME
from plone.registry import field
from plone.registry import Record
from plone.registry.interfaces import IRegistry
from zope.component import getUtility
import logging
def register_available_tiles_record(context, logger=None):
"""Handler for upgrade step from 2 to 3; adds the 'available_tiles' record
to the registry.
"""
if logger is None:
logger = logging.getLogger(PROJECTNAME)
registry = getUtility(IRegistry)
record = 'collective.cover.controlpanel.ICoverSettings.available_tiles'
if record not in registry.records:
available_tiles = field.List(
title=_(u"Available tiles"),
description=_(u"This tiles will be available for layout creation."),
required=True,
default=DEFAULT_AVAILABLE_TILES,
value_type=field.Choice(
vocabulary=u'collective.cover.EnabledTiles'),
)
registry.records[record] = Record(available_tiles)
logger.info("'available_tiles' record was added to the registry")
else:
logger.info("'available_tiles' record already exists in the registry")
但是當我運行處理程序,我收到以下錯誤:
Error in test test_from_2_to_3 (collective.cover.tests.test_upgrades.UpgradeStepsTestCase)
Traceback (most recent call last):
File "/home/hvelarde/buildout.python/parts/opt/lib/python2.7/unittest/case.py", line 327, in run
testMethod()
File "/home/hvelarde/collective/cover/src/collective/cover/tests/test_upgrades.py", line 35, in test_from_2_to_3
register_available_tiles_record(self.portal)
File "/home/hvelarde/collective/cover/src/collective/cover/upgrades.py", line 31, in register_available_tiles_record
vocabulary=u'collective.cover.EnabledTiles'),
File "/home/hvelarde/.buildout/eggs/zope.schema-4.2.2-py2.7.egg/zope/schema/_field.py", line 458, in __init__
super(AbstractCollection, self).__init__(**kw)
File "/home/hvelarde/.buildout/eggs/zope.schema-4.2.2-py2.7.egg/zope/schema/_bootstrapfields.py", line 306, in __init__
super(MinMaxLen, self).__init__(**kw)
File "/home/hvelarde/.buildout/eggs/zope.schema-4.2.2-py2.7.egg/zope/schema/_bootstrapfields.py", line 157, in __init__
self.default = default
File "/home/hvelarde/.buildout/eggs/zope.schema-4.2.2-py2.7.egg/zope/schema/_bootstrapfields.py", line 53, in __set__
inst.validate(value)
File "/home/hvelarde/.buildout/eggs/zope.schema-4.2.2-py2.7.egg/zope/schema/_bootstrapfields.py", line 182, in validate
self._validate(value)
File "/home/hvelarde/.buildout/eggs/zope.schema-4.2.2-py2.7.egg/zope/schema/_field.py", line 476, in _validate
errors = _validate_sequence(self.value_type, value)
File "/home/hvelarde/.buildout/eggs/zope.schema-4.2.2-py2.7.egg/zope/schema/_field.py", line 438, in _validate_sequence
value_type.validate(item)
AttributeError: 'InterfaceConstrainedProperty' object has no attribute 'validate'
我在做什麼錯在這裏?
代碼是在這裏:https://github.com/collective/collective.cover/commit/898b22bf26ac914322103d0d94690c3427296174 – hvelarde 2013-04-28 23:28:34