Plone 控制面板的最佳实践
Posted
技术标签:
【中文标题】Plone 控制面板的最佳实践【英文标题】:Best practices for Plone control panels 【发布时间】:2011-10-25 06:07:50 【问题描述】:我正在开发一个package,其中包括一个使用 plone.app.registry 创建的控制面板。我关注了Timo's tutorial,但在尝试向其中添加额外记录时,我遇到了臭名昭著的KeyError:没有记录的字段。
所以我有几个关于最佳实践的问题:
我的第一个问题是:一个包必须在卸载时删除它的注册表?
我在我的包的 registry.xml 中使用了这个:
<registry>
<records interface="collective.nitf.controlpanel.INITFSettings" />
</registry>
这在 metadata.xml 上:
<metadata>
<version>1</version>
<dependencies>
<dependency>profile-plone.app.registry:default</dependency>
</dependencies>
</metadata>
但在卸载配置文件上添加 delete="true" 似乎不起作用。我也尝试按名称列出所有记录,但没有成功,除非我在 ZMI 手动运行该步骤。
那么,我的第二个问题是:如何在卸载时优雅地删除控制面板记录?
为了测试记录是否在注册表中,我执行以下操作:
def setUp(self):
self.portal = self.layer['portal']
setRoles(self.portal, TEST_USER_ID, ['Manager'])
# Set up the NITF settings registry
self.registry = Registry()
self.registry.registerInterface(INITFSettings)
def test_record_sections(self):
# Test that the sections record is in the control panel
record_sections = self.registry.records[
'collective.nitf.controlpanel.INITFSettings.sections']
self.failUnless('sections' in INITFSettings)
self.assertEquals(record_sections.value, set([]))
第三个问题可能是如何测试记录是否在未安装时被删除。
还有其他推荐吗?
【问题讨论】:
【参考方案1】:注意:我自己还没有直接在包中使用 plone.app.registry。
我的第一个问题是:一个包必须在卸载时删除它的注册表 时间?
是的。至少从社区包的作者那里期待这一点似乎是合理的。我希望 plone.app.registry 不会因为旧的已删除软件包中丢失的东西而绊倒,就像它似乎在这里所做的那样,但这可能很棘手。
那么,我的第二个问题是:如何在卸载时优雅地删除控制面板记录?
在大多数 GenericSetup 文件中remove="True"
有效。不确定这个具体案例。
【讨论】:
plone.app.registry 上的 Deleting records 有点不同,对我不起作用;您必须执行以下操作:My first question is: a package must remove it's registry at uninstall time?
我不参与在卸载时删除内容,因为有时您不想在重新安装时丢失配置...提供一种清理注册表的方法对于站点管理员来说应该更好。在您不想丢失数据的测试实例上进行测试。
第二个问题maurits已经回答了,所以你应该注意错字:
delete="true" != "remove="True"
【讨论】:
这就是为什么在安装了具有 GenericSetup 配置文件的产品后,添加/删除产品面板仅提供卸载它的选项,而不再提供重新安装它的选项(Plone 3.3 及更高版本)。它仅提供应用升级步骤(如果已注册)。高级用户仍然可以通过 portal_quickinstaller 重新安装,但他们应该知道可能的障碍,就像你上面提到的那样。 delete="true" 在 plone.app.registry 中有效,但前提是我在 portal_setup 手动运行该步骤; remove="true" 没有记录。 @hvelarde 文档:plone.org/documentation/kb/genericsetup/… 和 packages.python.org/Products.GenericSetup/… @maurits 我猜这也是为了迫使开发人员创建升级步骤,至少这就是我开始在自己的附加组件上编写它们的原因:)以上是关于Plone 控制面板的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章