|   | 1 | = Trac のチケットワークフローシステム = #TheTracTicketWorkflowSystem  | 
                  
                          |   | 2 | [[TracGuideToc]]  | 
                  
                          |   | 3 |   | 
                  
                          |   | 4 | Trac のチケットデータベースはコンフィグ可能なワークフローを提供します。  | 
                  
                          |   | 5 |   | 
                  
                          |   | 6 | == デフォルトのワークフロー == #TheDefaultTicketWorkflow  | 
                  
                          |   | 7 | === 0.10 からアップグレードした Environment === #Environmentsupgradedfrom0.10  | 
                  
                          |   | 8 | `trac-admin <env> upgrade` を実行したとき、`trac.ini` に `[ticket-workflow]` セクションが追加され、 0.10 でのワークフロー (original ワークフロー) と同様のアクションをするようにデフォルトの設定値が設定されます。  | 
                  
                          |   | 9 |   | 
                  
                          |   | 10 | original ワークフローは下図を参照してください:  | 
                  
                          |   | 11 |   | 
                  
                          |   | 12 | [[Image(htdocs:../common/guide/original-workflow.png)]]  | 
                  
                          |   | 13 |   | 
                  
                          |   | 14 | original ワークフローにはいくつかの重要な "欠点" があります; 新しいチケットを承認 (accept) したときにステータスは 'assigned' に設定されますが、 'assigned' のチケットを再割り当て (reassign) するとステータスは 'new' に設定され、直観的ではありません。  | 
                  
                          |   | 15 | これは original ワークフローから "basic" ワークフローに移行することで解決します; original ワークフローから basic ワークフローへの移行には `contrib/workflow/migrate_original_to_basic.py` が役に立つかもしれません。  | 
                  
                          |   | 16 |   | 
                  
                          |   | 17 | === 0.11 で新規作成した Environment === #Environmentscreatedwith0.11  | 
                  
                          |   | 18 | 0.11 の環境が新規に作成されるとき、デフォルトのワークフローが trac.ini に構成されます。このワークフローは basic ワークフローです (basic ワークフローは `basic-workflow.ini` 内に記述されています)。 basic ワークフローは 0.10 でのワークフローとは少し違います。  | 
                  
                          |   | 19 |   | 
                  
                          |   | 20 | basic ワークフローは下図を参照してください:  | 
                  
                          |   | 21 |   | 
                  
                          |   | 22 | [[Image(htdocs:../common/guide/basic-workflow.png)]]  | 
                  
                          |   | 23 |   | 
                  
                          |   | 24 | == そのほかのワークフロー == #AdditionalTicketWorkflows  | 
                  
                          |   | 25 |   | 
                  
                          |   | 26 | Trac のソースにはいくつかのワークフローの例が含まれています; `contrib/workflow` の `*.ini` ファイル内のコンフィグセクションを参照してください。それらの一つはあなたが求めているものとマッチするかもしれません。 `contrib/workflow` の `*.ini` ファイル内のコンフィグセクションは、 `trac.ini` の `[ticket-workflow]` セクションに貼り付けて使用することができます。  | 
                  
                          |   | 27 |   | 
                  
                          |   | 28 | == 基本的なワークフローのカスタマイズ == #BasicTicketWorkflowCustomization  | 
                  
                          |   | 29 |   | 
                  
                          |   | 30 | `trac.ini` に `[ticket-workflow]` セクションを作成します。  | 
                  
                          |   | 31 | `[ticket-workflow]` セクション内の各エントリはチケットが取り得るアクションです。  | 
                  
                          |   | 32 | `simple-workflow.ini` の `accept` を例に説明します:  | 
                  
                          |   | 33 | {{{  | 
                  
                          |   | 34 | accept = new,accepted -> accepted  | 
                  
                          |   | 35 | accept.permissions = TICKET_MODIFY  | 
                  
                          |   | 36 | accept.operations = set_owner_to_self  | 
                  
                          |   | 37 | }}}  | 
                  
                          |   | 38 | 1 行目は `accept` の動作についての定義です。 `accept` は `new` と `accepted` のステータスで有効であり、ステータスが `new` か `accepted` の場合に `accept` が実行されるとステータスが `accepted` になることを表しています。  | 
                  
                          |   | 39 | 2 行目は、ユーザが `accept` を行うために必要な権限についての定義です。  | 
                  
                          |   | 40 | 3 行目は `accept` を行ったときに、同時にチケットに対して行う操作についての定義です。 `set_owner_to_self` は、チケットの所有者をログイン中のユーザに更新することを表します。同一エントリーに対して複数の定義を行う場合は、カンマ区切りのリストとして設定することが可能です。  | 
                  
                          |   | 41 |   | 
                  
                          |   | 42 | ''actionname''`.operations` で使用できる値は以下の通りです:  | 
                  
                          |   | 43 |  - del_owner -- チケットの所有者を削除します。  | 
                  
                          |   | 44 |  - set_owner -- チケットの所有者を選択された所有者か入力された所有者に設定します。  | 
                  
                          |   | 45 |    - ''actionname''`.set_owner` カンマ区切りのリストか1つの値を設定することができます。  | 
                  
                          |   | 46 |  - set_owner_to_self -- チケットの所有者をログインユーザに設定します。  | 
                  
                          |   | 47 |  - del_resolution -- チケットの解決方法を削除します。  | 
                  
                          |   | 48 |  - set_resolution -- チケットの解決方法を選択された解決方法か入力された解決方法に設定します。  | 
                  
                          |   | 49 |    - ''actionname''`.set_resolution` カンマ区切りのリストか1つの値を設定することができます。  | 
                  
                          |   | 50 | {{{  | 
                  
                          |   | 51 | 例:  | 
                  
                          |   | 52 |   | 
                  
                          |   | 53 | resolve_new = new -> closed  | 
                  
                          |   | 54 | resolve_new.name = resolve  | 
                  
                          |   | 55 | resolve_new.operations = set_resolution  | 
                  
                          |   | 56 | resolve_new.permissions = TICKET_MODIFY  | 
                  
                          |   | 57 | resolve_new.set_resolution = invalid,wontfix  | 
                  
                          |   | 58 | }}}  | 
                  
                          |   | 59 |  - leave_status -- "変更しない 現在のステータス: <現在のステータス>" (英語版では "leave as <current status>") を表示してチケットへの変更を行いません。  | 
                  
                          |   | 60 | '''Note:''' `set_owner` と `del_owner` などのように相反する操作を同時に指定した場合の動作は不定です。  | 
                  
                          |   | 61 |   | 
                  
                          |   | 62 | {{{  | 
                  
                          |   | 63 | resolve_accepted = accepted -> closed  | 
                  
                          |   | 64 | resolve_accepted.name = resolve  | 
                  
                          |   | 65 | resolve_accepted.permissions = TICKET_MODIFY  | 
                  
                          |   | 66 | resolve_accepted.operations = set_resolution  | 
                  
                          |   | 67 | }}}  | 
                  
                          |   | 68 |   | 
                  
                          |   | 69 | `.name` 属性を使用した場合の例です。この例のアクションは `resolve_accepted` ですが、 `.name` で別名を付けることによって、ユーザからは `resolve` として見えます。  | 
                  
                          |   | 70 |   | 
                  
                          |   | 71 | すべてのステータスで利用可能なアクションであることを表す値として、 `*` を使用することができます。分かりやすい例は `leave` です:  | 
                  
                          |   | 72 | {{{  | 
                  
                          |   | 73 | leave = * -> *  | 
                  
                          |   | 74 | leave.operations = leave_status  | 
                  
                          |   | 75 | leave.default = 1  | 
                  
                          |   | 76 | }}}  | 
                  
                          |   | 77 | これは '.default' 属性の使用例でもあります。 `.default` 属性の値は整数であることを期待します。そして、アクションが表示される順番は `.default` 属性の値で決まります。 `.default` の値が最も大きいアクションが最初に表示され、デフォルトで選択されます。残りのアクションは `.default` の値に従い、降順で表示されます。 `.default` の値を指定しない場合のデフォルト値は0になります。  | 
                  
                          |   | 78 | `.default` の値には負の値を指定することもできます。  | 
                  
                          |   | 79 |   | 
                  
                          |   | 80 | ワークフローにはハードコードされた 2, 3 の制限があります。新しく作成されたチケットのステータスは `new` になり、チケットには `closed` のステータスが存在する必要があります。さらにデフォルトのレポート/カスタムクエリでは `closed` 以外のすべてのステータスをアクティブなチケットとして扱います。  | 
                  
                          |   | 81 |   | 
                  
                          |   | 82 | ワークフローを作成・編集するのに `contrib/workflow/workflow_parser.py` が役に立つかもしれません。 `contrib/workflow/workflow_parser.py` は [http://www.graphviz.org GraphViz] が理解でき、ワークフローを視覚化するための `.dot` ファイルを作ることができます。  | 
                  
                          |   | 83 |   | 
                  
                          |   | 84 | 以下に例を示します (インストールパスは環境により異なる場合があります) 。  | 
                  
                          |   | 85 | {{{  | 
                  
                          |   | 86 | cd /var/local/trac_devel/contrib/workflow/  | 
                  
                          |   | 87 | sudo ./showworkflow /srv/trac/PlannerSuite/conf/trac.ini  | 
                  
                          |   | 88 | }}}  | 
                  
                          |   | 89 | 実行結果は `trac.pdf` として出力されます。 (`trac.ini` 同じディレクトリに出力されます。)  | 
                  
                          |   | 90 |   | 
                  
                          |   | 91 | ワークフローを変更した後に、 Apache (サーバ) を再起動する必要があります。サーバの再起動が行われるまでは変更が適用されず変更前のワークフローが実行されることになります。  | 
                  
                          |   | 92 |   | 
                  
                          |   | 93 | == 例: ワークフローにテストを追加する == #Example:AddingoptionalTestingwithWorkflow  | 
                  
                          |   | 94 |   | 
                  
                          |   | 95 | trac.ini の [ticket-workflow] セクションに以下の記述を追加することで optional testing を実現できます。チケットのステータス (status) が new, accepted, needs_work の場合にチケットを testing 状態に遷移させることができます。 testing ステータスでは reject して needs_work 状態に戻すか、 pass して closed 状態に進めることができます。 pass させた場合、 closed での解決方法 (resolution) は自動的に fixed に設定されます。以前のワークフローはそのまま残っているので、このセクションで設定した内容をスキップすることもできます。 (訳注: 通常、チケットのクローズを行うためには TICKET_MODIFY 権限が必要です。このワークフローでは testing 状態からのクローズには権限が不要なので、報告者 (reporter) に修正結果をテストしてもらう場合などに有効です)  | 
                  
                          |   | 96 |   | 
                  
                          |   | 97 | {{{  | 
                  
                          |   | 98 | testing = new,accepted,needs_work -> testing  | 
                  
                          |   | 99 | testing.name = Submit to reporter for testing  | 
                  
                          |   | 100 | testing.permissions = TICKET_MODIFY  | 
                  
                          |   | 101 |   | 
                  
                          |   | 102 | reject = testing -> needs_work  | 
                  
                          |   | 103 | reject.name = Failed testing, return to developer  | 
                  
                          |   | 104 |   | 
                  
                          |   | 105 | pass = testing -> closed  | 
                  
                          |   | 106 | pass.name = Passes Testing  | 
                  
                          |   | 107 | pass.operations = set_resolution  | 
                  
                          |   | 108 | pass.set_resolution = fixed  | 
                  
                          |   | 109 | }}}  | 
                  
                          |   | 110 |   | 
                  
                          |   | 111 | == 例: new チケットでの解決方法 (resolution) を制限する == #Example:Limittheresolutionoptionsforanewticket  | 
                  
                          |   | 112 |   | 
                  
                          |   | 113 | resolve_new という操作では、 new 状態のチケットで使用可能な、解決方法 (resolution) を設定しています。既に存在する resolve アクションを変更し、 `->` の前から new のステータスを削除することで、2種類の resolve アクションが使用できるようになっています。 new のチケットでは制限された解決方法 (resolution) となり、それ以外の一旦 accept されたチケットでは通常通りとなります。  | 
                  
                          |   | 114 |   | 
                  
                          |   | 115 | {{{  | 
                  
                          |   | 116 | resolve_new = new -> closed  | 
                  
                          |   | 117 | resolve_new.name = resolve  | 
                  
                          |   | 118 | resolve_new.operations = set_resolution  | 
                  
                          |   | 119 | resolve_new.permissions = TICKET_MODIFY  | 
                  
                          |   | 120 | resolve_new.set_resolution = invalid,wontfix,duplicate  | 
                  
                          |   | 121 |   | 
                  
                          |   | 122 | resolve = assigned,accepted,reopened -> closed  | 
                  
                          |   | 123 | resolve.operations = set_resolution  | 
                  
                          |   | 124 | resolve.permissions = TICKET_MODIFY  | 
                  
                          |   | 125 | }}}  | 
                  
                          |   | 126 |   | 
                  
                          |   | 127 | == 高度なワークフローのカスタマイズ == #AdvancedTicketWorkflowCustomization  | 
                  
                          |   | 128 |   | 
                  
                          |   | 129 | ここまでのカスタマイズで十分でないならば、プラグインを使用することでワークフローのさらなる拡張が可能です。プラグインを使用すると、ワークフローに (code_review のような) 操作を追加できます。また、単純なステータスの変更だけでない (トリガを構築するなどの) 2 次的な操作を実行することができます。いくつかの簡単な例は [http://trac.edgewall.org/browser/trunk/sample-plugins/workflow sample-plugins/workflow] を参照してください。  | 
                  
                          |   | 130 |   | 
                  
                          |   | 131 | プラグインを使用した拡張でさえも十分でないならば !ConfigurableTicketWorkflow のコンポーネントを無効にし、!ConfigurableTicketWorkflow  を完全に置き換える十分な機能を持ったプラグインを作成することも可能です。  | 
                  
                          |   | 132 |   | 
                  
                          |   | 133 | == 次のステップに向けたアイデア集 == #someideasfornextsteps  | 
                  
                          |   | 134 |   | 
                  
                          |   | 135 | (訳注: この項はワークフローシステムの実装に関するアイデア集です。現在実装されているものではないので、プラグインを作成するときなどに参考にしてください)  | 
                  
                          |   | 136 |   | 
                  
                          |   | 137 | New enhancement ideas for the workflow system should be filed as enhancement tickets against the `ticket system` component.  If desired, add a single-line link to that ticket here.  | 
                  
                          |   | 138 |   | 
                  
                          |   | 139 | If you have a response to the comments below, create an enhancement ticket, and replace the description below with a link to the ticket.  | 
                  
                          |   | 140 |   | 
                  
                          |   | 141 |  * the "operation" could be on the nodes, possible operations are:  | 
                  
                          |   | 142 |    * '''preops''': automatic, before entering the state/activity  | 
                  
                          |   | 143 |    * '''postops''': automatic, when leaving the state/activity  | 
                  
                          |   | 144 |    * '''actions''': can be chosen by the owner in the list at the bottom, and/or drop-down/pop-up together with the default actions of leaving the node on one of the arrows.  | 
                  
                          |   | 145 | This appears to add complexity without adding functionality; please provide a detailed example where these additions allow something currently impossible to implement.  | 
                  
                          |   | 146 |   | 
                  
                          |   | 147 |  * operations could be anything: sum up the time used for the activity, or just write some statistical fields like   | 
                  
                          |   | 148 | A workflow plugin can add an arbitrary workflow operation, so this is already possible.  | 
                  
                          |   | 149 |   | 
                  
                          |   | 150 |  * set_actor should be an operation allowing to set the owner, e.g. as a "preop":  | 
                  
                          |   | 151 |    * either to a role, a person  | 
                  
                          |   | 152 |    * entered fix at define time, or at run time, e.g. out of a field, or select.  | 
                  
                          |   | 153 | This is either duplicating the existing `set_owner` operation, or needs to be clarified.  | 
                  
                          |   | 154 |   | 
                  
                          |   | 155 |  * Actions should be selectable based on the ticket type (different Workflows for different tickets)  | 
                  
                          |   | 156 | This is becoming a frequent request, with clear usecases.  The closest the current implementation will allow is to have a plugin provide a `triage` action that sets the next state based on the ticket type, so a `new` ticket would move to `new_task`, `new_defect`, etc., and the workflow graph would separate at that point.  |