Show page source of plugins/ReportIncludePlugin #67073

= ReportIncludePlugin =
== 説明 ==
以下のようにWikiにマクロを記載することで、TracReportで定義されているレポートを表示します。
また、オプションを設定することで、レポートの表からグラフを生成することもできます。
{{{
[[ReportInclude(args1,args2,...)]]
}}}

args:
 * 表示したいTracReportのIDを指定します。必ず第1引数に指定する必要があります。動的変数にも対応しています。書式は、IDの後ろに?をつけて指定します。
 * title: レポート、グラフのタイトル文字列を指定することができます。コロンに続けてタイトル文字列を指定します。未指定の場合は、TracReportのタイトル文字列が自動的に使用されます。
 * graph: グラフも合わせて表示する場合に指定します。コロンに続けて、以下の記載が可能です。
   * lines[[BR]]
     折れ線グラフを表示します。
   * bars[[BR]]
     棒グラフを表示します。
 * stack: グラフ表示時に、スタック(積み上げ)グラフとするかどうか指定します。コロンに続けて、以下の記載が可能です。
   * true[[BR]]
     スタック(積み上げ)グラフとして表示します。
   * false[[BR]]
     スタック(積み上げ)グラフとして表示しません。
 * legendLoc: グラフの凡例の表示位置を指定します。コロンに続けて、方角を示す nw, n, ne, e, se, s, sw, w のいずれかを指定します。
 * legendXOffset: グラフの凡例位置の横方向のオフセットを指定します。未指定の場合は12となります。
 * legendYOffset: グラフの凡例位置の縦方向のオフセットを指定します。未指定の場合は12となります。
 * dateFormat: X軸の値を日付としてグラフ表示する場合の、日付フォーマットを指定します。コロンに続けて、yyyy/MM/dd のように指定します。未指定の場合は、デフォルト値としてyyyy-MM-ddを使用します。
 * width: グラフの幅をpx単位で指定します。未指定の場合は536pxとなります。 
 * height: グラフの高さをpx単位で指定します。未指定の場合は300pxとなります。
 * table: TracReportのテーブルを出力を制御できます。コロンに続けて、以下の記載が可能です。
   * hide[[BR]]
     テーブルを表示しません。グラフのみを表示する場合に使用します。
 * async: 非同期でレポート、グラフを描画するかどうか指定します。コロンに続けて、以下の記載が可能です。未指定の場合は、trueとなります。
   * true[[BR]]
     非同期で描画します。
   * false[[BR]]
     非同期で描画しません。
 * xaxisFormatString: X軸のラベルのフォーマットを指定します。X軸が数値か日付によって指定方法が異なります。
   * 数値の場合。未指定の場合は、%.1fとなります。以下のように整数値、少数値の指定が可能です。
     * %d[[BR]]
       整数値で表示します。
     * %.1f[[BR]]
       小数点1桁までで表示します。
   * 日付の場合。未指定の場合は、%Y/%m/%dとなります。
 * yaxisFormatString: Y軸のラベルのフォーマットを指定します。指定可能な値は、上記のX軸の数値と同じです。
 * xaxisMin: X軸の最小値を指定します。指定しない場合は、グラフデータより自動的に計算されます。
 * xaxisMax: X軸の最大値を指定します。指定しない場合は、グラフデータより自動的に計算されます。
 * yaxisMin: Y軸の最小値を指定します。指定しない場合は、グラフデータより自動的に計算されます。
 * yaxisMax: Y軸の最大値を指定します。指定しない場合は、グラフデータより自動的に計算されます。

表からグラフの生成は、以下のルールに従って行われます。
 * 一番左の列が、X軸の値になります。
  * デフォルトではyyyy-MM-dd形式の場合は日付と見なして、時系列データとして扱います。
 * 2列目以降がグラフのデータとなります。
 * ヘッダ行の値がラベルになります。

例:
 * report:1 を表示する。
{{{
[[ReportInclude(1)]]
}}}
 * report:9 を棒グラフととともに表示する。
{{{
[[ReportInclude(9,graph:bars)]]
}}}
 * report:14 を折れ線グラフで表示する。テーブルは表示しない。
{{{
[[ReportInclude(14,graph:lines,table:hide)]]
}}}
 * report:20 を積み上げ棒グラフで表示する。
{{{
[[ReportInclude(20,graph:bars,stack:true)]]
}}}
 * TracReportの動的変数に値を渡して表示する。
{{{
[[ReportInclude(14?PRIORITY=high)]]
}}}
 * TracReportの動的変数にログインユーザ名($USER)を渡して表示する。(0.4.3以降)
{{{
[[ReportInclude(8?USER=$USER)]]
}}}
   * ReportIncludeマクロでは現在TracReportのログインユーザ名($USER)をレポート表示時に自動展開できません。[[BR]]ReportIncludeマクロで表示する際には、動的パラメータとして$USERを渡すようにしてください。


== TracReport集 ==
ReportIncludePluginを使用するには、TracReportを定義する必要があります。TracReportの内容次第で、様々なレポート、グラフを出力することができます。ここでは、役立ちそうなTracReportのSQL文を紹介します(変なSQLありましたら指摘してください)。

=== 対応中の担当チケット数(担当者別表示)を表示する ===
{{{
SELECT t.owner AS 担当者, count(*) AS "担当チケット件数(総計)"
  FROM ticket t
  WHERE t.status <> 'closed'
  GROUP BY t.owner
  ORDER BY "担当チケット件数(総計)" DESC
}}}
==== グラフ表示例 ====
{{{
[[ReportInclude(15,graph:bars,table:hide)]]
}}}
 [[Embed(graph1.png)]]
[[BR]]

=== 対応済みも含めて担当チケット数(担当者別表示)を表示する ===
{{{
SELECT open.owner AS 担当者,
    open.open_count AS "担当チケット件数(Open)",
    closed.closed_count AS "担当チケット件数(Closed)"
  FROM
    (SELECT owner, count(*) AS open_count FROM ticket WHERE status <> 'closed' GROUP BY owner) open,
    (SELECT owner, count(*) AS closed_count FROM ticket WHERE status = 'closed' GROUP BY owner) closed
  WHERE open.owner = closed.owner
  ORDER BY open.open_count DESC
}}}
==== グラフ表示例 ====
{{{
[[ReportInclude(14,graph:bars,stack:true,table:hide)]]
}}}
 [[Embed(graph2.png)]]
[[BR]]

=== チケットの登録数、クローズ数の累計を表示する ===
{{{
SELECT a.Date AS 日付, sum(b.登録数) AS 累計登録数, sum(b.クローズ数) AS 累計クローズ数 FROM

(SELECT tm AS Date, sum(delta1) AS 登録数, sum(delta2) AS クローズ数
 FROM (SELECT id, date(time,'unixepoch') tm, 1 delta1, 0 delta2 FROM ticket
       UNION ALL
       SELECT t.id id, date(tc.time,'unixepoch') tm, 0 delta1, (CASE tc.newvalue WHEN 'closed' THEN 1 ELSE -1 END) delta2
         FROM ticket t
         JOIN ticket_change tc ON t.id=tc.ticket AND tc.field='status' AND (tc.newvalue='closed' or tc.oldvalue='closed'))
 GROUP BY tm) a,

(SELECT tm AS Date, sum(delta1) AS 登録数, sum(delta2) AS クローズ数
 FROM (SELECT id, date(time,'unixepoch') tm, 1 delta1, 0 delta2 FROM ticket
       UNION ALL
       SELECT t.id id, date(tc.time,'unixepoch') tm, 0 delta1, (CASE tc.newvalue WHEN 'closed' THEN 1 ELSE -1 END) delta2
         FROM ticket t
         JOIN ticket_change tc ON t.id=tc.ticket AND tc.field='status' AND (tc.newvalue='closed' or tc.oldvalue='closed'))
 GROUP BY tm) b

WHERE strftime('%s',a.Date) >= strftime('%s',b.Date)
GROUP BY a.Date
}}}
Trac0.12の場合は、次のようにする。
{{{
SELECT a.Date ,sum(b.登録数) AS 累計登録数, sum(b.クローズ数) AS 累計クローズ数 FROM

(SELECT tm AS Date, sum(delta1) AS 登録数, sum(delta2) AS クローズ数
 FROM (SELECT id, date(time*1e-6,'unixepoch') tm, 1 delta1, 0 delta2 FROM ticket
       UNION ALL
       SELECT t.id id, date(tc.time*1e-6,'unixepoch') tm, 0 delta1, (CASE tc.newvalue WHEN 'closed' THEN 1 ELSE -1 END) delta2
         FROM ticket t
         JOIN ticket_change tc ON t.id=tc.ticket AND tc.field='status' AND (tc.newvalue='closed' or tc.oldvalue='closed'))
 GROUP BY tm) a,

(SELECT tm AS Date, sum(delta1) AS 登録数, sum(delta2) AS クローズ数
 FROM (SELECT id, date(time*1e-6,'unixepoch') tm, 1 delta1, 0 delta2 FROM ticket
       UNION ALL
       SELECT t.id id, date(tc.time*1e-6,'unixepoch') tm, 0 delta1, (CASE tc.newvalue WHEN 'closed' THEN 1 ELSE -1 END) delta2
         FROM ticket t
         JOIN ticket_change tc ON t.id=tc.ticket AND tc.field='status' AND (tc.newvalue='closed' or tc.oldvalue='closed'))
 GROUP BY tm) b

WHERE strftime('%s',a.Date) >= strftime('%s',b.Date)
GROUP BY a.Date
}}}
==== グラフ表示例 ====
{{{
[[ReportInclude(13,graph:lines,table:hide)]]
}}}
 [[Embed(graph3.png)]]
[[BR]]

== ソース ==
[http://svn.sourceforge.jp/svnroot/shibuya-trac/plugins/reportincludeplugin/trunk/0.11 sf.jpのSVNリポジトリ]から取得できます。

== セットアップ方法 ==
チェックアウトしたフォルダにて、下記を実行してパッケージをインストールしてください。
{{{
> python setup.py bdist_egg
}}}

distフォルダが作成されます。その中にある*.eggファイルを、TracEnvのplugins ディレクトリにコピーしてください。

== 免責事項 ==
本ソフトウェアは使用者の責任において利用してください。
このプラグインによって発生した、いかなる障害・損害も作成者は一切責任を負わないものとします。