如何为其他客户提供灵活性修改?

时间:2014-05-19 11:53:15

标签: plone dexterity

在其他客户端重新启动之前,其他客户端无法使用灵活类型的修改后的model_source

无效或清除SCHEMA_CACHE不是一个有效的解决方案:每个客户端似乎都有自己的SCHEMA_CACHE,其中afik无法从其他客户端清除或失效。

有没有解决这个问题的方案?

此处介绍的场景使用ipython作为第二个客户端。通过启动两个客户端可以在网上重现同样的事情:(1)在client1中创建一个灵活类型,(2)在client2中编辑XML Field Model。

我想在https://github.com/plone/plone.dexterity上将此问题作为一个问题,但至于今天plone.dexterity github项目中似乎没有问题

utils.sync()
from Products.CMFCore.utils import getToolByName
from plone.dexterity.fti import DexterityFTI
id = 'mydexteritytype'
plone_site = app.Plone
tool_portal_types = getToolByName(plone_site, 'portal_types')
if tool_portal_types.hasObject(id): tool_portal_types.manage_delObjects(id)
utils.commit()
utils.sync()
fti = DexterityFTI(id)
fti.id = id
data = {}
data['title'] = id
data['i18n_domain'] = 'plone'
data['behaviors'] = "\n".join([
            'plone.app.dexterity.behaviors.metadata.IDublinCore',
            'plone.app.content.interfaces.INameFromTitle',
            ])
data['model_source'] = '''
<model xmlns:security="http://namespaces.plone.org/supermodel/security"
       xmlns:marshal="http://namespaces.plone.org/supermodel/marshal"
       xmlns:form="http://namespaces.plone.org/supermodel/form"
       xmlns="http://namespaces.plone.org/supermodel/schema">
    <schema>
        <field name="original" type="zope.schema.TextLine">
            <default>original</default>
            <description/>
            <title>original</title>
        </field>
    </schema>
</model>'''
data['klass'] = 'plone.dexterity.content.Container'
data['filter_content_types'] = True
data['icon_expr'] = 'string:${portal_url}/document_icon.png'
fti.manage_changeProperties(**data)
tool_portal_types._setObject(fti.id, fti)
utils.commit()

运行上面的代码后,新创建的mydexteritytype可供所有其他客户使用。

以下代码生成的修改仅在运行代码的客户端中可用。所有其他客户都不知道这些变化。

utils.sync()
from plone.dexterity.interfaces import IDexterityFTI
from zope.component import getUtility
fti = getUtility(IDexterityFTI, name=id)
model_source = '''
<model xmlns:security="http://namespaces.plone.org/supermodel/security"
       xmlns:marshal="http://namespaces.plone.org/supermodel/marshal"
       xmlns:form="http://namespaces.plone.org/supermodel/form"
       xmlns="http://namespaces.plone.org/supermodel/schema">
    <schema>
        <field name="modified" type="zope.schema.TextLine">
            <default>modified</default>
            <description/>
            <title>modified</title>
        </field>
    </schema>
</model>'''
fti.manage_changeProperties(model_source=model_source)
from plone.dexterity.schema import SCHEMA_CACHE
SCHEMA_CACHE.invalidate(fti)
SCHEMA_CACHE.clear()
utils.commit()

1 个答案:

答案 0 :(得分:0)

此请求请求应该可以解决此问题: