plone - 如何清理zc.relation目录上的旧接口(interface)?

标签 plone dexterity

我正在使用plone.directives.form版本 1.0 与 Plone 4.2.5 升级到 4.2.6 后,我开始看到以下回溯,我猜测是由于 plone.directives.form 升级到版本 1.1 .

如何避免此错误?回溯中唯一不是来自默认 Plone 的代码行位于 der.freitag.handlers 上,它执行 transaction.commit() 且内容类型只是常规的敏捷内容类型。

1385740390.020.496977141203 http://10.100.0.207:8081/website/front-page/atomkraft/++add++der.freitag.customizablearticlelink
Traceback (innermost last):
 Module ZPublisher.Publish, line 138, in publish
 Module ZPublisher.mapply, line 77, in mapply
 Module ZPublisher.Publish, line 48, in call_object
 Module plone.z3cform.layout, line 70, in __call__
 Module plone.z3cform.layout, line 54, in update
 Module plone.dexterity.browser.add, line 112, in update
 Module plone.z3cform.fieldsets.extensible, line 59, in update
 Module plone.z3cform.patch, line 30, in GroupForm_update
 Module z3c.form.group, line 138, in update
 Module z3c.form.action, line 99, in execute
 Module z3c.form.button, line 315, in __call__
 Module z3c.form.button, line 170, in __call__
 Module plone.dexterity.browser.add, line 99, in handleAdd
 Module z3c.form.form, line 247, in createAndAdd
 Module plone.dexterity.browser.add, line 78, in add
 Module plone.dexterity.utils, line 152, in addContentToContainer
 Module Products.BTreeFolder2.BTreeFolder2, line 455, in _setObject
 Module zope.event, line 31, in notify
 Module zope.component.event, line 24, in dispatch
 Module zope.component._api, line 136, in subscribers
 Module zope.component.registry, line 321, in subscribers
 Module zope.interface.adapter, line 585, in subscribers
 Module zope.component.event, line 32, in objectEventNotify
 Module zope.component._api, line 136, in subscribers
 Module zope.component.registry, line 321, in subscribers
 Module zope.interface.adapter, line 585, in subscribers
 Module der.freitag.handlers, line 126, in set_customizable_article_link_id
 Module transaction._manager, line 89, in commit
 Module transaction._transaction, line 329, in commit
 Module transaction._transaction, line 443, in _commitResources
 Module ZODB.Connection, line 567, in commit
 Module ZODB.Connection, line 623, in _commit
 Module ZODB.Connection, line 658, in _store_objects
 Module ZODB.serialize, line 422, in serialize
 Module ZODB.serialize, line 431, in _dump
PicklingError: Can't pickle <class 'plone.directives.form.schema.Schema'>: attribute lookup plone.directives.form.schema.Schema failed

编辑:正在创建的对象有一个关系字段(z3c.relationfield.schema.RelationChoice),事实证明zc.relation 保存任何关系的每个成员提供的所有接口(interface)的列表。因此,从 plone.directives.form 版本 1.0 升级到版本 1.1 后,无法再解析 plone.directives.form 上的接口(interface)。

来自z3c.relationfield文档我没有看到任何更新关系的选项,所以唯一的解决方案是获取所有关系并重新创建它们?

最佳答案

仅供引用,这就是我修复它的方法:

仍在 plone.directives.form 1.0 更新您的对象,以便它们不再提供 plone.directives.form.schema.Schema界面。

然后重新创建关系:

from z3c.relationfield import RelationValue
from zc.relation.interfaces import ICatalog
from zope.app.intid.interfaces import IIntIds
from zope.component import getUtility
from zope.event import notify
from zope.lifecycleevent import ObjectModifiedEvent

logger = logging.getLogger(LOGGER)
relations_catalog = getUtility(ICatalog)
intids = getUtility(IIntIds)

relations = [rel for rel in relations_catalog.findRelations()]
len_relations = len(relations)
logger.info('Relations needed to update: {0}'.format(len_relations))

for relation in relations:
    # get the object link and the object linked
    object_with_link = relation.from_object
    object_linked_to = relation.to_object

    # remove the broken relation
    object_with_link.reference = None

    # let the catalog remove the old relation
    notify(ObjectModifiedEvent(object_with_link))

    # create a new relation
    object_linked_to_intid = intids.getId(object_linked_to)
    new_relation = RelationValue(object_linked_to_intid)
    object_with_link.reference = new_relation

    # let the catalog know about this new relation
    notify(ObjectModifiedEvent(object_with_link))

此后,停止实例,再次运行 buildout 来更新 plone.directives.form到版本 1.1 并!

关于plone - 如何清理zc.relation目录上的旧接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20290361/

相关文章:

plone - 在 Plone 上使用 Dexterity 按文件类型或 mimetype 限制上传

plone - 在 Plone 中选择性地允许不安全的 html 标签

plone - 使用 z3c.form 进行单元测试 buttonAndHandler

Apache SSL Plone 4.2 随机代理错误

plone - 如何定义升级附加组件的过程?

plone - 限制灵巧文档的内容类型

plone - 使用新界面标记敏捷性内容类型的推荐方法

python - 如何将默认值设置为 zope.schema.datetime?

testing - 如何使用 IContextAwareDefaultFactory 测试内容类型

plone - 呈现为 In-Out-Widget 的多复选框小部件