久しぶりに印象に残ったRedmineの改善


原田です。

先日加湿器を購入しました。在宅中は加湿器を使用していますが、会社に出勤している間は除湿機を使用して部屋の湿気を減らすようにしています。
加湿器と除湿機を使用するのは、(加湿と除湿で部屋の水分量がプラス・マイナス0になるんじゃないかと思ってしまい)無駄なことをしている気がします。

今回は最近実施したRedmine改善の中で強く印象に残ったものについて書きます。

My Redmineのお客様からお問い合わせをいただきました

弊社の提供するRedmineのクラウドサービス My Redmine のお客様からwebサポート窓口に「プロジェクトの作業時間一覧で作業分類フィルターを使用したところ、サブプロジェクトに同じ作業分類名の作業時間は存在するが一覧に表示されない」というお問い合わせをいただきました。

再現手順を見つけ出して、私の開発環境のRedmineでもお客様の仰る事象を再現することができました。


作業時間一覧(作業分類フィルターを使用しなければ表示される)

作業分類フィルターを使用すると、あるべき作業時間が表示されない

いろいろ調べたところRedmineの不具合でした

事象は再現できましたが原因がよく分かりませんでした。そこで作業分類の管理方法と作業時間一覧機能のソースコードを確認したところ、Redmineの不具合であることが判明しました。

作業分類の管理方法

作業分類は以下の2箇所で管理されています。

  1. 管理 > 選択肢の値 > 作業分類(時間管理)
  2. 各プロジェクト > 設定 > 時間管理

上記2でシステム作業分類列にチェックがある作業分類は、上記1の作業分類(時間管理) で登録された作業分類をそのまま利用しています。チェックのない作業分類は各プロジェクトでカスタムフィールド(例では「Billable」)の値を変更したり、有効/無効を切り替えた作業分類です。

作業分類名は同じですがデータ上は別の作業分類(レコードIDの異なる作業分類)として登録されます。そのためプロジェクトごとに作業分類の設定値を変更すると、各プロジェクト用の作業分類が個別に作成されます。

実際の作業分類データ(一部)
# select id, name, position, is_default, active, project_id, parent_id
from enumerations where type='TimeEntryActivity' order by position asc, id asc;
 id |    name     | position | is_default | active | project_id | parent_id
----+-------------+----------+------------+--------+------------+-----------
  9 | Design      |        1 | f          | t      |            |
 17 | Design      |        1 | f          | t      |          1 |         9
 10 | Development |        2 | t          | t      |            |
 18 | Development |        2 | f          | t      |          1 |        10

ソースコードの確認

上記作業分類のデータ構造(同じ作業名であってもレコードIDが違う点)が個人的にとても気になりました。そこで作業時間の一覧表示で使用している作業分類フィルターに関する処理(ソースコード)を確認したところ、原因と思われる作業分類フィルターの選択肢を作り出している箇所を見つけました。

これを以下のように修正したところ、サブプロジェクトの作業分類も一覧画面に表示されました。

diff --git a/app/models/time_entry_query.rb b/app/models/time_entry_query.rb
index 11128cfcd6..5fd4790893 100644
--- a/app/models/time_entry_query.rb
+++ b/app/models/time_entry_query.rb
@@ -88,7 +88,7 @@ class TimeEntryQuery < Query
     activities = (project ? project.activities : TimeEntryActivity.shared)
     add_available_filter(
       "activity_id",
-      :type => :list, :values => activities.map {|a| [a.name, a.id.to_s]}
+      :type => :list, :values => activities.map {|a| [a.name, (a.parent_id || a.id).to_s]}
     )
     add_available_filter(
       "project.status",

お客様のご指摘はとても参考になります

私自身、作業時間機能をあまり使用しないため不具合があることを気付いていませんでした。今回のお客様からのご指摘はとても参考になりました。

今回印象に残った点は、作業分類のデータ構造が一般的なデータ構造と異なっていたことです。たぶん作業分類フィルターを使用しない限りこの不具合には遭遇しないだろうと思いました。今回の事案はRedmine公式サイトにチケット登録し、上記の修正パッチを投稿しました。

余談ですがRedmine公式サイトの未対応チケットの一覧を見ていると、今回の事案とは直接関係しない作業分類に関する不具合と思われる報告(チケット)がいくつか存在していました。今回実施したRedmine改善の内容を参考にして、これらのチケットも改善していきたいと思います。

こちらの記事もオススメです!
Redmine公式に投稿しているチケットやパッチの傾向を調べてみました
Redmine公式サイトへの投稿履歴から取り組みやすいカテゴリやチケットが分かりました。
解析素人がRとMeCabを使って形態素解析を始めてみました
統計分析の学びとしてR言語を使い始めました。R言語は利用までのコストが低く、情報も多いのでお勧めです。
私の中国語学習を支える無料アプリ
趣味の中国語学習のために無料のアプリの中から頻繁に使っているものを紹介します。
シンプルなUIでRedmineのチケットを作成・更新できる「RedMica Bridge」ベータ版をリリース
「RedMica Bridge」はシンプルなUIで簡単にチケットに入力でき、複数のRedmineのチケットを表示することができます。
サービス障害対応訓練を行いました
障害が発生したものとして擬似的に対応を進めるサービス障害対応訓練を行いました。
ファーエンドテクノロジーからのお知らせ(2022/01/12更新)
「FAR END NEWS」2022年第1号 発行
広報紙「FAR END NEWS」2022年第1号を発行しました。弊社サービスの運用・サポートに携わっているスタッフや弊社の取り組みをご紹介します。
年末年始 休業のお知らせ (12/29〜1/4 休業)
年末年始は2021/12/29(水)から2022/1/4(火)まで休業いたします。
【1/21開催】月例Redmineセミナー「Redmine利用事例紹介 アルコニックス株式会社様」
Redmineをどのように業務で活用しているのか企業様の事例をご紹介します。
シンプルなUIでRedmineのチケットを簡単に入力できる「RedMica Bridge」ベータ版をリリース
シンプルなUIでチケットを簡単に作成・更新できるRedMica Bridgeベータ版をリリースしました。複数のRedmineのチケットを一元管理もできます。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け