Redmineのプラグイン開発をしているときに、忘れてしまいそうな事、すぐに忘れてしまうことを備忘として残している、個人的なメモ。
作成したプラグイン
https://github.com/momibun926/redmine_issue_evm
日付関連
日付、時間の表示形式はRedmineで使われている形式に合わせる。
- format_date
<%= format_date(baseline.minimum_start_date) %>
- format_time
<%= format_time(baseline.updated_on) %>
Ruby Holidays Gemを使って祝日を把握。事前に読み込んでおかないと使えなかった。
init.rb
Holidays.load_all
検索、活動関連
しばらく実現できなくて悩んだ挙句、なんとか実装できているっぽい。正直ちゃんと理解できていない。
# for activity page.
acts_as_event title: Proc.new { |o| "タイトルに表示したい文言"},
description: :description, <-モデルのカラムを指定
datetime: :updated_on, <-モデルの更新日
type: Proc.new { |o| "evmbaseline-" + (o.created_on < o.updated_on ? "edit" : "new") },
url: Proc.new { |o| { controller: "evmbaselines", action: :show, project_id: o.project, id: o.id } } <-モデルのVIEWに飛ばしたいときに指定
acts_as_activity_provider scope: joins(:project),
permission: :view_evmbaselines, <-プラグインのパーミッションを指定
type: "evmbaseline",
author_key: :author_id
# for search.
acts_as_searchable columns: ["#{table_name}.subject", "#{table_name}.description"], <-検索対象にしたいカラム
preload: :project,
date_column: :updated_on
チケット関連
直近の進捗率を変更した日付が欲しくてジャーナルを検索して取るようにした。
Journal.where(journalized_id: ”知りたいチケットのIDを指定”, journal_details: { prop_key: "done_ratio" }).
joins(:details).
maximum(:created_on)
子、孫、、プロジェクトすべてのチケットを検索する。
@project = Project.find(params[:project_id])
Issue.cross_project_scope(@project, "descendants")
上記の検索に対して、条件(Where)を可変にしたいとき、こんな感じのメソッド作って、条件をHashで渡す。条件が指定されていなければ、ALLで検索する。
def evm_issues(proj, condition = " 1 = 1 ")
Issue.cross_project_scope(proj, "descendants").
where(SQL_COM.to_s).
where(condition)
end
使い方。子孫プロジェクトすべてから指定したTrackerのチケット取得する
@project = Project.find(params[:project_id])
condition = { tracker_id: 取得しいTrackerのID }
tracker_issues = evm_issues @project, condition