跳转到主要内容

plone升级的控制面板和升级助手。

项目描述

简介

本产品旨在简化在Plone中运行和编写第三方通用设置升级步骤。

它提供了一个控制面板,可以一次运行多个升级,基于通用设置(portal_setup)的升级机制。

此外,还提供了一个基类,用于编写带有各种常见任务帮助器的升级步骤。

http://onegov.ch/approved.png/image

认证:2013年01月

功能

  • 管理升级:提供用于使用通用设置升级第三方 Plone 包的高级视图。它通过易于使用的用户界面一次升级多个包。通过解决依赖图,它能够优化升级步骤顺序,从而实现无烦恼的升级。

  • 编写升级:该软件包提供了一个具有各种常见升级任务帮助器的基升级类。

  • 使用更少的 ZCML 的升级目录:通过将目录注册为升级目录,每个升级步骤不需要额外的 ZCML。通过使用时间戳作为版本号,我们有更少的(合并-)冲突和更少的错误潜在性。

  • 导入配置文件升级步骤:有时一个升级步骤仅由导入专门定制的通用设置配置文件组成。新的 upgrade-step:importProfile ZCML 指令使这一过程变得简单得多。

安装

  • 通过将 ftw.upgrade 添加到您的 buildout 的 eggs 列表中来安装它。然后运行 buildout 并重新启动您的实例

[instance]
eggs +=
    ftw.upgrade
  • 转到您的 Plone 站点的“站点设置”并激活 ftw.upgrade 扩展。

安装 ftw.upgrade 的控制台脚本

如果您将 ftw.upgrade 包含在基于 plone.recipe.zope2instance 的部分的 eggs 列表中,则应自动为您生成 bin/upgrade 脚本(即,如果您没有通过 scripts 选项限制或抑制脚本生成的话)。

否则,可以通过添加额外的 buildout 部分来安装控制台脚本 bin/upgrade

[buildout]
parts += upgrade

[upgrade]
recipe = zc.recipe.egg:scripts
eggs = ftw.upgrade

兼容性

兼容 Plone 4.3.x 和 5.1.x。

管理升级

@@manage-upgrades” 视图允许一次升级多个包

https://github.com/4teamwork/ftw.upgrade/raw/master/docs/manage-upgrades.png

回退视图

@@manage-upgrades-plain” 视图作为“@@manage-upgrades”的回退视图。它不包括 plone 的主模板,因此可能在默认视图由于某些原因失败时能够渲染。

bin/upgrade 脚本

请参阅控制台脚本安装部分,了解如何安装bin/upgrade

bin/upgrade控制台脚本可以管理文件系统上的升级(创建新的升级、更改升级顺序)以及与已安装的Plone网站交互,列出配置文件和升级并安装升级。

一些示例

$ bin/upgrade create "AddCatalogIndex"
$ bin/upgrade touch my/package/upgrades/20110101000000_add_catalog_index
$ bin/upgrade sites
$ bin/upgrade list -s Plone --auth admin:admin --upgrades
$ bin/upgrade install -s Plone --auth admin:admin  --proposed --intermediate-commit

使用其帮助系统可以获取bin/upgrade脚本的完整文档

$ bin/upgrade help

升级步骤助手

UpgradeStep基类提供了一些在编写升级步骤时有用的工具和助手。可以通过直接注册类方法来使用它。请注意,该类非常特殊:它像一个函数,会自动调用自己。

示例升级步骤定义(定义在upgrades.py中)

from ftw.upgrade import UpgradeStep

class UpdateFooIndex(UpgradeStep):
   """The index ``foo`` is a ``FieldIndex`` instead of a
   ``KeywordIndex``. This upgrade step changes the index type
   and reindexes the objects.
   """

   def __call__(self):
       index_name = 'foo'
       if self.catalog_has_index(index_name):
           self.catalog_remove_index(index_name)

       self.catalog_add_index(index_name, 'KeywordIndex')
       self.catalog_rebuild_index(index_name)

configure.zcml中的注册(假设它与同一目录相同)

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    i18n_domain="my.package">

    <genericsetup:upgradeStep
        profile="my.package:default"
        source="4"
        destination="5"
        title="Update index 'foo'."
        handler=".upgrades.UpdateFooIndex"
        />

</configure>

带有进度日志的对象更新

由于升级步骤通常更新目录中索引的一组对象,因此存在一个有用的辅助方法self.objects(),它将查询目录与进度记录器结合使用。目录查询是不受限制的,这样我们就可以处理所有对象。

以下是一个更新特定类型所有对象的示例

from ftw.upgrade import ProgressLogger
from ftw.upgrade import UpgradeStep

class ExcludeFilesFromNavigation(UpgradeStep):

   def __call__(self):
       for obj in self.objects({'portal_type': 'File'},
                               'Enable exclude from navigation for files'):
           obj.setExcludeFromNav(True)

运行升级步骤时,您将看到一个进度日志

INFO ftw.upgrade STARTING Enable exclude from navigation for files
INFO ftw.upgrade 1 of 10 (10%): Enable exclude from navigation for files
INFO ftw.upgrade 5 of 50 (50%): Enable exclude from navigation for files
INFO ftw.upgrade 10 of 10 (100%): Enable exclude from navigation for files
INFO ftw.upgrade DONE: Enable exclude from navigation for files

方法

UpgradeStep类有各种辅助函数

self.getToolByName(tool_name)

返回升级站点名称为tool_name的工具。

self.objects(catalog_query, message, logger=None, savepoints=None)

查询目录(不受限制)并返回一个包含完整对象的迭代器。迭代器配置并调用传递的messageProgressLogger

如果设置为非零值,savepoints参数将在每n个项目时创建事务保存点。这可以用于在创建大型事务时控制内存使用。默认值None表示我们不配置此功能,应使用默认配置,这通常是1000。有关更多详细信息,请参阅保存点部分。要完全禁用保存点,可以使用savepoints=False

此方法将在对象损坏时从目录中删除匹配的脑图,因为脑图的对象不再存在。进度记录器不会补偿跳过的对象,并且会在达到100%之前终止。

self.catalog_rebuild_index(name)

重新索引由name标识的portal_catalog索引。

self.catalog_reindex_objects(query, idxs=None, savepoints=None)

使用query在目录中找到所有对象并重新索引。可以传递索引列表作为idxs以限制索引的索引。将传递savepoints参数给self.objects()

self.catalog_has_index(name)

返回是否存在名为name的目录索引。

self.catalog_add_index(name, type_, extra=None)

portal_catalog工具添加新的索引。

self.catalog_remove_index(name)

portal_catalog工具中删除索引。

self.actions_remove_action(category, action_id)

portal_actions工具中删除给定category内由action_id标识的操作。

self.catalog_unrestricted_get_object(brain)

返回脑图的未受限制的对象。对于已死亡且不再存在对象的脑图,将从目录中删除,并返回None

self.catalog_unrestricted_search(query, full_objects=False)

在目录中搜索时不检查安全性。当 full_objectsTrue 时,将返回无限制的对象而不是 brains。升级步骤通常应使用无限制的目录访问,因为所有对象都应该升级 - 即使运行升级的管理员对这些对象没有访问权限。

当使用 full_objects 时,已死亡的 brains(没有对象的 brains)将从目录中删除,并在生成器中跳过。删除死亡的 brains 后,生成的生成器的长度不会补偿跳过的对象,因此会太大。

self.actions_add_type_action(self, portal_type, after, action_id, **kwargs)

从由 portal_type 识别的类型添加 portal_types 动作,位置可以由 after 属性定义。如果找不到 after 动作,则将动作插入列表末尾。

self.actions_remove_type_action(portal_type, action_id)

从由 portal_type 识别的类型中删除具有动作 ID action_idportal_types 动作。

self.set_property(context, key, value, data_type='string')

在给定的 context 上安全地设置键为 key 和值为 value 的属性。如果不存在,将使用类型 data_type 创建属性。

self.add_lines_to_property(context, key, lines)

更新对象 context 上的键 key 的属性,添加 lines。期望属性为“lines”类型。如果属性不存在,则创建。

self.setup_install_profile(profileid, steps=None)

安装由 profileid 识别的通用设置配置文件。如果传递了带有 steps 的步骤名称列表(例如 [‘actions’]),则只安装这些步骤。默认情况下安装所有步骤。

self.ensure_profile_installed(profileid)

仅在尚未安装时安装通用设置配置文件。

self.install_upgrade_profile(steps=None)

安装与此升级步骤关联的通用设置配置文件。配置文件可以通过使用 upgrade-step:importProfileupgrade-step:directory 指令与升级步骤相关联。

self.is_profile_installed(profileid)

检查是否安装了通用设置配置文件。通过快速安装程序尊重产品卸载。

self.is_product_installed(product_name)

检查产品是否已安装。

self.uninstall_product(product_name)

使用快速安装程序卸载产品。

self.migrate_class(obj, new_class)

更改对象类。它对基于 BTreeFolder2Base 的容器有特殊处理。

self.remove_broken_browserlayer(name, dottedname)

删除一个浏览器层注册,其接口无法从持久注册中导入。实例启动时间出现的此类消息可能是此问题的指示:WARNING OFS.Uninstalled Could not import class 'IMyProductSpecific' from module 'my.product.interfaces'

self.update_security(obj, reindex_security=True)

更新单个对象的权限(管理访问中的复选框)。这通常与 ProgressLogger 结合使用。可以在目录中跳过重新索引对象权限(allowedRolesAndUsers)。这可以加快更新速度,但应仅在没有更改视图权限时禁用。

self.update_workflow_security(workflow_names, reindex_security=True, savepoints=None)

更新具有列表中任何一个工作流的全部对象。当更新多个工作流并希望确保对象权限得到正确更新时,这很有用。

通过仅搜索可能具有此工作流的类型,执行更新以保持尽可能小。它支持有区域的工作流策略。

为了进一步加快速度,您可以通过传递 reindex_security=False 来实现,但您需要确保您没有更改任何与安全相关的权限(只有 View 需要 reindex_security=True 才能在默认的 Plone 中使用)。

默认情况下,每1000个对象创建一个事务保存点。这可以防止在创建大型事务时内存消耗过大。如果您的服务器有足够的内存,您可以通过传递 savepoints=None 来关闭保存点。

self.base_profile

该属性 base_profile 包含升级配置文件的配置文件名称,包括 profile- 前缀。例如: u"profile-the.package:default"。此信息仅在使用 upgrade-step:directory 指令时可用。

self.target_version

该属性 target_version 包含升级步骤的目标版本,作为字节串。例如,带有升级步骤目录的示例:"20110101000000"。此信息仅在使用 upgrade-step:directory 指令时可用。

进度记录器

当升级步骤需要很长时间才能完成(例如,在执行数据迁移时),管理员需要有关更新进度的信息。当通过 Web 服务器/代理访问 Zope 时,也需要有连续的输出以避免代理超时。

ProgressLogger 使记录进度非常容易

from ftw.upgrade import ProgressLogger
from ftw.upgrade import UpgradeStep

class MyUpgrade(UpgradeStep):

   def __call__(self):
       objects = self.catalog_unrestricted_search(
           {'portal_type': 'MyType'}, full_objects=True)

       for obj in ProgressLogger('Migrate my type', objects):
           self.upgrade_obj(obj)

   def upgrade_obj(self, obj):
       do_something_with(obj)

日志记录器将每5秒记录一次当前进度(默认)。例如日志输出

INFO ftw.upgrade STARTING Migrate MyType
INFO ftw.upgrade 1 of 10 (10%): Migrate MyType
INFO ftw.upgrade 5 of 50 (50%): Migrate MyType
INFO ftw.upgrade 10 of 10 (100%): Migrate MyType
INFO ftw.upgrade DONE: Migrate MyType

工作流链更新器

当更改内容类型的流程时,每个现有对象的流程状态将重置为新流程的初始化状态。这可能会非常烦人。

WorkflowChainUpdater 负责在更改链(类型的流程)后将每个对象设置为正确的状态

from ftw.upgrade.workflow import WorkflowChainUpdater
from ftw.upgrade import UpgradeStep

class UpdateWorkflowChains(UpgradeStep):

    def __call__(self):
        query = {'portal_type': ['Document', 'Folder']}
        objects = self.catalog_unrestricted_search(
            query, full_objects=True)

        review_state_mapping={
            ('intranet_workflow', 'plone_workflow'): {
                'external': 'published',
                'pending': 'pending'}}

        with WorkflowChainUpdater(objects, review_state_mapping):
            # assume that the profile 1002 does install a new workflow
            # chain for Document and Folder.
            self.setup_install_profile('profile-my.package.upgrades:1002')

工作流程链更新器默认迁移工作流程历史记录。可以通过将 migrate_workflow_history 设置为 False 来禁用工作流程历史记录迁移

with WorkflowChainUpdater(objects, review_state_mapping,
                          migrate_workflow_history=False):
    # code

如果提供了转换映射,则根据映射迁移工作流程历史记录条目中的操作,以便为新工作流程提供翻译

transition_mapping = {
    ('intranet_workflow', 'new_workflow'): {
        'submit': 'submit-for-approval'}}

with WorkflowChainUpdater(objects, review_state_mapping,
                          transition_mapping=transition_mapping):
    # code

有用的流程策略激活器

当手动激活有意义的流程策略时,可能所有具有新流程的对象都会重置为新流程的初始状态。

ftw.upgrade 有一个工具可以启用有意义的流程策略,而不会破坏审查状态,通过将其从旧工作流程映射到新工作流程来实现

from ftw.upgrade.placefulworkflow import PlacefulWorkflowPolicyActivator
from ftw.upgrade import UpgradeStep

class ActivatePlacefulWorkflowPolicy(UpgradeStep):

    def __call__(self):
        portal_url = self.getToolByName('portal_url')
        portal = portal_url.getPortalObject()

        context = portal.unrestrictedTraverse('path/to/object')

        activator = PlacefulWorkflowPolicyActivator(context)
        activator.activate_policy(
            'local_policy',
            review_state_mapping={
                ('intranet_workflow', 'plone_workflow'): {
                    'external': 'published',
                    'pending': 'pending'}})

以下示例在“path/to/object”下的对象上递归地激活有意义的流程策略,激活了“local_policy”有意义的流程策略。

映射将“intranet_workflow”映射到“plone_workflow”,通过定义哪些旧状态(键,intranet_workflow)应该更改为新状态(值,plone_workflow)来实现。

选项

  • activate_in:激活传入对象的流程策略(默认为 True)。

  • activate_below:激活传入对象子级的流程策略,递归地(默认为 True)。

  • update_security:更新对象安全性并重新索引 allowedRolesAndUsers(默认为 True)。

原地迁移器

原地迁移器为升级步骤中的内容迁移提供了一种快速简便的方法。例如,它可以用作从 Archetypes 迁移到 Dexterity。

Plone 的标准迁移与原地迁移之间的区别在于,标准迁移创建了一个新的兄弟节点并移动了子节点,而原地迁移只是在树中替换对象并将子节点附加到新的父节点。这是一个更快的方法,因为它不会触发移动/重命名事件。

示例用法

from ftw.upgrade import UpgradeStep
from ftw.upgrade.migration import InplaceMigrator

class MigrateContentPages(UpgradeStep):

    def __call__(self):
        self.install_upgrade_profile()

        migrator = InplaceMigrator(
            new_portal_type='DXContentPage',
            field_mapping={'text': 'content'},
        )

        for obj in self.objects({'portal_type': 'ATContentPage'},
                                'Migrate content pages to dexterity'):
            migrator.migrate_object(obj)

参数

  • new_portal_type (必需):目标类型的 portal_type 名称。

  • field_mapping:旧字段名到新字段名的映射。

  • options:一个或多个选项(二进制标志)。

  • ignore_fields:应忽略的字段列表。

  • attributes_to_migrate:应从旧对象复制到新对象的属性列表(不是字段!)。默认为 DEFAULT_ATTRIBUTES_TO_COPY

选项

选项是二进制标志:多个选项可以进行或运算。例如

from ftw.upgrade.migration import IGNORE_STANDARD_FIELD_MAPPING
from ftw.upgrade.migration import IGNORE_UNMAPPED_FIELDS
from ftw.upgrade.migration import InplaceMigrator

 migrator = InplaceMigrator(
     'DXContentPage',
     options=IGNORE_UNMAPPED_FIELDS | IGNORE_STANDARD_FIELD_MAPPING,
 })
  • DISABLE_FIELD_AUTOMAPPING:默认情况下,旧实现和新实现上名称相同的字段会自动映射。此标志禁用自动映射。

  • IGNORE_UNMAPPED_FIELDS:默认情况下,检测到未映射的字段时会引发 FieldsNotMappedError。此标志禁用此行为,并且忽略未映射的字段。

  • BACKUP_AND_IGNORE_UNMAPPED_FIELDS:忽略未映射的字段,但将未映射字段的值存储在新对象的注释中(使用来自常量 UNMAPPED_FIELDS_BACKUP_ANN_KEY 的键),以便稍后处理。这在有额外字段(模式扩展器)时很有用。

  • IGNORE_STANDARD_FIELD_MAPPING 默认情况下,STANDARD_FIELD_MAPPING 会合并到每个字段映射中,包含从 Archetypes 到 Dexterity 的标准 Plone 字段映射。此标志禁用此行为。

  • IGNORE_DEFAULT_IGNORE_FIELDS 默认情况下,DEFAULT_IGNORED_FIELDS 中列出的字段将被跳过。此标志禁用此行为。

  • SKIP_MODIFIED_EVENTTrue 时,不触发修改事件。

升级目录

upgrade-step:directory ZCML 指令允许我们使用新的升级步骤定义语法,具有以下 优点

  • 目录一旦注册(ZCML)并在 Zope 启动时自动扫描。这 减少了每个升级步骤使用的 ZCML,避免了需要在多个地方指定配置文件版本而创建的冗余。

  • 使用时间戳而不是版本号。因此,我们 有更少的合并冲突

  • 配置文件中的 metadata.xml 版本已删除,并在 Zope 启动时动态设置为最新升级步骤的版本。我们不再需要在升级中维护此版本。

  • 每个升级自动成为通用设置配置文件。UpgradeStep 类的实例知道它属于哪个配置文件,并且可以使用 self.install_upgrade_profile() 简单地导入该配置文件。

  • manage-upgrades 视图显示我们意外地将具有比已执行升级步骤更旧时间戳的升级步骤合并在一起的情况。这有助于我们检测长期分支合并问题。

设置升级目录

  • 为您的配置文件注册升级目录(例如,my/package/configure.zcml

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:upgrade-step="http://namespaces.zope.org/ftw.upgrade"
    i18n_domain="my.package">

    <include package="ftw.upgrade" file="meta.zcml" />

    <upgrade-step:directory
        profile="my.package:default"
        directory="./upgrades"
        />

</configure>
  • 创建配置的升级步骤目录(例如,my/package/upgrades),并在该目录中放置一个空的 __init__.py(防止某些 Python 导入警告)。

  • 从为该升级步骤目录配置的配置文件(例如,my/package/profiles/default/metadata.xml)中删除版本。

<?xml version="1.0"?>
<metadata>
    <dependencies>
        <dependency>profile-other.package:default</dependency>
    </dependencies>
</metadata>

声明升级软依赖

当有可选依赖项(extras_require)时,我们有时需要告诉 ftw.upgrade,我们的可选依赖项的升级需要在我们的升级安装之前安装。

我们通过在 upgrade-step:directory 指令中声明软依赖来实现这一点。可以通过空格分隔来声明多个依赖。

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:upgrade-step="http://namespaces.zope.org/ftw.upgrade"
    i18n_domain="my.package">

    <include package="ftw.upgrade" file="meta.zcml" />

    <upgrade-step:directory
        profile="my.package:default"
        directory="./upgrades"
        soft_dependencies="other.package:default
                           collective.fancy:default"
        />

</configure>

创建升级步骤

可以使用 ftw.upgradebin/upgrade 控制台脚本来生成升级步骤。想法是使用 zc.recipe.egg 通过 buildout 安装此脚本。

安装后,可以使用脚本简单地构建升级步骤

$ bin/upgrade create AddControlpanelAction

create 命令通过解析 *.egg-info/top_level.txt 文件来搜索您的 upgrades 目录。如果您没有 egg-info 或您的升级目录名称不同,则自动发现不起作用,您可以使用 --path 参数提供升级目录的路径。

如果您希望在终端中看到彩色输出,可以安装 colors 扩展(ftw.upgrade[colors])。

重新排序升级步骤

bin/upgrade 控制台脚本提供了一个用于重新排序生成的升级步骤的 touch。使用可选参数 --before--after,可以将升级步骤移动到特定位置。当省略可选参数时,升级步骤的时间戳设置为当前时间。

示例

$ bin/upgrade touch upgrades/20141218093045_add_controlpanel_action
$ bin/upgrade touch 20141218093045_add_controlpanel_action --before 20141220181500_update_registry
$ bin/upgrade touch 20141218093045_add_controlpanel_action --after 20141220181500_update_registry

手动创建升级步骤

  • 在升级目录中创建一个用于升级步骤的目录。目录名称必须包含时间戳和描述,由下划线连接,例如 YYYYMMDDHHMMII_description_of_what_is_done

$ mkdir my/package/upgrades/20141218093045_add_controlpanel_action
  • 接下来,在上述目录中创建一个名为 upgrade.py 的升级步骤代码。需要创建此文件,否则升级步骤不会被注册。

# my/package/upgrades/20141218093045_add_controlpanel_action/upgrade.py

from ftw.upgrade import UpgradeStep

class AddControlPanelAction(UpgradeStep):
    """Adds a new control panel action for the package.
    """
    def __call__(self):
        # maybe do something
        self.install_upgrade_profile()
        # maybe do something
  • 您必须从 UpgradeStep 继承。

  • 给您的类一个合适的名称,尽管它不会在任何地方显示。

  • 给类添加一个描述性的 docstring,前几行连续的行用作升级步骤描述。

  • 如果您在升级中有基于通用设置的更改,不要忘记执行 self.install_upgrade_profile()

  • 将通用设置文件放在同一升级步骤目录中,它将自动作为针对此升级步骤的通用设置配置文件。 install_upgrade_profile 知道要导入什么。

    对于我们的示例,这意味着我们在 my/package/upgrades/20141218093045_add_controlpanel_action/controlpanel.xml 放置一个文件,该文件添加了新的控制面板操作。

生成的目录结构应该类似于以下内容

my/
  package/
    configure.zcml                              # registers the profile and the upgrade directory
    upgrades/                                   # contains the upgrade steps
      __init__.py                               # prevents python import warnings
      20141218093045_add_controlpanel_action/   # our first upgrade step
        upgrade.py                              # should contain an ``UpgradeStep`` subclass
        controlpanel.xml                        # Generic Setup data to import
      20141220181500_update_registry/           # another upgrade step
        upgrade.py
        *.xml
    profiles/
      default/                                  # the default Generic Setup profile
        metadata.xml

可延迟的升级

可延迟的升级是一种特殊的升级类型,可以根据需要省略。默认情况下,它们仍然会被提出和安装,但可以通过设置标志来排除安装。可延迟的升级可以用来解耦那些现在不需要运行,但最终需要运行的升级,从关键升级路径。这对于长期运行的数据迁移或修复脚本特别有用。

可以通过在 UpgradeStep 的子类上设置一个类属性 deferrable 来标记升级步骤为可延迟的。

# my/package/upgrades/20180709135657_long_running_upgrade/upgrade.py

from ftw.upgrade import UpgradeStep

class LongRunningUpgrade(UpgradeStep):
    """Potentially long running upgrade which is deferrable.
    """
    deferrable = True

    def __call__(self):
        pass

当您从命令行安装升级时,您可以使用以下命令跳过安装可延迟的升级步骤

$ bin/upgrade install -s plone --proposed --skip-deferrable

当使用< span class="docutils literal"> < span class="pre">@@manage-upgrades 视图安装升级时,可延迟的升级步骤将显示一个额外的图标,并可以手动取消选中。

JSON API

JSON API允许获取Plone站点的配置文件和升级并执行升级。

身份验证和授权

此API对具有“cmf.ManagePortal”权限的用户可用,通常需要“Manager”角色。

版本控制

可以通过将版本添加到URL中请求特定的API版本。例如

$ curl -uadmin:admin https://127.0.0.1:8080/upgrades-api/v1/list_plone_sites

API 发现

API是可发现的且具有自描述性。当省略API操作时,将返回API描述。

$ curl -uadmin:admin https://127.0.0.1:8080/upgrades-api/
{
    "api_version": "v1",
    "actions": [
        {
            "request_method": "GET",
            "required_params": [],
            "name": "current_user",
            "description": "Return the current user when authenticated properly. This can be used for testing authentication."
        },
        {
            "request_method": "GET",
            "required_params": [],
            "name": "list_plone_sites",
            "description": "Returns a list of Plone sites."
        }
    ]
}

$ curl -uadmin:admin https://127.0.0.1:8080/Plone/upgrades-api/
...

列出 Plone 站点

$ curl -uadmin:admin https://127.0.0.1:8080/upgrades-api/list_plone_sites
[
    {
        "path": "/Plone",
        "id": "Plone",
        "title": "Website"
    }
]

列出配置文件和升级

列出所有配置文件

列出Plone站点的所有已安装的通用设置配置文件及其升级

$ curl -uadmin:admin https://127.0.0.1:8080/Plone/upgrades-api/list_profiles
[
    {
        "id": "Products.CMFEditions:CMFEditions",
        "db_version": "4",
        "product": "Products.CMFEditions",
        "title": "CMFEditions",
        "outdated_fs_version": false,
        "fs_version": "4",
        "upgrades": [
            {
                "proposed": false,
                "title": "Fix portal_historyidhandler",
                "outdated_fs_version": false,
                "orphan": false,
                "deferred": false,
                "dest": "3",
                "done": true,
                "source": "2.0",
                "id": "3@Products.CMFEditions:CMFEditions"
            },

...

获取配置文件

列出单个配置文件及其升级

$ curl -uadmin:admin "https://127.0.0.1:8080/Plone/upgrades-api/get_profile?profileid=Products.TinyMCE:TinyMCE"
{
    "id": "Products.TinyMCE:TinyMCE",
    "db_version": "7",
    "product": "Products.TinyMCE",
    "title": "TinyMCE Editor Support",
    "outdated_fs_version": false,
    "fs_version": "7",
    "upgrades": [
        {
            "proposed": false,
            "title": "Upgrade TinyMCE",
            "outdated_fs_version": false,
            "orphan": false,
            "deferred": false,
            "dest": "1.1",
            "done": true,
            "source": "1.0",
            "id": "1.1@Products.TinyMCE:TinyMCE"
        },
...

列出建议的配置文件

列出提出升级的所有配置文件,每个配置文件只包括建议的升级

$ curl -uadmin:admin https://127.0.0.1:8080/Plone/upgrades-api/list_profiles_proposing_upgrades
...

列出建议的升级

列出所有建议的升级,不包括包装的配置文件信息

$ curl -uadmin:admin https://127.0.0.1:8080/Plone/upgrades-api/list_proposed_upgrades
[
    {
        "proposed": true,
        "title": "Foo.",
        "outdated_fs_version": false,
        "orphan": true,
        "deferred": false,
        "dest": "20150114104527",
        "done": false,
        "source": "10000000000000",
        "id": "20150114104527@ftw.upgrade:default"
    }
]

执行升级

执行升级时,响应不是JSON类型,而是一个流式升级日志。如果请求正确,无论升级是否安装正确,响应状态始终为200 OK。如果升级失败,请求和事务将被中止,响应内容将以“Result: FAILUREn”结束。如果升级成功,响应内容将以“Result: SUCCESSn”结束。

执行所选升级

可以通过API-ID(格式:“<dest>@<profileid>”)执行选定的升级。当使用升级组时,API-ID有些模糊,它标识/安装了具有相同目标版本的同一配置文件的所有升级步骤。

所有升级步骤都重新排序为ftw.upgrade建议的安装顺序。无法在单个请求中更改顺序,请使用多个请求进行未提议的安装顺序。安装顺序通过按依赖关系拓扑排序配置文件,并在每个配置文件中按目标版本排序升级来执行。

执行选定一组升级的示例

$ curl -uadmin:admin -X POST "https://127.0.0.1:8080/Plone/upgrades-api/execute_upgrades?upgrades:list=7@Products.TinyMCE:TinyMCE&upgrades:list=20150114104527@ftw.upgrade:default"
2015-01-14 11:16:14 INFO ftw.upgrade ______________________________________________________________________
2015-01-14 11:16:14 INFO ftw.upgrade UPGRADE STEP Products.TinyMCE:TinyMCE: Upgrade TinyMCE 1.3.4 to 1.3.5
2015-01-14 11:16:14 INFO ftw.upgrade Ran upgrade step Upgrade TinyMCE 1.3.4 to 1.3.5 for profile Products.TinyMCE:TinyMCE
2015-01-14 11:16:14 INFO ftw.upgrade Upgrade step duration: 1 second
2015-01-14 11:16:14 INFO ftw.upgrade ______________________________________________________________________
2015-01-14 11:16:14 INFO ftw.upgrade UPGRADE STEP ftw.upgrade:default: Foo.
2015-01-14 11:16:14 INFO GenericSetup.rolemap Role / permission map imported.
2015-01-14 11:16:14 INFO GenericSetup.archetypetool Archetype tool imported.
2015-01-14 11:16:14 INFO ftw.upgrade Ran upgrade step Foo. for profile ftw.upgrade:default
2015-01-14 11:16:14 INFO ftw.upgrade Upgrade step duration: 1 second
Result: SUCCESS

执行所有建议的升级

执行Plone站点所有建议升级的示例

$ curl -uadmin:admin -X POST https://127.0.0.1:8080/Plone/upgrades-api/execute_proposed_upgrades
2015-01-14 11:17:34 INFO ftw.upgrade ______________________________________________________________________
2015-01-14 11:17:34 INFO ftw.upgrade UPGRADE STEP ftw.upgrade:default: Bar.
2015-01-14 11:17:35 INFO GenericSetup.rolemap Role / permission map imported.
2015-01-14 11:17:35 INFO GenericSetup.archetypetool Archetype tool imported.
2015-01-14 11:17:35 INFO ftw.upgrade Ran upgrade step Bar. for profile ftw.upgrade:default
2015-01-14 11:17:35 INFO ftw.upgrade Upgrade step duration: 1 second
Result: SUCCESS

要在每个升级后提交,请传递intermediate_commit参数

$ curl -uadmin:admin -X POST https://127.0.0.1:8080/Plone/upgrades-api/execute_proposed_upgrades?intermediate_commit=true

安装配置文件

您可以安装完整的配置文件。如果配置文件已安装,则不会执行任何操作。通常您会想要安装默认配置文件,但安装卸载配置文件是可以的。

请注意,我们不处理portal_quickinstaller。因此,如果您安装卸载配置文件,您可能仍然会看到产品已安装。但对于默认配置文件,一切都会如您所期望的那样工作。

安装PloneFormGen(尚未安装)和ftw.upgrade(已安装)的示例

$ curl -uadmin:admin -X POST "https://127.0.0.1:8080/Plone/upgrades-api/execute_profiles?profiles:list=Products.PloneFormGen:default&profiles:list=ftw.upgrade:default"
2016-01-05 13:09:46 INFO ftw.upgrade Installing profile Products.PloneFormGen:default.
2016-01-05 13:09:46 INFO GenericSetup.rolemap Role / permission map imported.
...
2016-01-05 13:09:48 INFO GenericSetup.types 'FieldsetEnd' type info imported.
2016-01-05 13:09:48 INFO GenericSetup.factorytool FactoryTool settings imported.
2016-01-05 13:09:48 INFO ftw.upgrade Done installing profile Products.PloneFormGen:default.
2016-01-05 13:09:48 INFO ftw.upgrade Ignoring already installed profile ftw.upgrade:default.
Result: SUCCESS

默认情况下,跳过已安装的配置文件。当提供force_reinstall=True请求参数时,将重新安装已安装的配置文件。

升级 Plone

您可以将您的Plone站点迁移。这就是您在手动执行@@plone-upgrade视图时所做的事情,该视图通过概览控制面板(或ZMI)链接,当您的Plone站点需要更新时。

升级Plone的示例

$ curl -uadmin:admin -X POST "https://127.0.0.1:8080/test/upgrades-api/plone_upgrade"
"Plone Site has been updated."

升级Plone时不需要升级的示例

$ curl -uadmin:admin -X POST "https://127.0.0.1:8080/test/upgrades-api/plone_upgrade"
"Plone Site was already up to date."

要检查是否需要Plone升级,您可以做

$ curl -uadmin:admin -X POST "https://127.0.0.1:8080/test/upgrades-api/plone_upgrade_needed"

重新烹饪资源

CSS和JavaScript资源包可以重新烹饪

$ curl -uadmin:admin -X POST https://127.0.0.1:8080/Plone/upgrades-api/recook_resources
"OK"

合并包

CSS和JavaScript包可以合并

$ curl -uadmin:admin -X POST https://127.0.0.1:8080/Plone/upgrades-api/combine_bundles
"OK"

这是针对Plone 5或更高版本。它运行与您导入更改资源注册表的配置文件时相同的代码。

导入配置文件升级步骤

有时,一个升级步骤仅由导入定制的通用设置配置文件组成。创建这样的升级步骤通常比在Python中进行更改要简单得多,因为我们可以将新默认通用设置配置文件所需的部分简单地复制到升级步骤配置文件中。

通常,为了做到这一点,我们必须注册一个升级步骤和一个通用设置配置文件,并编写一个升级步骤处理程序来导入配置文件。

ftw.upgrade通过提供专门针对此用例的importProfile ZCML指令,使得这个过程变得简单多了。

以下是一个示例的configure.zcml文件,它应该放置在您的upgrades子包中。

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:upgrade-step="http://namespaces.zope.org/ftw.upgrade"
    i18n_domain="my.package">

    <include package="ftw.upgrade" file="meta.zcml" />

    <upgrade-step:importProfile
        title="Update email_from_address"
        profile="my.package:default"
        source="1007"
        destination="1008"
        directory="profiles/1008"
        />

</configure>

此示例升级步骤更新了email_from_address属性。

一个通用的设置配置文件将自动注册,并与生成的升级步骤处理程序连接。

只需将一个properties.xml文件放入相对于上述configure.zcmlprofiles/1008文件夹中,升级步骤就准备好部署了。

可选地,可以定义一个handler。处理程序,UpgradeStep的子类,可以使用self.install_upgrade_profile()导入相关的通用设置配置文件。

IPostUpgrade 适配器

通过注册一个IPostUpgrade适配器,可以在运行升级后运行自定义代码。所有适配器都在每次运行升级后执行,无论运行了哪个升级。适配器的名称应该是包的配置文件,这样ftw.upgrade就能按照GS依赖的顺序执行适配器。

示例适配器

from ftw.upgrade.interfaces import IPostUpgrade
from zope.interface import implements

class MyPostUpgradeAdapter(object):
    implements(IPostUpgrade)

    def __init__(self, portal, request):
        self.portal = portal
        self.request = request

    def __call__(self):
        # custom code, e.g. import a generic setup profile for customizations

在ZCML中的注册

<configure xmlns="http://namespaces.zope.org/zope">
    <adapter
        factory=".adapters.MyPostUpgradeAdapter"
        provides="ftw.upgrade.interfaces.IPostUpgrade"
        for="Products.CMFPlone.interfaces.siteroot.IPloneSiteRoot
             zope.interface.Interface"
        name="my.package:default" />
</configure>

检查点

ftw.upgrade的某些迭代器被封装在SavepointIterator中,在每一批项目的每个批次后创建保存点。这允许我们保持内存占用低。

可以传递保存点迭代器的阈值到某些方法,如升级中的self.objects,或者它可以使用环境变量全局配置

UPGRADE_SAVEPOINT_THRESHOLD = 1000

默认的保存点阈值是1000。

运行升级时的内存优化

Zope针对执行许多较小的请求进行了优化。ZODB的pickle缓存将对象保留在内存中,以便它们可以在下一个请求中使用。

尽管运行大型升级是一个长期请求,但这增加了内存问题的可能性。

ftw.upgrade通过创建保存点并触发pickle缓存垃圾收集器来尝试优化内存使用。

为了使此功能正常工作,您应该正确配置您的ZODB缓存大小(zodb-cache-size-byteszodb-cache-size)。

防止 ftw.upgrade 将升级标记为已安装

ftw.upgrade在导入完整配置文件时自动将配置文件的所有升级步骤标记为已安装。这对于初始安装非常重要。

在某些情况下,您可能希望导入配置文件但不将升级步骤标记为已安装。例如,这可以在无法遵循默认迁移路径的大迁移项目中完成。

您可以为所有通用设置配置文件这样做

from ftw.upgrade.directory.subscribers import no_upgrade_step_marking

with no_upgrade_step_marking():
    # install profile with portal_setup

或为某些通用设置配置文件

from ftw.upgrade.directory.subscribers import no_upgrade_step_marking

with no_upgrade_step_marking('my.package:default'):
    # install profile with portal_setup

变更日志

3.3.1 (2022-07-08)

  • 支持在WorkflowSecurityUpdater中死脑筋。[njohner]

3.3.0 (2022-03-28)

  • 允许选择特定的实例来运行升级命令。[njohner]

3.2.0 (2022-01-31)

  • 在升级步骤期间记录内存使用情况。[njohner]

  • 将升级步骤持续时间写入文件。[njohner]

  • 如果内存关键,则在升级期间进行缓存清理。[njohner]

3.1.1 (2021-09-07)

  • 在升级步骤中添加遍历脑方法。[njohner]

3.1.0 (2021-06-21)

  • 添加中间提交选项,在每个已安装的升级后提交事务。[deiferni]

3.0.4 (2021-01-21)

  • 不要在模拟旧资源注册工具上调用cookResources。[maurits]

  • 当使用Python3时,请使用importlib而不是已废弃的imp模块来查找升级步骤。这可以消除关于未关闭资源的警告。修复了问题 211 https://github.com/4teamwork/ftw.upgrade/issues/211。 [ale-rt]

3.0.3 (2020-10-10)

3.0.2 (2020-08-27)

3.0.1 (2020-06-09)

3.0.0 (2020-03-23)

  • 支持Plone 5.2和Python 3。 [buchi]

  • 也在wsgi.ini中查找实例端口号。 [maurits]

2.16.0 (2020-02-14)

  • 在WorkflowChainUpdater中允许重新建立额外的索引。 [tinagerber]

2.15.2 (2020-01-27)

  • 在migrate_intid()过程中修复了IntIds目录中的缺失值。 [djowett-ftw]

2.15.1 (2019-12-16)

  • NotFound时清理损坏的目录Brains。 [jone]

2.15.0 (2019-12-12)

  • 添加了用于禁用升级步骤标记的上下文管理器。 [jone]

  • 当不执行完整导入时,不要将升级步骤标记为已安装。 [jone]

2.14.1 (2019-11-08)

  • 即使Dublin Core行为未启用,也迁移创建者。 [jone]

  • 正确迁移RichTextFields中的空值。修复了问题 https://github.com/4teamwork/izug.refegovservice/issues/2。 [djowett-ftw]

2.14.0 (2019-10-31)

2.13.0 (2019-08-22)

  • 为Plone 5添加了combine_bundles命令。这会将JS/CSS捆绑在一起。 [maurits]

2.12.2 (2019-06-19)

  • 确保始终使用包装在RequestContainer中的portal_migration工具。(修复了Plone 5.1.x升级中的“AttributeError: REQUEST”) [lgraf]

2.12.1 (2019-06-18)

  • 选择ZServer层实际使用的端口号来运行CommandAndInstance测试。 [lgraf]

  • 为Plone 5.1.5支持禁用Diazo。 [jone]

2.12.0 (2018-07-26)

  • 允许将升级标记为延迟,以便它们不会默认提出。 [deiferni]

2.11.1 (2018-04-05)

  • 修复了当zope.conf包含ip-address时的连接问题。 [jone]

  • 确保remove_broken_browserlayer()辅助函数不会在要删除的浏览器层注册(不再存在)时失败。 [lgraf]

2.11.0 (2018-01-31)

  • 在包装器中提供升级步骤处理程序接口和处理程序类。 [jone]

  • 不提出比当前数据库版本新的已执行升级。 [jone]

2.10.0 (2018-01-08)

  • 支持安装特定通用设置配置文件的提议升级。使用bin/upgrade install --proposed the.package:default。 [jone]

2.9.0 (2017-12-14)

  • 在每个升级步骤后优化内存占用。 [jone]

  • 通过垃圾回收连接缓存来减少SavepointIterator的内存占用。 [jone]

  • 将默认savepoint阈值设置为1000;使其可配置。 [jone]

  • 默认启用savepoint迭代器。影响self.objects。 [jone]

  • 在WorkflowSecurityUpdater中使用SavepointIterator以避免超出内存限制。 [mbaechtold]

2.8.1 (2017-10-13)

  • 当访问损坏的Brains的对象时,也捕获AttributeErrors。 [buchi]

2.8.0 (2017-07-27)

  • 升级步骤方法将删除和跳过损坏的目录Brains。 [jone]

2.7.2 (2017-07-13)

  • 修复ASCII终端中的编码问题。 [jone]

2.7.1 (2017-06-28)

  • 修复由不同用户创建的tempfile身份验证问题。 [jone]

2.7.0 (2017-06-28)

  • 支持使用bin/upgrade的其他用户,而安全性检查较为宽松。[jone]

2.6.1 (2017-06-28)

  • 修复了一个错误,该错误导致当 var 目录设置了 setguid 标志时,bin/upgrade 失败。[jone]

2.6.0 (2017-06-08)

  • 如果安装了 collective.indexing,则记录(重新/取消)索引进度。[deiferni]

2.5.0 (2017-06-07)

  • 添加了对 Plone 5.1 的支持。[jone]

2.4.0 (2017-06-07)

  • 在浏览器日志器中转义 < 和 >。[lknoepfel]

  • 如果日志器意外退出,则在 ProcessLogger 中记录当前项。[lknoepfel]

2.3.1 (2017-02-15)

  • 修复了在切换版本控制系统后升级时版本设置不正确的错误。[jone]

  • 在升级期间重新安装已安装的配置文件时避免覆盖自定义设置(Plone≥4.3.8)。[jone]

2.3.0 (2017-02-14)

  • InplaceMigrator:保留对象在父对象中的位置。[lknoepfel]

  • 在安装孤儿升级步骤时不要降级已安装的版本。[jone]

  • 将“soft_dependencies”选项添加到“upgrade-step:directory”指令中。[jone]

2.2.0 (2017-01-30)

  • 添加了一个方法来从持久注册表中删除以前未安装的板块管理器。[deiferni]

2.1.1 (2016-12-13)

  • 修复了对通过 tarball 上传进行 GS 导入的支持。[jone]

2.1.0 (2016-12-06)

  • 添加了升级步骤方法 ensure_profile_installed(profileid)。[jone]

  • 添加了升级步骤方法 is_profile_installed(profileid)。[jone]

  • 添加了升级步骤方法 is_product_installed(product_name)。[jone]

2.0.5 (2016-10-24)

  • 迁移:修复当文件对象为空字符串时的错误。[jone]

2.0.4 (2016-10-24)

  • 迁移:不迁移空 blob。[jone]

2.0.3 (2016-09-27)

  • 迁移:支持所有类型的标准关系字段。[jone]

2.0.2 (2016-09-27)

  • 迁移:跳过无效的关系。[jone]

2.0.1 (2016-09-02)

  • 在 @@manage-upgrades 控制面板上添加了对 jQuery 1.9+ 的支持。[neilferreira]

2.0.0 (2016-08-18)

  • 使用最新的请求模块修复 NoneType AttributeError。[jone]

  • 删除了对 Plone 4.1 和 4.2 的支持。[jone]

  • 实现原地迁移器。[jone]

1.19.0 (2016-04-11)

  • 添加了强制重新安装已安装配置文件的选项。[jone]

1.18.1 (2016-03-09)

  • 禁用授权 jsonapi 请求的自动 CSRF 保护。[jone]

1.18.0 (2016-02-16)

  • 使用 upgrade-step:directory 指令时,在升级步骤上提供 base_profiletarget_version 属性。[jone]

  • 使用 upgrade-step:directory 并具有旧的升级步骤但没有新的升级步骤时修复配置文件版本。[jone]

1.17.0 (2016-01-22)

  • 添加了 bin/upgrade plone_upgrade_needed 命令。[jone]

1.16.3 (2016-01-22)

  • 修复了具有点或其它非字母数字字符时的升级脚手架错误。[jone]

1.16.2 (2016-01-15)

  • 实际上与 1.16.1 相同,但我在发布时 PyPI 出了问题,现在它不让我使用相同的版本号。:-([jone]

1.16.1 (2016-01-13)

  • 添加了先前版本中新增功能的文档。[maurits]

1.16.0 (2016-01-05)

  • 添加了 --all-sites 选项。这将遍历所有站点并在每个站点上执行指定的命令。一个站点上的命令失败将停止整个命令。[maurits]

  • 为命令行实用程序配置日志记录。默认情况下,仅打印我们的日志,在 info 级别或更高。使用新的 --verbose 选项打印所有日志记录器(包括来自 requests 等其他包的日志)在调试级别或更高。[maurits]

  • 添加了升级 Plone 站点的 plone_upgrade 命令。这就是您在 @@plone-upgrade 视图中手动执行的操作。[maurits]

  • 添加了对安装配置文件的支持。配置文件只应用一次。例如命令行:bin/upgrade install --site Plone --profiles Products.PloneFormGen:default。[maurits]

  • 防止了在将 bin/upgrade sites 的输出通过管道传输时出现的 UnicodeEncodeError。当站点标题包含非 ascii 字符时,这将失败。[maurits]

1.15.1 (2015-11-11)

  • 将实例检测更改为支持任何名称。以前只支持“instance*”。[jone]

1.15.0 (2015-10-30)

  • 在“colors”扩展中将“blessed”依赖项设置为可选。[jone]

  • 更新intid实用程序中关于类迁移对象的引用。[deiferni]

1.14.8 (2015-09-21)

  • 使用wfhistory迁移迁移工作流程状态,除非必要,否则不要手动设置状态。[tschanzt]

1.14.7 (2015-08-27)

  • 添加一个afterCommitHook,在安装升级后通知事务已提交(或中止)。[lgraf]

  • 修复bin/upgrade命令的认证问题。[jone]

1.14.6 (2015-07-22)

  • 返回上下文管理器以允许“as”语句。[lknoepfel]

1.14.5 (2015-05-20)

  • 在升级包时更新quickinstaller产品版本。[jone]

1.14.4 (2015-04-09)

  • 修复自1.11.0以来损坏的升级后排序。[jone]

1.14.3 (2015-03-29)

  • 修复升级步骤中directory指令的错误。当目录是ZCML目录的子目录时发生错误,导致包模块被升级包目录替换为sys.modules中的升级包目录。[jone]

  • 修复存在大笔记时事务笔记长度的问题。当事务笔记已经达到最大长度(例如,与Archetypes笔记一起)时,不应再添加任何内容。同时增加了阈值(在1.14.2中减少)。[jone]

1.14.2 (2015-03-25)

  • 减少ftw.upgrade使用的最大事务笔记长度。[jone]

1.14.1 (2015-03-18)

  • 命令:修复绑定到公共接口的实例发现问题。[jone]

1.14.0 (2015-02-24)

  • 命令:当blessed无法加载时,添加模拟终端回退。例如,当Python在没有curses支持的情况下构建时,可能会发生这种情况。[jone]

  • bin/upgrade recook命令用于重新烹饪资源。[jone]

  • 安装升级后重新烹饪资源。[jone]

  • plone.reload支持升级步骤目录。[jone]

1.13.0 (2015-02-20)

  • bin/upgrade:在没有提供其他认证信息时,自动使用tempfile协商机制进行认证。[jone]

  • bin/upgrade user命令用于测试认证。[jone]

1.12.0 (2015-02-16)

  • 添加bin/upgrade命令siteslistinstall。这使得可以从控制台安装升级。[jone]

  • 更新升级步骤模板以支持plone.reload。[jone]

  • 实现了新的JSON API,可通过/upgrades-api访问。[jone]

  • 执行器:添加了install_upgrades_by_api_ids,允许通过API升级ID安装一组升级。[jone]

  • 收集器:添加了get_upgrades_by_api_ids,返回API升级ID选择集的升级信息。[jone]

  • 收集器:已弃用get_upgrades并替换为get_profiles。现在get_profiles有一个proposed_only标志。[jone]

1.11.0 (2015-01-08)

  • 反转升级后适配器的排序顺序。顺序已被反转,它应该首先执行依赖项。[jone]

  • 确保为bin/upgrade传递的参数引用。[lgraf]

  • 添加一个可以全局安装的create-upgrade脚本。[jone]

  • 创建一个bin/upgrade脚本

    • create命令在“upgrades”目录中创建一个升级步骤。

    • 可以使用touch命令对升级步骤进行排序。

    [jone]

  • 添加新的upgrade-step:directory指令以注册一个带有自动检测和注册的升级步骤的目录。[jone]

  • 扩展importProfile指令,以便可以定义处理器。处理器可以使用新方法self.install_upgrade_profile()导入相关的升级步骤配置文件。[jone]

1.10.2 (2014-11-19)

  • 从升级视图中排除未安装的产品。[jone]

  • 再次让升级以撤销形式出现。1.7.4中的事务笔记修复导致升级事务未出现在撤销形式中。[jone]

1.10.1 (2014-10-27)

  • 更新根节点的视图排序。依赖图未定义任何根配置文件(例如直接包含在buildout中)的顺序,这导致升级视图中对这些配置文件的随机排序。此更改通过不改变依赖配置文件的顺序,按名称对这些根配置文件进行排序。[jone]

1.10.0 (2014-08-28)

  • 将step.objects包裹在一个SavepointIterator中,该迭代器每n个项目创建一个保存点。[lgraf]

1.9.0 (2014-08-27)

  • 为@@manage-upgrades添加@@manage-upgrades-plain回退视图。它不包括plone的主模板,因此可能在默认视图由于某些原因失败时能够渲染。[deiferni]

1.8.0 (2014-08-11)

  • 通过在profile-id前缀为upgrade_to_来防止portal_quickinstaller选择升级步骤而不是默认配置文件(修复#45)[pbauer]

  • 标记文件系统版本过时的配置文件。突出显示导致目标版本高于相应配置文件当前文件系统版本的升级。这通常意味着有人忘记更新相应配置文件的metadata.xml中的版本。[lgraf]

1.7.4 (2014-05-12)

  • 扩展工作流更新器以迁移工作流历史。[jone]

  • 修复工作流更新器,使其始终更新对象。即使在对象似乎未更新或已不再有工作流的情况下,也会更新对象。这修复了在更新工作流时的问题,在这种情况下,旧工作流和新工作流具有相同的ID。[jone]

  • 确保事务备注不会太长。Zope限制事务备注的长度。通过积极管理事务备注,我们可以在事务备注太长时提供回退,因为在同一时间安装了大量升级步骤。[jone]

1.7.3 (2014-04-30)

  • uninstall_product方法添加到升级步骤类中。[jone]

1.7.2 (2014-02-28)

  • 在将对象迁移到新类时更新提供的接口。[jone]

1.7.1 (2014-01-09)

  • 修复在循环依赖上manage-ugprades视图的LocationError。[jone]

1.7.0 (2013-09-24)

  • update_workflow_security辅助函数添加到升级步骤中。[jone]

1.6.0 (2013-08-30)

  • 修复在遍历目录结果时更新目录时原地修改的bug。[jone]

  • 实现新的importProfile指令,用于创建仅导入特定升级步骤通用设置配置文件的升级步骤。[jone]

1.5 (2013-08-16)

  • 添加一个WorkflowChainUpdater,用于更改工作流链,而无需将现有对象重置为新工作流初始审查状态。[jone]

1.4.0 (2013-07-18)

  • 添加添加type_action的辅助器。[phgross]

  • objects方法添加到UpgradeStep中,以便轻松查询目录并执行具有进度记录的组合操作。[jone]

  • 因为更容易使用,所以将ProgressLogger也作为迭代器。[jone]

  • 改进安装升级步骤时的日志记录。显示安装的持续时间。[jone]

  • 修复Plone 4.3的升级步骤图标。[jone]

  • 添加update_security辅助器。[jone]

  • 修复由placeful workflow policy activator产生的状态信息条目不完整。[jone]

1.3 (2013-06-13)

  • 实现placeful workflow policy activator。[jone]

  • 将remove_broken_browserlayer方法添加到步骤类中。[lgraf]

1.2.1 (2013-04-23)

  • 在reindexObject中保留idxs时修改修改日期。[mathias.leimgruber]

1.2 (2013-01-24)

  • onegov.ch批准:向readme添加徽章。[jone]

  • 从内部数据结构中删除‘step’和‘for’值。这是我们需要序列化数据(json)所需的。[jone]

  • 添加IPostUpgrade适配器钩子。[jone]

  • 将依赖关系排序重构为单独的功能。[jone]

  • 添加安全声明。[jone]

  • 修复在步骤类中安装配置文件时使用工具时的错误。[jone]

1.1 (2012-10-08)

  • 将catalog_unrestricted_get_object和catalog_unrestricted_search方法添加到步骤类中。[jone]

  • 处理已删除但仍有剩余通用设置条目的包的配置文件。[jone]

1.0 (2012-08-13)

  • 将已安装的升级添加到事务备注中。关闭#7 [jone]

  • 添加 migrate_class 辅助函数,其中包含 _p_changed 实现,支持 BTreeFolder2Base 容器。[jone]

  • 删除 purge_resource_registries() 辅助函数,因为它不符合预期。[jone]

  • 将升级输出框架的最小高度设置为 500px。[jone]

  • 将异常打印到浏览器日志流。[jone]

1.0b2 (2012-07-04)

  • 修复升级注册问题(使用类方法不起作用,因为注册失败)。[jone]

  • 即使没有实际安装 GS 配置文件,也能使用 @@manage-upgrade。[maethu]

1.0b1 (2012-06-27)

  • 首次实现。[jone]

项目详情


发布历史 发布通知 | RSS 源

下载文件

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

源代码发行版

ftw.upgrade-3.3.1.tar.gz (285.8 kB 查看哈希值)

上传时间 源代码

由以下支持:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面