跳转到主要内容

plone.registry的Zope 2和Plone集成

项目描述

简介

plone.app.registryplone.registry 提供了 Plone UI 和 GenericSetup 集成,后者实现了一个用于 Zope 应用程序的配置注册表。有关注册表工作方式的详细信息,请参阅 plone.registry 文档。以下是对 Plone 中常见使用模式的简要概述。

概述

plone.registry 提供的注册表旨在以安全、易于访问的方式存储设置。这使得它非常适合需要管理一些可配置、用户可编辑值的应用程序和附加产品。它旨在替代(功能较弱且用户友好度较低)的 Zope 2 属性表单,以及(安全性较低且访问难度较大)用于管理此类配置的持久本地实用程序。

注册表 不是 一个任意的数据存储。在大多数情况下,您可以在其中存储任何 Python 原始数据,但不能存储更复杂的数据结构或对象。这意味着注册表不会被包的卸载所破坏,并且它可以提供一个简单、通用的用户界面来编辑值。

注册表由 记录 组成。记录由描述记录的 字段 和一个 组成。字段基于备受尊敬的 zope.schema,尽管标准允许的字段类型在模块 plone.registry.field 中定义。(这是部分原因是因为字段定义实际上与记录一起持久化,部分原因是因为 plone.registry 执行一些额外的验证,以确保注册表的一致性)。

可以以编程方式创建记录,但在 Plone 环境中,更常见的是使用 records.xml GenericSetup 语法安装记录。一旦创建记录,就可以使用标准的 Python 字典语法读取和设置其值。访问记录和字段同样简单。

每条记录都有一个唯一名称,该名称必须是一个以拥有该记录的包为前缀的点名称。例如,由包my.package拥有的记录可能具有如my.package.myrecord之类的名称。

截至版本1.6,可以将registry.xml拆分为多个文件;通过控制面板导入和导出注册表条目;以及通过控制面板添加和删除记录。

关于版本说明

  • 版本1.3及以后版本适用于Plone 5。

  • 版本1.2.x适用于Plone 4。

使用方法

本节描述了在Plone环境中最常见地如何使用注册表。有关更多详细信息,请参阅plone.registry文档。

使用 GenericSetup 操作注册表

在编写Plone插件产品时,创建、修改和删除注册表记录的最好方法通常是使用GenericSetup。

创建记录

一旦你决定你需要特定的记录,你需要回答两个问题

  1. 该记录应该叫什么名字?

  2. 它应该保存什么类型的数据?

假设你想要创建一个名为my.package.timeout的记录,存储一个整数。整数由字段类型plone.registry.field.Int描述。几乎所有你在zope.schema中找到的标准字段在plone.registry.field中都有一个等效的字段。唯一的例外是Object,它不受支持。此外,Choice字段仅支持由字符串名称或字符串值列表给出的词汇表。最后,你无法使用constraint属性设置验证函数,尽管其他验证(如最小/最大值)将正常工作。

要安装此类记录,你可以在产品的GenericSetup配置文件中添加一个registry.xml步骤,如下所示

<registry>

    <record name="my.package.timeout">
        <field type="plone.registry.field.Int">
            <title>Timeout</title>
            <min>0</min>
        </field>
        <value>100</value>
    </record>

</registry>

让我们更详细地看看这个例子

  • 声明了一条记录。名称在name属性中给出。

  • 在记录中,我们首先通过给出字段类的完整点名称来定义字段类型。除非你已经安装了提供额外持久字段的第三方包,否则这将是位于plone.registry.field中的一个类,它对应于zope.schema中的一个相应的类。

  • <field />元素内部,我们列出字段的任何必需或可选属性。这使用plone.supermodel语法。从本质上讲,每个允许的字段属性都由一个标签表示(因此可以使用<title />标签设置title属性),属性值作为标签内容给出。如果属性对于字段是必需的,则在这里需要相应的标签。

  • 然后我们设置值。这显然必须是字段类型的有效值。

请注意,<value />是可选的。如果没有给出,字段将默认为它的missing_value,直到它被设置。如果记录已经在其他地方初始化,则<field />是可选的。

大多数字段属性都是如上所示这样的简单标签,字段名称用作标签名称,值字符串用作标签内容。但是,集合字段要复杂一些。一个集合字段(如ListTuple)有一个包含另一个字段的value_type属性。它们的值和默认值是序列。让我们看看一个例子

<record name="my.package.animals">
    <field type="plone.registry.field.Tuple">
        <title>Animals</title>
        <description>A list of cool animals</description>
        <value_type type="plone.registry.field.TextLine" />
    </field>
    <value>
        <element>Dog</element>
        <element>Cat</element>
        <element>Elephant</element>
    </value>
</record>

注意,<value_type/> 标签和外部 <field/> 标签一样,都包含一个 type 属性。在这里,我们展示了没有选项的值类型,但如果需要,可以在 <value_type/> 标签内放置额外的字段属性标签。

还要注意值的表示方式。序列(本例中为元组)中的每个元素都由一个 <element/> 标签表示,元素值作为该标签的内容。

Dict 字段也有 <key_type/> 和键/值对元素。可以按照以下方式配置

<record name="my.package.animalFood">
    <field type="plone.registry.field.Dict">
        <title>Food eaten by animals</title>
        <key_type type="plone.registry.field.TextLine" />
        <value_type type="plone.registry.field.TextLine" />
    </field>
    <value>
        <element key="Dog">Dog food</element>
        <element key="Cat">Cat food</element>
        <element key="Elephant">Squirrels</element>
    </value>
</record>

使用多个注册表 XML 文件

您可以将注册条目存储在单个大型 registry.xml 文件中,而不是使用通用设置从多个文件加载和处理注册条目。这使得管理和组织应用程序和附加组件提供的注册条目更加容易。

您的附加组件应在其配置文件文件夹中包含一个名为 registry 的文件夹,例如 profiles/default/registry。该文件夹中的任何 XML 文件都将按照读取和处理 profiles/default 文件夹中的单个 registry.xml 文件的方式由注册处理。

例如,查看 Castle CMS 在其 profiles/default/registry 文件夹中使用多个 XML 文件。

如果两者都存在,注册将处理 registry.xml 文件和 registry 文件夹的内容。

条件记录

registry.xml 中的可导入记录可以使用 condition 属性标记为条件,该属性支持以下条件值

  • installed my.package,这会导致仅在 python 模块 my.package 可用于导入时导入记录。

  • not-installed my.package,这会导致仅在 python 模块 my.package 不可用于导入时导入记录

  • have my-feature,这会导致仅在 ZCML 功能标志 my-feature 已注册(仅 Zope2)时导入记录

  • not-have my-feature,这会导致仅在 ZCML 功能标志 my-feature 未注册(仅 Zope2)时导入记录

例如,以下位于您的策略产品通用设置配置文件中的 registry.xml 步骤,仅在模块 my.package 可用时导入记录

<registry>
  <records interface="my.package.interfaces.IZooSettings"
           condition="installed my.package">
    <value key="entryPrice">40</value>
    <value key="messageOfTheDay">We've got lions and tigers!</value>
  </records>
</registry>

字段引用

可以定义记录以使用另一个记录的字段。如果您希望一个记录作为另一个记录的可选覆盖使用,这通常很有用。例如

<registry>

    <record name="my.package.timeout">
        <field type="plone.registry.field.Int">
            <title>Timeout</title>
            <min>0</min>
        </field>
        <value>100</value>
    </record>

    <record name="my.package.timeout.slowconnection">
        <field ref="my.package.timeout" />
        <value>300</value>
    </record>

</registry>

在这个例子中,我们定义了具有整数字段的 my.package.timeout 记录。然后我们有一个单独的记录,具有不同的值,称为 my.package.timeout.slowconnection,它使用相同的字段(具有相同的数据类型、验证、标题、描述等)。这避免了需要明确重新定义整个字段。

注意:在这种情况下,该字段实际上是一个 FieldRef 对象。有关详细信息,请参阅 plone.registry 文档。

设置值

一旦定义了记录,就可以使用通用设置如下设置或更新其值

<record name="my.package.animalFood">
    <value purge="false">
        <element key="Squirrel">Nuts</element>
        <element key="Piranha">Other piranha</element>
    </value>
</record>

如果在一个包中定义了记录,而在另一个包中进行了追加或定制,这通常很有用。

在上述示例中,我们使用了 purge 属性。当设置多值字段(如元组、列表、集合或字典)的值时,将此属性设置为 false 会导致列表中的值被添加到现有集合中,而不是完全覆盖集合,就像将 purge 属性设置为 true 或省略时会发生的情况一样。

删除记录

要删除记录,请使用 remove 属性。

<record name="my.package.animalFood" remove="true" />

如果记录不存在,将记录警告,但处理会继续。

根据接口创建记录

在上述示例中,我们直接在注册表中创建单个记录。有时,使用将几个相关字段组合在一起的传统模式接口更容易。正如我们下面将看到的,plone.registryplone.app.registry 为从接口创建的记录组提供了一些额外的功能。

例如,我们可以有一个这样的接口

from zope.interface import Interface
from zope import schema

class IZooSettings(Interface):

    entryPrice = schema.Decimal(title=u"Admission charge")
    messageOfTheDay = schema.TextLine(title=u"A banner message", default=u"Welcome!")

注意我们如何使用标准的 zope.schema 字段。当注册表被填充时,这些字段将被转换为持久字段(通过适配到 plone.registryIPersistentField)。如果不可能,则在导入时将发生错误。

要注册这些记录,我们只需将以下内容添加到 registry.xml

<records interface="my.package.interfaces.IZooSettings" />

这将为每个字段创建一个记录。记录名称是字段的完整点分名称,因此在这种情况下,它们将是 my.package.interfaces.IZooSettings.entryPricemy.package.interfaces.IZooSettings.messageOfTheDay

如果您只想使用接口作为模板,则可以提供 prefix 属性

<records interface="my.package.interfaces.IZooSettings" prefix="my.zoo" />

这将生成名为 my.zoo.entryPricemy.zoo.messageOfTheDay 的字段。

要设置由 指令创建的字段的值,您必须提供与接口上的字段对应的键的 value 条目,如下所示

<records interface="my.package.interfaces.IZooSettings" prefix="my.zoo">
    <value key="entryPrice">40</value>
    <value key="messageOfTheDay">We've got lions and tigers!</value>
</records>

值可以使用上述方法设置,也可以显式声明我们正在设置一个绑定到接口的记录,如下所示

<record interface="my.package.interfaces.IZooSettings" field="entryPrice">
    <value>10.0</value>
</record>

这与以下内容等效

<record name="my.package.interfaces.IZooSettings.entryPrice">
    <value>10.0</value>
</record>

您还可以使用 interface/field 语法从单个字段注册新记录。

最后,如果接口包含不能或不应设置的字段,则可以省略

<records interface="my.package.interfaces.IZooSettings">
    <omit>someField</omit>
</records>

可以重复使用 <omit /> 标签来排除多个字段。

根据接口删除记录

要根据接口删除一组记录,请使用 remove 属性

<records interface="my.package.interfaces.IZooSettings" remove="true" />

如果接口字段中任何记录不存在,将记录警告,但处理会继续。

如果您不想删除,或想排除某些字段,则可以省略

<records interface="my.package.interfaces.IZooSettings" remove="true">
    <omit>someField</omit>
</records>

可以重复使用 <omit /> 标签来排除多个字段。

在 Python 代码中使用注册表

现在我们已经看到了如何通过 GenericSetup 管理记录,我们可以开始在代码中使用注册表中的值。

访问注册表

要获取或设置记录的值,我们首先必须查找注册表本身。注册表注册为本地实用工具,因此我们可以使用以下方式查找它

from zope.component import getUtility
from plone.registry.interfaces import IRegistry

registry = getUtility(IRegistry)

现在可以使用简单的字典语法读取或设置值

timeout = registry['my.package.timeout']

我们还可以使用 get() 在条件性获取值,以及使用 in 检查测试注册表是否包含特定记录。

返回值将与给定名称的记录字段类型一致。它可以以相同的方式设置。

registry['my.package.timeout'] = 120

如果您需要访问底层记录,请使用records属性。

timeoutRecord = registry.records['my.package.timeout']

返回的记录符合plone.registry.interfaces.IRecord接口,并有两个主要属性:value是当前记录值,而field是持久化字段实例。如果记录是从接口创建的,它还将提供IInterfaceAwareRecord,并具有三个附加属性:interfaceName,接口的字符串名称;interface,接口实例本身,以及fieldName,创建此记录的接口中的字段名称。

您可以使用Python的del语句程序性地删除整个记录。

del registry.records['my.package.timeout']

在单元测试中,可能需要程序性地创建一个新的记录。您可以这样操作

from plone.registry.record import Record
from plone.registry import field

registry.records['my.record'] = Record(field.TextLine(title=u"A record"), u"Test")

构造函数接受持久化字段和初始值作为参数。

要程序性地注册接口的记录,我们可以这样做

registry.registerInterface(IZooSettings)

您可以通过传递一个包含省略字段名称的序列的omit参数来省略字段。

有关如何程序性地内省和操作注册记录的详细信息,请参阅plone.registry

在页面模板中访问注册表

您还可以从页面模板中访问注册表。示例TALES表达式

python:context.portal_registry['plone.app.theming.interfaces.IThemeSettings.enabled']

使用记录代理

在上面的示例中,我们使用了字典语法来访问单个记录和值。这始终有效,但对于所谓的接口感知记录(例如,使用<records />语法从接口创建的记录),我们还有另一个选项:记录代理。这允许我们同时查找属于特定接口的所有记录,返回一个提供给定接口并可以像对象一样操作的代理对象,同时仍然连接到底层注册表。

要查找我们的IZooSettings接口的记录代理,我们可以这样做

zooSettings = registry.forInterface(IZooSettings)

现在zooSettings对象提供了IZooSettings。值可以通过属性表示法读取和设置。

zooSettings.messageOfTheDay = u"New message"
currentEntryPrice = zooSettings.entryPrice

在设置值时,它将立即进行验证并写入注册表。如果值不被对应记录的字段允许,则可能引发验证错误异常。

在获取记录代理时,plone.registry将默认验证接口中的每个字段都有记录,如果这不是这种情况,将引发错误。要禁用此检查,您可以进行以下操作

zooSettings = registry.forInterface(IZooSettings, check=False)

在某些情况下这可能很有用,例如当不确定注册表是否已初始化时。您还可以通过传递一个包含字段名称的元组作为omit参数来省略对单个字段的检查。

删除记录

删除记录就像这样简单

del registry.records['plone.app.theming.interfaces.IThemeSettings.enabled']

注册表事件

注册表在修改时发出事件。

  • plone.registry.interfaces.IRecordAddedEvent在记录已添加到注册表时触发。

  • plone.registry.interfaces.IRecordRemovedEvent在记录从注册表中删除时触发。

  • plone.registry.interfaces.IRecordModifiedEvent在记录的值被修改时触发。

您可以注册订阅者以捕获对注册表的任何更改。此外,您可以注册一个只监听与特定接口关联的记录更改的事件处理器。例如

from zope.component import adapter
from plone.registry.interfaces import IRecordModifiedEvent

from logging import getLogger
log = getLogger('my.package')

@adapter(IZooSettings, IRecordModifiedEvent)
def detectPriceChange(settings, event):
    if record.fieldName == 'entryPrice':
        log.warning("Someone change the price from %d to %d" % (event.oldValue, event.newValue,))

有关这些事件类型的详细信息,请参阅plone.registry

创建自定义控制面板

通用控制面板是系统管理员低级配置的工具。如果您正在编写面向系统集成商和内容管理员的包,您可能希望提供更用户友好的控制面板来管理设置。

如果您像上面那样从接口注册您的记录,这个包提供了一个基于 plone.autoformz3c.form 的便利框架,使您轻松创建自己的控制面板。

要使用它,创建一个类似的模块

from plone.app.registry.browser.controlpanel import RegistryEditForm
from plone.app.registry.browser.controlpanel import ControlPanelFormWrapper

from my.package.interfaces import IZooSettings
from plone.z3cform import layout
from z3c.form import form

class ZooControlPanelForm(RegistryEditForm):
    form.extends(RegistryEditForm)
    schema = IZooSettings

ZooControlPanelView = layout.wrap_form(ZooControlPanelForm, ControlPanelFormWrapper)
ZooControlPanelView.label = u"Zoo settings"

ZooControlPanelView 注册为一个视图

<browser:page
    name="zoo-controlpanel"
    for="Products.CMFPlone.interfaces.IPloneSiteRoot"
    permission="cmf.ManagePortal"
    class=".controlpanel.ZooControlPanelView"
    />

然后在 Plone 控制面板中安装它,使用您的 GenericSetup 配置文件中的 controlpanel.xml 导入步骤

<?xml version="1.0"?>
<object
    name="portal_controlpanel"
    xmlns:i18n="http://xml.zope.org/namespaces/i18n"
    i18n:domain="my.package">

    <configlet
        title="Zoo settings"
        action_id="my.package.zoosettings"
        appId="my.package"
        category="Products"
        condition_expr=""
        url_expr="string:${portal_url}/@@zoo-controlpanel"
        icon_expr="string:${portal_url}/++resource++my.package/icon.png"
        visible="True"
        i18n:attributes="title">
            <permission>Manage portal</permission>
    </configlet>

</object>

icon_expr 属性应提供一个图标 URL。这里,我们假设已注册一个名为 my.package 的资源目录,并包含文件 icon.png。您也可以省略图标。

使用配置注册表控制面板

通过控制面板查看和编辑记录

此包在 Plone 的“站点设置”中提供了“配置注册表”控制面板。在这里,您可以查看所有注册表记录,可以使用大小写敏感的过滤器字段搜索记录,并可以根据其前缀(例如“IDiscussionSettings”,“plone.app.caching”)选择记录集。

显示注册表记录的名称、标题、描述、数据类型和当前值。

https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_screenshot.jpg

配置注册表控制面板

如果您点击一个记录,将出现一个编辑表单,允许您更改其值。

https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_edit_record_screenshot.jpg

如何更改注册表记录的值

通过控制面板导出和导入记录

您可以使用配置注册表控制面板的“导出”选项卡将整个注册表导出到单个 XML 文件。当您点击“立即导出”按钮时,名为 registry.xml 的文件将被下载到您的计算机。

https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_export_screenshot.jpg

如何导出整个注册表

要导入注册表条目,请使用配置注册表控制面板的“导入”选项卡,使用“选择文件”按钮从您的计算机中选择包含注册表条目的 XML 文件,然后按“导入文件”按钮。

https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_import_screenshot.jpg

如何导入注册表文件

通过控制面板添加和删除记录

您可以使用配置注册表控制面板的“添加新记录”选项卡添加单个注册表记录。

输入注册表记录的名称、(可读)标题、选择数据类型,并根据需要勾选“必需”框(如果记录必须具有值)。然后按“添加字段”按钮。

https://raw.githubusercontent.com/plone/plone.app.registry/master/docs/configuration_registry_add_record_screenshot.jpg

控制面板小部件设置

plone.app.registry 提供了一个 RegistryEditForm 类,它是 z3c.form.form.Form 的子类。

RegistryEditForm 有两个可以覆盖的方法来决定在控制面板表单中使用哪些小部件以及如何使用。

  • updateFields() 可以设置小部件工厂,即要使用的小部件类型

  • updateWidgets() 可以更改小部件属性和小部件值,这些值将显示给用户

示例(《collective.gtags》项目 controlpanel.py)

class TagSettingsEditForm(controlpanel.RegistryEditForm):

    schema = ITagSettings
    label = _(u"Tagging settings")
    description = _(u"Please enter details of available tags")

    def updateFields(self):
        super(TagSettingsEditForm, self).updateFields()
        self.fields['tags'].widgetFactory = TextLinesFieldWidget
        self.fields['unique_categories'].widgetFactory = TextLinesFieldWidget
        self.fields['required_categories'].widgetFactory = TextLinesFieldWidget

    def updateWidgets(self):
        super(TagSettingsEditForm, self).updateWidgets()
        self.widgets['tags'].rows = 8
        self.widgets['tags'].style = u'width: 30%;'

故障排除

以下部分描述了一些常见的错误以及如何解决它们的建议。

安装了必需的依赖扩展

在您可以使用 plone.app.registry 框架使用任何控制面板配置小部件之前,必须在 Plone 站点上安装 plone.app.z3cform(Plone z3c.form 支持)和 plone.app.registry(配置注册表)附加组件。

KeyError: 没有记录的字段

示例回溯

Module plone.app.registry.browser.controlpanel, line 44, in getContent
  Module plone.registry.registry, line 56, in forInterface
KeyError: 'Interface `mfabrik.plonezohointegration.interfaces.ISettings` defines a field `username`, for which there is no record.'

这意味着

  • 您的 registry.xml 没有为您的配置密钥定义默认值

  • 您已更改配置模式,但尚未重新运行附加组件安装程序以初始化默认值

  • 您可能需要使用与您的设置中接口名称相同的前缀

    <records prefix="mfabrik.plonezohointegration.interfaces.ISettings" interface="mfabrik.plonezohointegration.interfaces.ISettings">

变更日志

2.0.5 (2024-05-30)

错误修复

  • 删除重复的 <article id=”content”> [@szakitibi] (#84)

  • 修复当不删除记录时误导性的门户消息 @gforcada

2.0.4 (2023-12-14)

错误修复

  • 在记录模板中禁用右侧列的可见性 [1letter] (#71)

  • 修复删除注册表记录时的模板错误。 [maurits] (#76)

2.0.3 (2023-10-18)

内部

  • 构建包需要 setuptools 68.2+。[plone 开发者] (18d04723)

  • 更新配置文件。[plone 开发者] (cfffba8c)

2.0.2 (2023-04-15)

内部

  • 更新配置文件。[plone 开发者] (5623f8b3)

2.0.1 (2022-12-10)

错误修复

  • 修复响应式表格。[petschki] (#64)

2.0.0 (2022-11-30)

错误修复

  • 最终发布。[gforcada] (#600)

2.0.0a9 (2022-05-09)

破坏性更改

  • isort, black, pyupgrade。使用 plone.base 和依赖关系清理。[jensens] (#63)

错误修复

  • 在创建 a 记录时,键中允许最多有一个连字符。[pbauer] (#62)

2.0.0a8 (2022-04-04)

破坏性更改

  • 删除 registry.js,现在位于 mockup 中。[MrTango] (#57)

2.0.0a7 (2022-01-25)

错误修复

  • 结构化表单描述和显式宏调用。[petschki] (#60)

2.0.0a6 (2022-01-19)

错误修复

  • 忽略注册目录中的点文件。[iham] (#3990)

2.0.0a5 (2021-10-16)

错误修复

  • 添加缺失的 i18n:translate 标签。[erral] (#56)

2.0.0a4 (2021-09-15)

错误修复

  • 移除与 Products.CMFPlone 的循环依赖。[sneridagh] (#54)

2.0.0a3 (2021-09-01)

错误修复

  • 修复一个问题,该问题阻止了包含“/”在名称中的注册记录的编辑。[ale-rt] (#51)

2.0.0a2 (2021-08-04)

新功能

  • 为 plone.registry.field.JSONField 添加 JSONField 处理器 - 添加组件 JSONFieldHandler - 添加导入和导出 JSONField 的测试 - 添加 towncrier 消息。[1letter] (#48)

2.0.0a1 (2021-04-20)

破坏性更改

  • 更新为 Plone 6,使用 Bootstrap 标记。[jensens, petschki, agitator] (#45)

1.7.8 (2021-01-08)

错误修复

  • 使用更好的导入和导出步骤的标题和描述。[jensens] (#1)

1.7.7 (2020-09-07)

错误修复

  • 使配置导出页面上的接口列表可见。[jensens] (#41)

1.7.6 (2020-04-20)

错误修复

  • 小型的打包更新。 (#1)

1.7.5 (2019-05-01)

错误修复

  • Python 3 中记录表中损坏的值。[petschki] (#36)

1.7.4 (2019-03-03)

错误修复

  • 修复使用 Generic Setup 导出注册表的错误。[pbauer] (#34)

1.7.3 (2019-02-13)

错误修复

  • 修复一些弃用警告。[gforcada] (#32)

1.7.2 (2018-06-19)

新功能

  • 为注册表记录添加了一个实用的 XML 导出器,该格式旨在用于插件或策略配置文件。[jensens]

1.7.1 (2018-04-08)

错误修复

  • Python 2/3 兼容的导入。[pbauer]

1.7 (2018-02-04)

新功能

  • 将文件名跟踪信息添加到导入器中,以便于调试。[jensens]

错误修复

  • Python 2/3 兼容的导入。[pbauer]

  • 对注册表导入进行小型重构(DRY)。[jensens]

1.6.1 (2017-06-04)

错误修复

  • 移除 unittest2 依赖项。[kakshay21]

1.6 (2017-05-23)

新功能

  • 能够将 registry.xml 文件分割到子目录 registry 中的多个文件。[vangheem]

  • 添加通过控制面板导入/导出记录的功能。[vangheem]

  • 添加通过控制面板添加新记录的功能。[vangheem]

  • 添加通过控制面板删除记录的功能。[vangheem]

  • 记录新功能。[tkimnguyen]

1.5 (2016-10-23)

新功能

  • 在 registry.xml 中添加对 havehave-not 导入条件的支持。[datakurre]

1.4 (2016-09-14)

新功能

  • 在 registry.xml 条目中添加对可选条件属性的支持,以允许条件导入记录。条件本身不导入(也不导出)。[datakurre]

1.3.12 (2016-06-27)

新功能

  • 将记录名称的跟踪信息添加到导入器中,以便于调试。[jensens]

1.3.11 (2016-03-31)

新功能

  • 对于 ControlPanelFormWrapper@@configuration_registry,从最近的站点构建到 @@overview-controlpanel 的基本 URL。这为在具有本地注册表的子站点上调用控制面板提供了更多灵活性,而在标准的 Plone 安装中,控制面板仍然绑定到门户 URL。[thet]

1.3.10 (2016-02-27)

修复

  • 在模态中保存注册表值不再重新加载整个页面。[vangheem]

1.3.9 (2016-02-20)

修复

  • 记录如何使用 Python 删除注册记录。[gforcada]

1.3.8 (2016-02-08)

新功能

  • 更新以与新 plone.batching pagination 选择器以及旧的一个兼容。[davilima6]

1.3.7 (2015-11-28)

修复

1.3.6 (2015-10-27)

新功能

  • 在控制面板搜索时显示加载图标。[vangheem]

修复

  • 清理:pep8、utf8 标题、可读性等。[jensens]

  • 使我们的 plone.app.registry 导入步骤依赖于 typeinfo。门户类型可能用于词汇表。例如,您可能会在将尚未安装的类型添加到 types_not_searched 时收到错误。修复 https://github.com/plone/Products.CMFPlone/issues/1118 [maurits]

1.3.5 (2015-09-20)

  • 修复按钮的样式对齐问题。[sneridagh]

1.3.4 (2015-09-14)

  • 修复注册表 JavaScript,使其不自动展开搜索字段,因为它运行不好。[vangheem]

1.3.3 (2015-09-08)

  • 修复控制面板中的模态框 [vangheem]

1.3.2 (2015-08-20)

  • 结构 关键字添加到返回注册表条目描述的 TALES 表达式。这确保了描述被正确转义,HTML 实体不会出现在描述中。 [pigeonflight]

1.3.1 (2015-07-18)

  • 将配置小部件的分类更改为“plone-advanced”。 [sneridagh]

  • 使网站上的配置小部件标题保持一致,首字母大写。 [sneridagh]

1.3.0 (2015-03-13)

  • 修复控制面板过滤以与 plone 5 和 patterns 一起工作 [vangheem]

1.2.3 (2013-05-23)

1.2.2 (2013-01-13)

  • 将值字典包装在 Acquisition 中,以便小部件获得有用的上下文。 [malthe]

  • 允许在 registry.xml 中使用 XML 注释 [gweis]

  • 允许在 dict.value_type == list 注册导入中使用 purge=false。 [vangheem]

1.2.1 (2012-10-16)

  • 统一控制面板 HTML 结构。 [TH-code]

  • 修复 jQuery 选择器 [vangheem]

  • 更好地处理没有接口的字段的控制面板前缀。 [vangheem]

1.2 (2012-08-29)

  • 控制面板:不再因为缺少接口而导致“AttributeError: ‘NoneType’ object has no attribute ‘split’”。 [kleist]

  • 在 GenericSetup 中允许通过接口删除记录。 [mitchellrj]

  • 弃用 GenericSetup 中 <record> 和 <records> 节点的 ‘delete’ 属性,改为使用 ‘remove’。 [mitchellrj]

  • 在取消控制面板编辑表单后显示“更改已取消。”消息,以符合 plone.app.controlpanel 的行为。 [timo]

  • 在控制面板编辑表单提交时将用户重定向到表单本身,以符合 plone.app.controlpanel 的行为。 [timo]

1.2a1 (2012-06-29)

  • 使用 lxml 而不是 elementtree。 [davisagli]

  • 删除未使用的 zope.app.component 导入。 [hannosch]

  • 改进控制面板视图。 [vangheem]

1.1 (2012-04-15)

  • 添加对注册中导入的字符串国际化的支持。 [davisagli]

1.0.1 (2011-09-19)

1.0 - 2011-05-13

  • 1.0 最终发布版。 [esteele]

  • 添加 MANIFEST.in。 [WouterVH]

1.0b6 - 2011-04-06

  • 添加 collectionOfInterface 导出/导入支持。 [elro]

1.0b5 - 2011-02-04

  • 声明 Products.CMFCore zcml 依赖关系,以修复 Zope 2.13 下的 zcml 加载。 [elro]

  • 添加对 <field ref=”…” /> 语法的支持以导入 FieldRefs。需要 plone.registry >= 1.0b4。 [optilude]

1.0b4 - 2011-01-18

  • 将控制面板插槽切换到 prefs_configlet_main。 [toutpt]

1.0b3 - 2011-01-04

  • 依赖 Products.CMFPlone 而不是 Plone。 [elro]

  • 在控制面板视图中显示状态消息和后退链接。 [timo]

  • 使用 plone 域翻译此包的消息。 [vincentfretin]

  • 为 controlpanel.RegistryEditForm 添加前缀支持 [garbas]

1.0b2 - 2010-04-21

  • 确保仅从 XML 中导入的字段(没有接口)有一个名称。这修复了编辑表单中断的问题。 [optilude]

  • 将控制面板链接大写,以符合 Plone 标准。 [esteele]

  • 在成功提交后,覆盖现在将重新加载注册列表。 [esteele]

  • 将接口名称而不是接口本身传递给 <records> 导入器。 [esteele]

  • 修改 JS 覆盖调用,以包含 #content div。 [esteele]

  • 如果 <value> 元素包含 key 属性,则允许在 <records> 中使用 <value> 元素。这使用记录导入器在创建后设置值。 [MatthewWilkes]

  • 为 <records> 导入器添加前缀属性,以利用 plone.registry 的接口作为模板的图案。 [MatthewWilkes]

  • 改进了注册记录控制面板的外观和感觉。 [optilude]

  • 添加了如何为注册插件自定义小部件的解释 [miohtama]

1.0b1 - 2009-08-02

  • 使用 plone.registry 1.0b1 进行测试 [optilude]

1.0a3 - 2009-07-12

  • 赶上 plone.supermodel 的 API 的变化。 [optilude]

1.0a2 - 2009-04-17

  • 修复ZCML注册中的错别字;元组中包含一个‘p’。这修复了元组字段的导出导入。[MatthewWilkes]

  • 添加缺少的handlers.zcml包含文件 [MatthewWilkes]

1.0a1 - 2009-04-17

  • 初始发布

项目详情


发布历史 发布通知 | RSS订阅

下载文件

下载适合您平台文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源代码发行版

plone_app_registry-2.0.5.tar.gz (369.1 kB 查看散列值)

上传时间 源代码

构建发行版

plone.app.registry-2.0.5-py3-none-any.whl (45.0 kB 查看散列值)

上传时间 Python 3

支持