跳转到主要内容

内容类型框架,支持文件系统代码和TTW(Zope/CMF/Plone)

项目描述

Dexterity

“相同,但不同”

Dexterity是一个构建内容类型(通过Web和作为文件系统代码)的系统。它针对Plone,尽管这个包应该可以与普通的Zope + CMF系统一起使用。

关键用例

Dexterity希望使某些事情变得非常简单。这些包括

  • 通过Web完全通过Web创建“真正的”内容类型,而无需了解编程。

  • 作为业务用户,使用可视化或通过Web工具创建模式,并通过适配器、事件处理器和由Python程序员在文件系统中编写的其他Python代码对其进行增强。

  • 快速轻松地在文件系统代码中创建内容类型,而不会失去在需要时对类型的任何方面及其操作进行自定义的能力。

  • 支持通用的“行为”,这些行为可以声明性地在自定义类型上启用。行为可以是诸如标题到ID命名、对锁定或版本控制的支持或具有相关UI元素的标准元数据集。

  • 轻松打包和分发通过Web、文件系统或两者的组合定义的内容类型。

哲学

Dexterity是根据一个特定的哲学设计的。这可以总结如下

重用而非创新

尽可能,Dexterity应该重用已经存在的组件和技术。更重要的是,Dexterity应该重用其他地方存在的概念。应该通过类比很容易学习Dexterity,并且可以使用熟悉的API和技术与Dexterity类型一起工作。

小巧而非庞大

不要框架。Dexterity由许多专用包组成,每个包都是独立测试和可重用的。此外,包应尽可能少地依赖,并且应明确声明其依赖项。这有助于保持设计清洁和代码可管理。

自然交互而非过度通用

Dexterity的设计是由几个用例(参见docs/Design.txt)驱动的,这些用例表达了我们希望人们如何使用Dexterity的方式。最终目标是使开始变得容易,但也可以通过逐步学习和自然交互模式轻松地从初始原型发展到复杂的一组类型及其相关行为。Dexterity旨在考虑其用户——无论是业务分析师、轻度集成商还是Python开发者,无论他们是新手还是经验丰富——并通过明显、文档完善、自然的交互模式明确地为他们提供服务。

真实代码而非生成代码

生成的代码难以理解,当其工作不符合预期时调试也相当困难。几乎从未有过在 Python 代码中胡乱写方法或 'exec' 字符串的必要。

在旧的 Zope 2 上使用 ZCA

应尽可能多地将组件与普通的 ZCA(Zope 组件架构,起源于 Zope 3 的 zope.* 包)一起工作。尽管 Dexterity 并不假装与非 CMF 系统兼容,即使在有 Zope 2、CMF 或 Plone 依赖的情况下,它们也应尽可能遵循 ZCA 技术和最佳实践。许多操作(例如,在文件夹中管理对象、创建新对象或通过定义的架构操作对象)在 ZCA 中的设计比在 Zope 2 中更好。

在新的范式上使用 Zope 概念

我们希望 Dexterity 具有类似于“Zope”的风格(实际上,“ZCA”的风格)。Zope 是一个成熟、设计良好(嗯,大部分)且经过实战检验的平台。如果可能,我们不想发明全新的范式和技术。

自动测试优于美好的愿望

“一切”都应该由自动测试来覆盖。Dexterity 必然有很多可移动的部分。未测试的可移动部分往往容易松动并掉落在人们头上。没有人喜欢这样。

这一切都是关于什么的?

在清理了所有杂七杂八之后,让我们更详细地了解一下 Dexterity 系统中“内容类型”的构成。

模型

Dexterity 的“模型”描述了一个类型的架构以及与这些架构相关的元数据。架构只是一系列可用于渲染添加/编辑表单并内省给定类型对象的字段。元数据存储可以通过组件架构进行扩展。典型的元数据形式包括 UI 提示,例如指定渲染特定字段时使用的控件类型,以及每个字段的权限设置。

模型也用 XML 描述。虽然运行时它是提供来自 plone.supermodel 的 IModel 接口的对象的一个实例。模型中的架构是与 zope.schema 字段接口。

如果通过网络创建类型,模型可以仅作为 ZODB 中的数据存在。或者,它可以从文件中加载。XML 表示旨在易于阅读和自文档化。它还考虑了像 AGX 这样的工具,这些工具可以从视觉表示生成模型。

架构

所有内容类型至少有一个(未命名的)架构。架构简单地是一个包含 zope.schema 字段的接口。架构可以通过 Python 代码指定(在这种情况下,它仅通过名称引用),或者可以从 XML 模型加载。

未命名的架构也称为 IContentType 架构。在这种情况下,架构接口将提供 zope IContentType 接口。这意味着如果您在 Dexterity 内容对象上调用 queryContentType(),您应该得到其未命名的架构,并且该架构应由查询的对象提供。因此,该对象将直接支持架构承诺的属性。这使得 Dexterity 内容对象“Pythonic”且易于处理。

当然,所有内容对象都是特定类的实例。很容易提供自己的类,并且 Dexterity 提供了方便的基类供您使用。然而,许多类型可能根本不需要一个类。相反,它们将使用标准的 Dexterity “Item” 和 “Container” 类。

Dexterity 的内容工厂将使用类型的内容架构中的字段初始化这些类中的一个对象。工厂将确保对象提供相关的接口,包括架构接口本身。

向Dexterity内容对象添加行为和逻辑的最佳方式是通过适配器。在这种情况下,你可能需要一个文件系统版本的架构接口(如果你愿意,它仍然可以从XML加载,但将具有一个带有真实模块路径的接口)来注册组件。

工厂

Dexterity内容是使用标准的zope IFactory命名实用工具构建的。按照惯例,工厂实用工具的名称与内容类型的portal_type相同。

当创建Dexterity FTI(工厂类型信息,见下文)时,除非已经存在同名工厂,否则将注册一个适当的工厂作为本地实用工具。

默认工厂能够初始化一个通用的ItemContainer对象,以展示内容类型架构,并具有类型模型中指定的安全和其他方面。如果你愿意,可以使用这个,也可以提供自己的工厂。

视图

Dexterity默认将为每种类型创建一个:- 添加视图(作为本地实用工具注册,因为它在确定要渲染哪些字段时需要考虑内容类型的portal_type)和一个- 编辑视图(作为通用、全局视图注册,它在运行时检查上下文的portal_type)。- 还存在一个默认的主视图,它只是输出上下文上设置的字段。

要注册新视图,你通常需要一个文件系统架构接口。然后你可以像通常那样为该接口注册视图。

如果你需要覆盖默认的添加视图,创建一个与内容类型的portal_type对应的IAdding视图。这将防止Dexterity在创建FTI时注册一个同名本地视图。

工厂类型信息(FTI)

FTI保存有关内容类型的各种信息。Dexterity框架执行的许多操作首先通过查找类型的FTI来找出有关类型的信息。

FTI是存储在ZMI中portal_types中的对象。大多数设置都可以通过Web进行更改。有关更多信息,请参阅IDexterityFTI接口。

当创建Dexterity FTI时,事件处理程序将创建一些本地组件,包括为新类型创建的工厂实用工具和添加视图。FTI本身也被注册为命名实用工具,以便可以使用类似以下语法进行查找:

getUtility(IDexterityFTI, name=portal_type)

FTI也可以使用GenericSetup完全导入和导出。因此,创建和分发内容类型的最简单方法是创建一个新的FTI,设置一些属性(包括有效的XML模型,如果没有文件或架构接口可以使用,则可以输入TTW),并将其导出为GenericSetup扩展配置文件。

行为

行为是一种写入可重用功能块的方法,可以在每个类型的基础上打开或关闭。示例可能包括常见的元数据,或常见的功能,如锁定、标记或评分。

行为使用plone.behavior包实现。有关编写自己的行为的更多详细信息,请参阅其文档。

在Dexterity中,行为可以将字段“注入”到标准的添加和编辑表单中,并可能为新创建的对象提供标记接口。请参阅example.dexterity包中的行为示例,该示例提供表单字段。

在使用时,行为本质上只是一个适配器,它只有在行为在要适配的对象的FTI中启用时才会出现。因此,如果你有一个由my.package.IMyBehavior描述的行为,你通常将通过执行以下操作与此行为交互

my_behavior = IMyBehavior(context, None)
if my_behavior is not None:
    ...

给定类型的启用行为保存在FTI中,作为点分隔的接口名称列表。

Dexterity生态系统

Dexterity系统由多个包组成,其中大多数可以独立重用。此外,Dexterity使用Zope和CMF的许多组件。

最重要的包是

plone.dexterity(CMF)

本包 定义了FTI和内容类。它提供基本视图(基于z3c.form的表单),处理安全等问题。它还提供组件来编排上述包提供的各种功能,以便将Dexterity系统整合在一起。

plone.behavior(ZCA)

支持“条件”适配器。产品作者可以编写并注册一个通用的行为,通过简单的适配器实现。适配器将看起来已注册在具有指定行为的类型上。

Dexterity以这种方式将其连接起来,使得启用的行为列表被存储为FTI中的属性。这使得通过网页或使用GenericSetup在安装时添加/删除行为变得很容易。

plone.folder(CMF)

这是一个基于有序的BTree文件夹实现,在文件夹内部使用ZCA字典样式语义来管理内容项。标准的Dexterity 'Container'类型使用plone.folder作为其基础。

plone.autoform(CMF,z3cform)

包含用于根据存储在模式接口上的标记值构建表单的辅助函数。

plone.supermodel(ZCA)

支持从/到XML的接口解析和序列化。XML格式直接基于描述zope.schema类型字段的接口。因此,它可以很容易地扩展到新的字段类型。此外,zope.schema包中的接口文档也适用于XML格式。

Supermodel可以通过适配器和XML命名空间进行扩展。plone.dexterity使用它来允许将安全和UI提示作为元数据嵌入XML模型中。

plone.alterego(Python)

支持动态模块,可以在运行时创建对象。Dexterity使用此模块为只通过网页存在的类型生成“真实”接口。这使得这些类型具有适当的IContentType模式。它还允许为该接口注册本地适配器(例如,一个通过网页定义模板的自定义视图)。

请注意,如果类型使用文件系统接口(无论是手动编写还是从XML模型加载),则不使用此模块。

plone.app.dexterity(Plone)

本包包含Dexterity的所有Plone特定方面,包括Ploneish UI组件、行为和默认设置。

开发者手册

Dexterity开发者手册是一份完整的文档,包含实际示例,是官方Plone文档的一部分。

源代码

贡献者请阅读文档为Plone做出贡献

源代码位于GitHub上的Plone代码仓库

更改日志

3.0.6 (2024-04-25)

错误修复

  • 修复测试以与Zope master一起工作,它期望请求具有ensure_publishable方法。[maurits] (#1202)

3.0.5 (2024-02-27)

错误修复

  • 修复在遍历WebDAV资源并使用虚拟主机monster时发生的遍历错误。[ale-rt] (#195)

3.0.4 (2024-01-22)

内部

  • 更新配置文件。[plone devs] (6e36bcc4)

3.0.3 (2023-09-01)

错误修复

内部

  • 更新配置文件。[plone devs] (55bda5c9)

3.0.2 (2023-03-14)

错误修复

  • 已删除类型错误并返回空值。在此代码修改版本中,如果没有找到主字段适配器,则将字段名和字段属性设置为None。值属性检查字段属性是否为None,如果是,则返回None,而不是抛出错误。[Coder-aadarsh] (#59)

内部

  • 更新配置文件。[plone devs] (13d8d6c0)

测试

  • 修复webdav测试,使其与Zope 5.8和master分支兼容。[maurits] (#844)

3.0.1 (2023-02-08)

错误修复

  • 使用plone/meta配置包。[gforcada] (#1)

3.0.0 (2022-12-02)

错误修复

  • Plone 6.0.0的最终版本。[#600]

3.0.0b2 (2022-08-30)

错误修复

  • 使用最新的plone/code-quality 2.0.0检查代码质量。[maurits+erico] (#171)

3.0.0b1 (2022-07-14)

破坏性更改

  • 移除长期废弃的导入和回退。[jensens, maurits] (#161)

  • 仅支持Python 3.7+,放弃对Python 2的支持。[jensens, maurits] (#161)

错误修复

  • 为按钮使用Bootstrap 5类。[jensens] (#161)

3.0.0a3 (2022-05-24)

错误修复

  • 向默认操作添加缺失的icon_expr。[agitator] (#167)

3.0.0a2 (2022-01-25)

错误修复

  • 对于行为,始终使用lines属性,不再使用已废弃的ulines。这是上一版本改进的一部分。是问题3305的一部分。[maurits] (#3305)

3.0.0a1 (2022-01-07)

破坏性更改

  • Plone 6:始终使用lines属性为行为,不再使用已废弃的ulines。这是问题3305的一部分。[maurits] (#3305)

2.10.5 (2021-11-25)

错误修复

  • plone.synchronize的单一简单synchronized函数集成到plone.dexterity中,它是唯一的消费者。还移动了测试。删除了一个依赖项和一个需要照顾的包。[jensens] (#157)

  • 避免在方法上设置默认值。如果Schema Interface中有一个方法,即用作其他字段的约束等,则default_from_schema函数会在尝试为其获取默认值时遇到它。[gforcada, jensens] (#158)

  • 修复在Python 2中生成的方案名称。[wesleybl] (#159)

2.10.4 (2021-10-07)

错误修复

  • 在查找FTI时捕获最大递归错误。[petschki] (#155)

  • 通过简化对utilities属性访问的访问来优化本地组件访问。[jensens] (#156)

2.10.3 (2021-09-01)

错误修复

  • 修复ft._updateProperty,使其在接收到空值时不破坏。这发生在DX FTI是Generic Setup基本导入的一部分时。更新更多代码以在Plone站点是dexterity项时工作。[jaroel] (#85)

  • Codestyle black和isort [jensens] (#154)

2.10.2 (2021-07-29)

错误修复

  • 修复Python 3中的内容导出/导入。修复了问题124。还修复了与最新Products.GenericSetup 2.1.2结合的测试。[maurits] (#124)

2.10.1 (2021-06-30)

错误修复

  • 正式支持Plone 6.0和Python 3.9。没有代码更改。[maurits] (#1)

2.10.0 (2020-10-12)

新功能

  • 确保在更改时所有ZEO客户端上的动态模式都得到更新。[@avoinea] (#136)

错误修复

  • 修复测试以干净地与zope.interface一起工作。接口是根据它们的名称和模块进行散列的。因此,这些本地IBlank接口将按相同的方式散列,并用于zope.interface的_dependents的目的。因此,在测试中,必须在同一模块中使用相同名称的模拟接口。[jensens] (#135)

  • 在Python 3上使用unittest中的mock [ale-rt] DefaultReadFile正确实现了IStreamIterator接口 [ale-rt] (#138)

  • 当webdav库可导入时恢复webdav支持。[ale-rt] (#141)

2.9.8 (2020-09-28)

错误修复

  • 在运行Zope 5的测试时修复了缺失的ISiteRoot实用程序。[maurits] (#680)

  • 从容器的content-core视图中删除了列出宏。它是损坏的。现在我们显示与项目相同的内容:只有字段。修复了问题3177。[maurits] (#3177)

2.9.7 (2020-04-20)

错误修复

  • 更新测试以与Zope 4.2.1兼容。[jensens] (#421)

2.9.6 (2020-03-13)

错误修复

  • 修复了Python 3.6(没有系统区域设置)的包安装错误。请参阅coredev问题642。[maurits] (#642)

2.9.5 (2019-12-30)

错误修复

  • 通过移除不必要的同步,加快并行线程执行速度(约1.6倍)[jensens] (#123)

2.9.4 (2019-12-26)

错误修复

  • 根据请求使缓存的FTI失效,以允许复杂/长时间运行的自动安装。[jensens]

2.9.3 (2019-12-23)

错误修复

2.9.2 (2019-10-12)

错误修复

  • 当在FTI中记录不存在的行为时,改进了发出的调试信息。[ale-rt] (#109)

  • 避免查找空名称的行为。[ale-rt] (#110)

  • 通过因子~1.5增强模式缓存性能。[jensens] (#113)

  • 增强模式缓存和可分配性能。[jensens] (#115)

  • 性能提升:在内容上优化属性的预过滤。__getattr__。过滤出所有权限(以_Permission结尾)和一些portal-tools。也跳过了经常被称为获取函数的函数。[jensens] (#116)

  • _default_from_schema中避免使用提供的函数。[jensens] (#117)

2.9.1 (2019-05-21)

错误修复

  • 修复Python 3上ZServer与WebDAV兼容性问题。[datakurre] (#102)

  • 避免将Unicode数据传递给WebDAV消息解析器。[Rotonen] (#103)

2.9.0 (2019-05-01)

新功能

  • 避免查找其他常用属性的开销。[gforcada] (#98)

  • 将容器属性添加到AddForm中,以简化子类中的目标容器选择。[jensens] (#101)

错误修复

  • 将作为弃用警告的警告转换为真正的DeprecationWarning,遵循弃用指南最佳实践。[jensens] (#95)

  • 修复了ObjectEvent的DeprecationWarning。[maurits] (#96)

2.8.0 (2019-02-08)

新功能

  • 实现getSize方法,以汇总具有getSize方法的字段值的总和。[davisagli] (#89)

错误修复

  • 其他Python 3兼容性修复。[ale-rt] (#90)

  • 将PathReprProvider作为容器的基类,以恢复原始__repr__行为,而不是持久化Persistent的新__repr__。[PathReprProvider需要位于CMFOrderedBTreeFolderBase之前(它继承自OrderedBTreeFolderBase > BTreeFolder2Base > Persistent)]。[pbauer] (#93)

  • 修复了由于检查_id变化而导致的测试问题。我们需要“访问内容信息”权限。(#2582)

  • 删除弃用警告,请参阅https://github.com/plone/Products.CMFPlone/issues/2667 (#2667)

2.6.1 (2018-09-23)

新功能

  • ZServer现在是可选的。[pbauer]

错误修复

  • 其他Python 3兼容性修复。[ale-rt, pbauer, jensens]

2.6.0 (2018-04-03)

新功能

  • 将翻译移动到plone.app.locales。[erral]

错误修复

  • 其他Python 3兼容性修复。[pbauer]

2.5.5 (2018-02-05)

错误修复

  • 为Python 2/3兼容性做准备。[pbauer]

2.5.4 (2017-11-24)

错误修复

  • 修复Zope 4上的测试。[davisagli]

2.5.3 (2017-10-17)

错误修复

  • 为“无法解析模式”警告提供更多上下文。[gotcha]

2.5.2 (2017-06-03)

错误修复

  • 修复新zope.interface不接受None作为值的问题。[jensens]

2.5.1 (2017-02-27)

错误修复

  • 确保当通过添加表单添加项时,所有字段都初始化为其默认值。这对于具有默认Factory的字段很重要,该Factory会随时间变化(例如默认为当前日期)。[davisagli]

2.5.0 (2017-02-12)

破坏性更改

  • 在调用描述的DC元数据访问器时,从输出中删除换行符。这使得在plone.app.dexterity中删除描述行为设置器的换行符变得不再必要。[thet]

错误修复

  • 放宽ZMI选项卡测试,以兼容Zope 4。[davisagli]

2.4.5 (2016-11-19)

新功能

  • 删除了对plone.mocktestcase的测试依赖。[davisagli]

2.4.4 (2016-09-23)

错误修复

  • 修复了复制具有AT子项的DX容器时出现的错误,这导致子项未正确更新UID。[jone]

2.4.3 (2016-08-12)

错误修复

  • 使用zope.interface装饰器。[gforcada]

2.4.2 (2016-05-12)

修复

  • 从Products.PloneHotfix20160419添加了安全声明。[maurits]

2.4.1 (2016-02-27)

不兼容性

  • 如果内容已设置创建者,则addCreator不应添加。这防止了每个内容的编辑都将添加到对象的创建者列表中。[vangheem]

2.4.0 (2016-02-17)

  • 添加了俄语翻译。[serge73]

  • 更新到pytz 2015.7和DateTime 4.0.1,并依赖于它们。[jensens]

修复

  • 跳过了在 Zope 4 中存在隔离问题的测试 test_portalTypeToSchemaName_looks_up_portal_for_prefixtest_getAdditionalSchemata。 [pbauer]

  • 使 utils/datify 与更新的 DateTime 和 pytz 一起工作。调整测试以反映变化。 [jensens]

  • 修复:不使用 Acquistion API 复制 aq_base 导致了 AttributeError,这在调用 hasattr 时被掩盖,导致得出错误结论。 [jensens]

  • 使修改测试更稳定。 [do3cc]

2.3.7 (2016-01-08)

修复

  • 当 schema_policy 名称更改时同步模式(问题 #44) [sgeulette]

  • 纠正了日期比较测试(避免 1 小时偏移) [sgeulette]

2.3.6 (2015-10-28)

修复

  • 不再依赖于来自 Persistence.Persistent 的已弃用 bobobase_modification_time。 [thet]

2.3.5 (2015-09-20)

  • 使用注册查找 types_use_view_action_in_listings。 [esteele]

  • 如果请求提供 IDeferSecurityChecks,则不要在 AddForm.update() 中检查类型约束。 [alecm]

2.3.4 (2015-08-14)

  • 避免关于 portalTypeToSchemaName 的我们自己的 DeprecationWarning。 [maurits]

  • 在 WebDAV 上传时设置标题 [tomgross]

2.3.3 (2015-07-29)

  • 此版本仍然是 Plone 4.3.x 兼容的。较新版本仅与 Plone 5 兼容。

  • 在检查约束之前检查 add_permission。参 #37 [jaroel]

  • 从 statusmessages 中删除过时的 css 类和文本。 [pbauer]

  • 完成 invalidate_cache。 [adamcheasley]

2.3.2 (2015-07-18)

  • 检查添加表单的允许类型。 [vangheem]

2.3.1 (2015-05-31)

  • 修复问题:webdav PUT 创建的项具有空 id。 [datakurre]

  • 修复 #27:createContent 忽略空字段 [jensens]

2.3.0 (2015-03-13)

  • 使用属性为 DefaultAddForm 和 DefaultEditForm 成功消息,以便可以轻松自定义。 [cedricmessiant]

  • 对主模式、行为模式及其标记进行大规模重写,使其以相同的方式在所有地方获取。这非常混乱:有时没有考虑行为,或者只有基于 FTI 的行为,而没有通过 IBehaviorAssignable 适配器返回的行为。此外,缓存已清理。现在测试的可读性更好(至少我希望如此)。为了避免循环导入,一些方法已从 utils.py 移至 schema.py。已实施弃用。 [jensens]

  • 修复(安全):可以保护对模式字段的属性访问。这对于直接模式有效,但尚未针对来自行为的行为权限实施。 [jensens]

2.2.4 (2014-10-20)

  • 将默认属性访问器修复为在查找字段默认值时将字段绑定到上下文。 [datakurre]

  • 修复:当 Dexterity 容器或其子容器包含任何包含 AT 引用的 AT 内容时,对父 Dexterity 对象的任何移动或重命名操作都会导致 AT ReferenceEngine 删除这些引用。请参阅 #20。 [datakurre]

  • 让 utils.createContent 也处理从其他行为派生的行为属性设置。 [thet]

  • 重写(未更改逻辑):pep8、排序导入、plone.api 风格、可读性、utf8header、删除 bbb 代码(plone 3) [jensens]

2.2.3 (2014-04-15)

  • 重新发布 2.2.2,这是一个棕色袋发布。 [timo]

2.2.2 (2014-04-13)

  • 向在成功添加或编辑项后显示的状态消息添加一个“success”类。为了向后兼容,也保留了先前的“info”类。 [davisagli]

  • 如果要添加到容器中的对象已经具有一个 ID,则保留它。 [davisagli]

2.2.1 (2014-02-14)

  • 还检查行为字段以 IPrimaryField,因为 plone.app.contenttypes 使用行为提供的字段作为主字段 [pbauer]

2.2.0 (2014-01-31)

  • utils.createContent 尊重行为。 [toutpt]

  • 即使源字段是提供 datetime python 值的 dexterity 字段,日期索引方法也能正常工作。现在您可以手动添加一个名为常用 Plone 元数据字段(如 effective_date、publication_date 等)的字段。 [tdesvenain]

  • 替换弃用的测试断言语句。 [timo]

  • 在默认编辑视图中放置一个标记接口,以便可以为它注册小部件。 [davisagli]

  • 确保 FTI 的 isConstructionAllowed 方法返回布尔值。 [danjacka]

  • 当在 ZMI 中查看时,隐藏 Dublin Core 选项卡并显示属性选项卡。 [davisagli]

  • 除非与默认值不同,否则不要在新实例上存储 dublin core 元数据。 [davisagli]

  • 在行内实现CMF的Dublin Core接口,而不是依赖于CMFDefault。[davisagli]

  • 支持Dexterity内容的GenericSetup结构导入/导出。内容以与WebDAV相同的方式进行序列化,使用plone.rfc822。尚不支持所有字段类型,但这至少将基础知识设置到位。

    GS导入以前以基本方式意外地用于Dexterity容器。如果您使用了它,您需要使用rfc822序列化重新创建您的导出文件。[davisagli]

  • 创建者访问器应返回编码字符串。如果您的目录损坏,请尝试清除并重新索引创建者

    cat.clearIndex('Creator')
    cat.manage_reindexIndex(['Creator'])

    [kiorky]

  • 使用与Archetypes相同的消息字符串作为默认字段集。[davisagli]

2.1.3 (2013-05-26)

  • 当由于不存在或由于某些原因不再存在架构而导致架构查找失败时,应优雅地失败。[eleddy]

2.1.2 (2013-03-05)

  • 合并了Rafael Oliveira (@rafaelbco) 在collective.cmfeditionsdexteritycompat中的@content-core视图。[rpatterson]

2.1.1 (2013-01-17)

  • 不再默认将标题和描述字段添加到新的FTI。[davisagli, cedricmessiant]

  • 在粘贴到dexterity容器时,检查粘贴对象的FTI,以查看是否允许在新容器中。[wichert]

  • 修复了架构缓存。以前,一个非持久性计数器会被用作缓存键的一部分,并且在一个进程中对这个计数器所做的更改显然不会传播到其他进程。

    相反,缓存键现在包括架构和子类型,这些都是从FTI特定的易失性缓存中检索的,该缓存使用修改时间作为其缓存键。[malthe]

2.1 (2013-01-01)

  • 添加了芬兰翻译。[pingviini]

  • 从PortalFolder重写allowedContentTypes和invokeFactory以模仿基于Archetypes的文件夹的行为。这允许注册IConstrainTypes适配器以产生预期的效果。[gaudenzius]

  • 默认属性访问器现在还会通过子类型(行为)查找字段默认值。[malthe]

  • 在获取附加架构(即行为提供的字段)时,在FTI中添加了对通过实用程序名称查找行为的支持。

    此功能使得创建接口动态生成的行为成为可能。[malthe]

  • 对于以两个下划线开头的属性,提前返回。https://github.com/plone/plone.dexterity/pull/11 [malthe]

  • 使为FTI定义SchemaPolicy成为可能[Frédéric Péters] [gbastien]

2.0 (2012-08-30)

  • 为Dexterity项目添加了一个UID方法,以与Archetypes API兼容。[davisagli]

  • 删除对zope.app.content的硬依赖。[davisagli]

  • 使用标准的Python属性而不是rwproperty。[davisagli]

  • 删除了对Plone 3 / CMF 2.1 / Zope 2.10的支持。[davisagli]

  • 根据Zope 2.12 & 2.13适当更新包依赖和导入。[davisagli]

1.1.2 - 2012-02-20

  • 修复了在获取包含非ASCII字符的FTI标题或描述时出现的UnicodeDecodeError。[davisagli]

1.1.1 - 2012-02-20

1.1 - 2011-11-26

  • 添加了意大利语翻译。[zedr]

  • 在删除之前,确保不需要工厂实用程序。[lentinj]

  • 解决了一个问题,即当内容规则将新项目移动到不同的文件夹时,用户在添加内容时得到了404错误。这关闭了http://code.google.com/p/dexterity/issues/detail?id=240 [davisagli]

  • 添加了事件:IEditBegunEvent、IEditCancelledEvent、IEditFinished、IAddBegunEvent、IAddCancelledEvent [jbaumann]

  • 确保如果存在plone.uuid,则Dexterity内容项目在创建时获得UID。这关闭了http://code.google.com/p/dexterity/issues/detail?id=235 [davisagli]

  • 确保容器的Title()和Description()访问器返回编码的字节串,如CMF样式访问器所期望的那样。[buchi]

  • 添加了繁体中文翻译。[marr, davisagli]

1.0.1 - 2011-09-24

1.0 - 2011-05-20

  • 确保Title和Description访问器可以处理None值。[davisagli]

  • 确保Dexterity内容的Title()访问器按预期返回编码的字节串,类似于CMF样式的访问器。[davisagli]

1.0rc1 - 2011-04-30

  • 在Dexterity实例可用的情况下,通过适配到IBehaviorAssignable来查找额外的模式。(FTI中的行为列表仍用于添加表单。)[maurits]

  • 显式加载CMFCore ZCML。[davisagli]

  • 为分组字段集添加ID。[elro]

  • 在分配字段默认值时执行深拷贝而不是浅拷贝。通过脚本生成的内容最终变成了链表(和其他AbstractCollection)字段。[cah190, esteele]

  • 使setDescription以与setTitle相同的方式强制转换为unicode。[elro]

  • 将FTI默认值更改为启用动态视图。[elro]

  • 像Archetypes一样设置文件夹权限,以便复制/粘贴/重命名可以与Plone的其他部分保持一致。[elro]

  • 确保在编辑后重定向时尊重typesUseViewActionInListings属性。[elro, davisagli]

  • 修复#145:从@@folder_contents重命名项目后发生的UnicodeDecodeError [toutpt]

1.0b7 - 2011-02-11

  • 添加plone.rfc822.interfaces.IPrimaryFieldInfo的适配器。[elro]

  • 通过使用threading.RLock而不是threading.Lock来解决模式缓存同步方法的死锁。[jbaumann]

  • 添加西班牙语翻译。[dukebody]

  • 添加法语翻译。[toutpt]

1.0b6 - 2010-08-30

  • 从createContent实用程序方法发送ObjectCreatedEvent事件。[wichert]

  • 更新内容基类以使用允许关键字参数设置实例变量的初始值。[wichert]

  • 在item.pt中避免为标题和描述添加空的<div class="field">标签。[gaudenzius]

1.0b5 - 2010-08-05

1.0b4 - 2010-07-22

  • 提高健壮性:在尝试解析行为时捕获和记录导入错误。[wichert]

  • 从Christian Stengel添加德语翻译。[wichert]

1.0b3 - 2010-07-19

  • 阐明许可证为仅适用于GPL版本2。[wichert]

  • 为i18n提取配置Babel插件并添加荷兰语翻译。[wichert]

1.0b2 - 2010-05-24

  • 修复包元数据中的无效许可证声明。[wichert]

  • 不要假设“视图”是正确的直接视图 - 在某些情况下它可能不存在。相反,直接使用绝对URL。[wichert]

1.0b1 - 2010-04-20

  • 更新默认字段集的标签,使其更加人性化。[wichert]

  • 使默认添加表单扩展BrowserPage以避免有关不存在方法的警告。这解决了http://code.google.com/p/dexterity/issues/detail?id=69 [davisagli]

  • 目前,不再确保Dexterity内容提供ILocation(特别是,它有一个__parent__指针),因为这会在Zope 2.10导出时引起问题。[davisagli]

  • 不要假设默认表单中总是存在取消和操作按钮。[optilude]

1.0a3 - 2010-01-08

  • 需要 zope.filerepresentation>=3.6.0 以支持 IRawReadFile [csenger]

1.0a2 - 2009-10-12

  • 增加了对 zope.size.interfaces.ISized 的支持。可以在此接口中使用适配器来指定 WebDAV 操作中报告的文件大小或用于 Plone 的文件夹列表。这需要实现 sizeForSorting() 方法,返回一个元组('bytes', numBytes),其中 numBytes 是字节数。[optilude]

  • 增加了对 WebDAV 的支持。这主要是通过将内容对象适配到 zope.filerepresentation 包中的 IRawReadFile 和 IRawWriteFile 接口来实现的。默认情况下,使用 plone.rfc822 构造一个包含所有字段的 RFC(2)822 风格的消息。可以标记该包中的 IPrimaryField 接口的一个或多个字段,在这种情况下,它们将在消息正文中发送。[optilude]

    此外,新文件的创建(对空资源的 PUT 请求)委托给 IFileFactory 适配器,而新目录的创建(MKCOL 请求)委托给 IDirectoryFactory 适配器。有关详细信息,请参阅 zope.filerepresentation,以及 filerepresentation.py 以获取默认实现。[optilude]

  • 将 AddViewActionCompat 移动到 DexterityFTI 的第二个基类中,以便 FTI 接口胜过 IAction。这解决了 GenericSetup 导出的问题:[http://code.google.com/p/dexterity/issues/detail?id=79](http://code.google.com/p/dexterity/issues/detail?id=79) [optilude]

  • 向 AddViewActionCompat 添加 getMapping()。修复了 [http://code.google.com/p/dexterity/issues/detail?id=78](http://code.google.com/p/dexterity/issues/detail?id=78) [optilude]

1.0a1 - 2009-07-25

  • 初始版本

项目详细信息


发行历史 发行通知 | RSS 源

下载文件

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

源分发

plone_dexterity-3.0.6.tar.gz (122.0 kB 查看哈希值)

上传时间

构建分发

plone.dexterity-3.0.6-py3-none-any.whl (98.4 kB 查看哈希值)

上传时间 Python 3

支持