Redmine wikiマクロを作成する方法5(特定のユーザーのチケット状態の確認)
Redmine Advent Calendar 2024の13日目の記事として作成しました。
今年のRedmine Advent Calendarに空白が多く残っており、クリスマスが過ぎる前までになんとか空白の日付の記事を書いて、空白の日付を埋めることを優先して記事を作成しました。そのため、濃くない内容の記事になるかもしれませんが、ご容赦ください。
完成形
今回の開発では、下図のように、wikiマクロで特定のユーザーのチケット状態を表示します。
背景
Redmineには自作のwikiマクロを作成して登録することができます。
その方法としてはプラグインを作成しますがwikiマクロの登録のためのプラグインは比較的開発が簡単であるため、プラグインを作ったことがない方でも簡単に試してみることができるメリットがあります。
wikiマクロでは色々な処理をすることができるためRedmineの構造を理解したり、Rubyを理解したり、プラグインの仕組みを理解したりするためには良い教材になるかと思います。
今年のRedmine Advent Calendarを通して、何回かに分けてwikiマクロの作り方を紹介したいと思います。
今回の記事では「Redmine wikiマクロを作成する方法5」として「特定のユーザーのチケット状態の確認」する方法を説明します。
前提条件:
使用するwikiマクロ登録用プラグインはRedmine wikiマクロを作成する方法1で説明したプラグインを使用します。/plugins/wiki_macro_plugin/init.rbの「init.rb」ファイルにwikiマクロを登録します。
1. マクロを実装
- /plugins/wiki_macro_plugin/init.rbの「
init.rb
」ファイルを編集して、Wikiマクロを登録します:Redmine::Plugin.register :wiki_macro_plugin do 省略 end Redmine::WikiFormatting::Macros.register do desc "Show tasks assigned to a specific user" macro :user_tasks do |obj, args| user = User.find_by_login(args.first) if user issues = Issue.open.where(assigned_to_id: user.id).visible if issues.any? calendar = "#{user.name}のタスク<br>" calendar << "<table border='1' style='border-collapse: collapse; width: 100%;'>" calendar << "<tr><th>#</th><th>題名</th><th>開始日</th><th>期日</th><th>状態</th><th>進捗率</th></tr>" issues.each do |issue| days_info = if issue.due_date days_left = (issue.due_date - Date.today).to_i if days_left > 0 "期日まで #{days_left}日" elsif days_left == 0 "今日が期日" else "<font color='red'>#{days_left.abs}日 遅れ</font>" end else "期日未設定" end calendar << "<tr>" calendar << "<td>#{link_to("##{issue.id}", issue_path(issue))}</td>" calendar << "<td>#{issue.subject}</td>" calendar << "<td>#{issue.start_date || 'N/A'}</td>" calendar << "<td>#{issue.due_date || 'N/A'}</td>" calendar << "<td>#{days_info}</td>" calendar << "<td>#{issue.done_ratio}%</td>" calendar << "</tr>" end calendar << "</table>" calendar.html_safe else "タスクがありません。" end else "User not found." end end end
以下、コードを1行ずつ解説します。
Redmine::WikiFormatting::Macros.register do
- 説明: Redmineに新しいWikiマクロを登録するための宣言です。このブロック内でカスタムマクロを定義します。
desc "Show tasks assigned to a specific user"
- 説明: マクロの説明を定義します。
macro :user_tasks do |obj, args|
-
説明:
:user_tasks
という名前のWikiマクロを定義します。 -
引数:
-
obj
: 現在のWikiページやプロジェクトなどのコンテキストオブジェクト。 -
args
: マクロに渡された引数の配列。
-
user = User.find_by_login(args.first)
- 説明: 引数から取得したユーザーログイン名でユーザーを検索します。
if user
- 説明: ユーザーが見つかった場合の処理を開始します。
issues = Issue.open.where(assigned_to_id: user.id).visible
- 説明: 指定されたユーザーに割り当てられた、現在「オープン」状態のタスクを取得します。また、ユーザーが閲覧可能なタスクのみを含めます。
if issues.any?
- 説明: 該当するタスクが存在する場合の処理を開始します。
calendar = "#{user.name}のタスク<br>"
calendar << "<table border='1' style='border-collapse: collapse; width: 100%;'>"
- 説明: タスクを表形式で表示するためのHTMLテーブルの開始タグを作成します。
calendar << "<tr><th>#</th><th>題名</th><th>開始日</th><th>期日</th><th>状態</th><th>進捗率</th></tr>"
issues.each do |issue|
-
説明: 取得したタスク(
issues
)を1件ずつ処理します。
days_info = if issue.due_date
- 説明: タスクの期日が設定されているか確認します。
days_left = (issue.due_date - Date.today).to_i
- 説明: 今日の日付を基準に、期日までの日数を計算します。
if days_left > 0
"期日まで #{days_left}日"
- 説明: 期日が将来の場合、残りの日数を表示します。
elsif days_left == 0
"今日が期日"
- 説明: 期日が今日の場合、「今日が期日」というメッセージを表示します。
else
"<font color='red'>#{days_left.abs}日 遅れ</font>"
- 説明: 期日が過去の場合、遅延日数を赤字で表示します。
end
else
"期日未設定"
calendar << "<tr>"
- 説明: 新しいテーブル行を開始します。
calendar << "<td>#{link_to("##{issue.id}", issue_path(issue))}</td>"
calendar << "<td>#{issue.subject}</td>"
-
説明: タスクの題名(
subject
)を表示します。
calendar << "<td>#{issue.start_date || 'N/A'}</td>"
calendar << "<td>#{issue.due_date || 'N/A'}</td>"
calendar << "<td>#{days_info}</td>"
- 説明: 計算した期日情報(残り日数、遅延など)を表示します。
calendar << "<td>#{issue.done_ratio}%</td>"
-
説明: タスクの進捗率(
done_ratio
)をパーセントで表示します。
calendar << "</tr>"
- 説明: テーブル行の終了タグを追加します。
end
- 説明: タスクごとの繰り返し処理を終了します。
calendar << "</table>"
- 説明: HTMLテーブルの終了タグを追加します。
calendar.html_safe
- 説明: HTMLの内容をそのまま出力するよう指定します(エスケープを無効化)。
else
"タスクがありません。"
- 説明: 該当するタスクがない場合のメッセージを返します。
else
"User not found."
- 説明: ユーザーが見つからない場合のエラーメッセージを返します。
end
end
- 説明: マクロ定義の終了部分です。
2. マクロの使い方:
wikiページで下記の形式でwikiマクロを実行します。
{{user_tasks(username)}}
「#」欄のチケット番号をクリックすると、該当のチケットの詳細ページに移動できます。
感想
- wikiマクロ登録用のプラグインがあれば、簡単にwikiマクロを登録できることが分かります。
- 特定のユーザーが担当しているチケットの開始日、期日、状態、進捗率を一覧で確認することができます。
- 特定のユーザーが担当しているチケットの取得など、Redmineプラグインで必要な要素技術の習得に寄与します。
- 該当のチケットの詳細ページに簡単に移動することが可能。
- 引数としてプロジェクト情報は与えていないため、プロジェクトに関係なく該当ユーザーが担当している全てのチケットが表示されてしまいます。セキュリティ上、よろしくないので、引数にプロジェクトを指定して、該当プロジェクトでのみの、特定のユーザーのチケット情報が表示されるように、今後、改善の余地はある。
この記事の作成者の紹介
山崎進
- Redmine、Jquery、JavaScript,Rails、Ruby、SQL、VBA、RPAの開発を行なっています。
- 自動化、業務の効率化に高い関心があります。
- 下記の媒体で情報を発信しています。Redmineのプラグインの開発などに対応が可能ですので、お気軽にご連絡ください。
* Qiita:https://qiita.com/ankosoft
* Twitter:https://twitter.com/yamasaki24
* Redmine Advent Calendarで記事投稿
* redmine.tokyoで講演多数
* Redmine Japan Vol.1 前夜祭、Redmine Japan Vol.3で講演
* https://ankosoft.co.jp/blog/
* https://technology.ankosoft.co.jp/
関連記事(2024年のRedmine Advent Calendarの記事です。)
* Redmine wikiマクロを作成する方法2(完了チケットの割合をグラフで表示)
* Redmine wikiマクロを作成する方法3(ステータスごとのチケットの割合をグラフで表示)
* Redmine wikiマクロを作成する方法4(ステータスごとのチケットの割合を一つのグラフで表示)
* Redmine wikiマクロを作成する方法5(特定のユーザーのチケット状態の確認)
関連記事(2023年のRedmine Advent Calendarの記事です。)
* JqueryでRedmineのメニューにアイコンを入れる方法
* JqueryでRedmineのメニューを閉じたり開いたりする方法
* JqueryでRedmineの「活動ページ」をもっと便利に(タイトルを開閉したり、曜日を入れたり)
* JqueryでRedmineの「活動ページ」をもっと便利に②(フィルタリング機能と移動機能)
* JqueryでRedmineの「wikiページ」をもっと便利に(フィルタリング機能と移動機能)
* JqueryでRedmineの「チケットページ」をもっと便利に(年ごと、月ごと、四半期ごとの集計機能の開発)