1

カスタムコンテンツタイプのサイトがあり、Content最初は単一のワークフローが添付されていましたcontent_workflow。の既存のインスタンスは数千ありますContent

このタイプに2番目のワークフローを追加する必要がありますcontent_beta_workflow。既存のすべてのコンテンツを更新して新しいワークフローの一部にするにはどうすればよいですか?

関連する注意事項:最初のワークフローの名前をに変更したい場合、content_alpha_workflowこの変更を反映するために既存のすべてのコンテンツを更新するにはどうすればよいですか?

4

2 に答える 2

1

あるワークフローから別のワークフローに変更するだけの場合は、次の手順に従います。

  1. [サイトの設定]>[タイプ]に移動します
  2. ドロップダウンメニューからカスタムコンテンツタイプを選択すると、ページが更新されて現在のワークフローが表示されます
  3. ドロップダウンから新しいワークフローを選択すると、現在のワークフローの各状態を示すマップが生成されます
  4. 状態ごとに、新しいワークフローで最も一致する(または最も適切な)状態を選択します

保存すると、カスタムサイトのすべてのオブジェクトが更新され、新しいワークフローが使用されます。元のワークフローのマップ内の各状態について、その状態の既存のコンテンツは、上記の手順4で選択した状態になります。セキュリティ設定のインデックスが再作成され、完了です。

古いワークフローの名前の変更については、ZMIのportal_workflowツールで行うことができます。ただし、ワークフローの人間向けのタイトルのみを変更してください。IDを変更すると、コンテンツのワークフロー履歴に副作用が生じる可能性があります。

編集

さて、あなたのコメントから、あなたはすでに持っているものに加えて、新しいワークフローをタイプに追加しようとしていることがわかります。これを実現するためのサンプルコードを次に示します。

my_type = 'Content' # This is your content portal_type name
my_wf = 'content_workflow_beta'
wf_chain = list(wf_tool.getChainForPortalType(my_type))
if my_wf not in wf_chain:
    wf_chain.append(my_wf)
wf_tool.setChainForPortalTypes([my_type], wf_chain)

このコードは、コンテンツタイプとワークフローを定義するパッケージのアップグレード手順で追加できます。ワークフローツールにへの呼び出しを追加するとupdateRoleMappings、元のワークフローに加えて、標準のPloneUIを介して新しいワークフローを使用するように設定されます。

すでに知っているように、すべてのオブジェクトのワークフロー履歴を手動で更新してワークフローIDの名前を変更することもできますが、これはかなり侵襲的な手順です。

于 2012-09-10T05:21:32.267 に答える
0

workflow_history各コンテンツアイテムのプロパティと同様dictに、必要に応じて適切なアイテムを追加または更新する場合でした。まず、GenericSetupforをにコピーしましcontent_workflowcontent_alpha_workflow。次に、それを作成content_beta_workflowしてプロファイルに追加しました。次に、次のアップグレード手順を作成しました。

import logging
from DateTime import DateTime

def modify_content_workflow_history(context, logger=None):
    if logger is None: logger = logging.getLogger('my.product')

    # import the new workflows
    context.portal_setup.runImportStepFromProfile('profile-my.product:default', 'workflow')

    # set up some defaults for the new records
    _history_defaults = dict(
        action = None,
        actor = 'admin',
        comments = 'automatically created by update v2',
        time = DateTime(),        
    )
    _alpha_defaults = dict(review_state = 'alpha_state_1', **_history_defaults)
    _beta_defaults = dict(review_state = 'beta_state_1', **_history_defaults)

    for parent in context.parents.values():
        for content in parent.content.values():

            # don't acquire the parent's history
            if 'parent_workflow' in content.workflow_history:
                content.workflow_history = {}

            # copy content_workflow to content_alpha_workflow
            if 'content_workflow' in content.workflow_history:
                alpha_defaults = context.workflow_history['content_workflow']
                del content.workflow_history['content_workflow']
            else:
                alpha_defaults = (_alpha_defaults,) # must be a tuple
            content.workflow_history['ctcc_content_alpha_workflow'] = alpha_defaults

            # create the beta workflow with a modified actor
            beta_defaults = dict(**_beta_defaults)
            beta_defaults['actor'] = u'%suser' % parent.id
            content.workflow_history['ctcc_content_beta_workflow'] = (beta_defaults,)

    logger.info('Content workflow history updated')
于 2012-09-11T04:27:37.843 に答える