【问题标题】:Best practices for Plone control panelsPlone 控制面板的最佳实践
【发布时间】: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([]))

第三个问题可能是如何测试记录是否在未安装时被删除。

还有其他推荐吗?

【问题讨论】:

    标签: registry plone uninstallation


    【解决方案1】:

    注意:我自己还没有直接在包中使用 plone.app.registry。

    我的第一个问题是:一个包必须在卸载时删除它的注册表 时间?

    是的。至少从社区包的作者那里期待这一点似乎是合理的。我希望 plone.app.registry 不会因为旧的已删除软件包中丢失的东西而绊倒,就像它似乎在这里所做的那样,但这可能很棘手。

    那么,我的第二个问题是:如何在卸载时优雅地删除控制面板记录?

    在大多数 GenericSetup 文件中remove="True" 有效。不确定这个具体案例。

    【讨论】:

    【解决方案2】:
    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" 没有记录。
    • @maurits 我猜这也是为了迫使开发人员创建升级步骤,至少这就是我开始在自己的附加组件上编写它们的原因:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多