2013-04-28 33 views
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' 

我在做什麼錯在這裏?

+0

代碼是在這裏:https://github.com/collective/collective.cover/commit/898b22bf26ac914322103d0d94690c3427296174 – hvelarde 2013-04-28 23:28:34

回答