プロジェクト

全般

プロフィール

QA #911

未完了

カスタムフィールドの形式「ユーザー」にてグループも選べるようにしたい &チケット一覧画面でもフィルタしたい。

楠川 智久 さんが約5年前に追加. ほぼ3年前に更新.

ステータス:
回答済
優先度:
通常
担当者:
カテゴリ:
-
対象バージョン:
-
開始日:
2019/02/02
期日:
進捗率:

0%

予定工数:

説明

ボールを持つ人が複数になるケースがあることから
custom_users_as_assigneesプラグインを使っている中で、
利用者からグループも選べるようにしたいとの強い要望があった。

グループ選択可能にしたが、
チケット一覧画面のフィルタでグループ定義が選択できず、グループの場合にリスト上に表示されない。

下記箇所の修正で対応可能

チケット編集画面
https://redmine.tokyo/issues/911#note-3

リスト表示/フィルタ選択
https://redmine.tokyo/issues/911#note-12


ファイル

field_format.rb (34.8 KB) field_format.rb 楠川 智久, 2019/02/04 01:21

奈良 裕記 さんが約5年前に更新

+1

奈良 裕記 さんが約5年前に更新

担当者欄にはグループを選択できるのに、ユーザ形式のカスタムフィールドで選択できないのだから、
まずは実際のコードを確認

CFの入力選択部分をprincipals_options_for_selectの処理で置き換えれば良い?
(validationの対応要否は未検討)

ただ、何故処理が異なっているのかも気になります。

標準の担当者欄

helpers/application_helper.rb: def principals_options_for_select(collection, selected=nil)

担当者欄の呼び出し元

views/issues/_attributes.html.erb:

<p><%= f.select :assigned_to_id, principals_options_for_select(@issue.assignable_users, @issue.assigned_to),
 :include_blank => true, :required => @issue.required_attribute?('assigned_to_id') %></p>

views/issues/bulk_edit.html.erb:

 principals_options_for_select (@assignables, @issue_params[:assigned_to_id])) %>

ユーザ形式のカスタムフィールド

下記を参考にして、カスタムフィールド(User)の場合に、
principals_options_for_selectを呼べば対応できないかな。
if custom_value.custom_field.field_format == 'user'

参考文献(手前味噌w)
Redmineカスタムフィールド表示改善
https://www.slideshare.net/y503unavailable/redmine-61996567
Page9,17

/app/views/issues/_form_custom_fields.html.erb
(編集)表示一列化 CFID毎に処理変更(見出し、改行、、)

app/helpers/custom_fields_helper.rb
(編集)CF表示制御処理を追加 (label,preタグ有無、定型処理)

views/issues/_attributes.html.erb:

....
<% if @issue.safe_attribute? 'custom_field_values' %>
<%= render :partial => 'issues/form_custom_fields' %>
<% end %>

views/issues/_form_custom_fields.html.erb

<% custom_field_values = @issue.editable_custom_field_values %>
...

<% custom_field_values.each do |value| %>
  <p><%= custom_field_tag_with_label :issue, value, 
  :required => @issue.required_attribute?(value.custom_field_id) %>
  </p>

helpers/custom_fields_helper.rb:

  def custom_field_tag_with_label(name, custom_value, options={})

  def custom_field_label_tag(name, custom_value, options={})

  def custom_field_name_tag(custom_field)

views/custom_fields/_form.html.erb:

<p><%= f.select :field_format, custom_field_formats_for_select(@custom_field), {},
 :disabled => !@custom_field.new_record? %></p>

helpers/custom_fields_helper.rb

  # Return an array of custom field formats which can be used in select_tag
  def custom_field_formats_for_select(custom_field)
    Redmine::FieldFormat.as_select(custom_field.class.customized_class.name)
  end

lib/redmine/field_format.rb: module FieldFormat

    # Return an array of custom field formats which can be used in select_tag
    def self.as_select(class_name=nil)
      formats = all.values.select do |format|
        format.class.customized_class_names.nil? || format.class.customized_class_names.include?(class_name)
      end
      formats.map {|format| [::I18n.t(format.label), format.name] }.sort_by(&:first)
    end

    class UserFormat < RecordList
      add 'user'
      self.form_partial = 'custom_fields/formats/user'
      field_attributes :user_role

      def possible_values_records(custom_field, object=nil)
...
          scope = object.project.users
          if custom_field.user_role.is_a?(Array)
            role_ids = custom_field.user_role.map(&:to_s).reject(&:blank?).map(&:to_i)
            if role_ids.any?
              scope = scope.where("#{Member.table_name}.id IN (SELECT DISTINCT member_id FROM #{MemberRole.table_name} WHERE role_id IN (?))", role_ids)
            end
          end
          scope.sorted

models/projects.rb

  def principals
    @principals ||= Principal.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).distinct
  end

  def users
    @users ||= User.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).distinct
  end

楠川 智久 さんが約5年前に更新

調査情報、ありがとうございます!

Redmine3.4(職場が3.4なので)でやってみた結果、
以下の本体修正で出来たっぽいです。
(修正後のファイルも添付します)

--- lib/redmine/field_format.rb    (revision 16854)
+++ lib/redmine/field_format.rb    (working copy)
@@ -801,6 +801,10 @@
       self.form_partial = 'custom_fields/formats/user'
       field_attributes :user_role

+      def target_class
+        return Principal
+      end
+
       def possible_values_options(custom_field, object=nil)
         possible_values_records(custom_field, object).map {|u| [u.name, u.id.to_s]}
       end
@@ -810,7 +814,8 @@
           projects = object.map {|o| o.respond_to?(:project) ? o.project : nil}.compact.uniq
           projects.map {|project| possible_values_records(custom_field, project)}.reduce(:&) || []
         elsif object.respond_to?(:project) && object.project
-          scope = object.project.users
+#          scope = object.project.users
+          scope = object.project.principals
           if custom_field.user_role.is_a?(Array)
             role_ids = custom_field.user_role.map(&:to_s).reject(&:blank?).map(&:to_i)
             if role_ids.any?

custom_users_as_assigneesプラグインでもグループへの対応が必要で、
https://github.com/tkusukawa/custom_users_as_assignees/commit/b42abe9c274b8cf746fca69ca421d07f9ee0e162
https://github.com/tkusukawa/custom_users_as_assignees/commit/b967576961a3d3c0fe4f33b00f4a9105eed76b0d
に修正をコミット/プッシュしました。

お気づきのことがありましたら、またお願いいたします。

奈良 裕記 さんが約5年前に更新

対応ありがとうございました。

今まで出来なかった設定が可能になる訳で、今まで出なかった不具合も出そうです。副作用が楽しみw。

自分は逆に、担当者選択のコードをユーザ選択のカスタムフィールドで呼び出せればと思っていました。
こちらだと、「自分」、ユーザとグループの区切り、も実現できますし。

プラグインと合わせるとwatcherのグループ設定と類似の動作が実現できますね。 #290 と関連
watcher多用現場には受け入れられそう。

この様な利用形態が一般化すると、次は

・ユーザ+グループ、ユーザのみ(従来通り)の選択(CF単位)
・グループの後にユーザ表示(数百人の場合)

なんて要望も出るんでしょう。

楠川 智久 さんが約5年前に更新

職場で本番投入しましたw
→ 昨日1日問題なし

次回の勉強会でのLT候補ですww

奈良 裕記 さんが約5年前に更新

本家チケット発掘

Select user-groups in custom fields of type "User"
http://www.redmine.org/issues/21026
vote-2件では埋もれるのはやむなし。

この機能はそれなりに役立つと思いますが、どうやってユーザ告知しましょうかね。。
Twitterで手法のアンケート取るとか。

奈良 裕記 さんが約5年前に更新

Redmineのユーザー選択カスタムフィールドにて、グループも選択可能にする場合の意見選択肢案

1.ユーザとグループを区別して選択する必要はない
2.ユーザとグループを区別して選択したい。(担当者欄と同様)
3.不要な機能だと思う。
4.余計な障害招くので止めて。

高橋 直也 さんが4年以上前に更新

途中から失礼します。
いつもいろいろ参考にさせて頂いています。

https://redmine.tokyo/issues/911#note-3
上記にならって field_format.rb を私の環境(3.4.11)に適応したのですが、
チケット一覧画面(redmine/projects/<識別子>/issues)でユーザ形式のカスタムフィールドでフィルターしようとしても、
リストにグループが表示されません。ユーザのみ表示さえれます。
こちらでもグループを選べるようにするにはどうすればよろしいでしょうか。

ご教授いただければ助かります。

奈良 裕記 さんが4年以上前に更新

高橋さん

確認ですが、
・チケット編集画面上は、ユーザカスタムフィールドにてユーザ/グループが選択できる。
・チケット一覧のフィルタで、そのカスタムフィールド中のグループ定義が選択肢に表示されない。
ということですよね?

本機能(グループ定義選択)、必要でしたら、本家下記チケットに +1 お願いします。
http://www.redmine.org/issues/21026

上記チケットは +1 が現在4件ですが、
Redmine本家のvote count listにて、5件以上の場合はカテゴリ単位ではなく、上位リストに個別に含めますので。(4.1が出たら更新予定)
http://www.redmine.org/boards/1/topics/56452

高橋 直也 さんが4年以上前に更新

確認ですが、
・チケット編集画面上は、ユーザカスタムフィールドにてユーザ/グループが選択できる。
・チケット一覧のフィルタで、そのカスタムフィールド中のグループ定義が選択肢に表示されない。
ということですよね?

はい。認識あっています。

本機能(グループ定義選択)、必要でしたら、本家下記チケットに +1 お願いします。
http://www.redmine.org/issues/21026

+1させて頂きました

奈良 裕記 さんが4年以上前に更新

trunkですが、調査中

trunkに同様のパッチ当てる
で、グループ定義分の選択はOK
https://redmine.tokyo/issues/911#note-3
・チケット編集画面-グループ定義分の選択はOK
・チケット一覧で右ボタン設定-グループ定義分も選択OK

グループを選択した場合
・リストは空白になる。
・チケットの変更履歴では空白になる。

↑無効値扱いされている?

チケットフィルタ
・選択肢にはID分しか表示されない

奈良 裕記 さんが4年以上前に更新

trunkですが、フィルタ部分は下記で対応できました。
3.4でも多分同様に対処可能と思います。

副作用として、「匿名ユーザー」を選択不可になりますが、必要なら調整可能です。

lib/redmine/field_format.rb

class UserFormatのquery_filter_valuesにて、
query.author_values を query.assigned_to_values に変更するだけです。


   class UserFormat < RecordList
      add 'user'
      self.form_partial = 'custom_fields/formats/user'
      field_attributes :user_role
....
      def query_filter_values(custom_field, query)
      # query.author_values
        query.assigned_to_values
      end
    end

    class VersionFormat < RecordList
      add 'version'

奈良 裕記 さんが4年以上前に更新

変更内容解説(原稿用w)

以下、
userCFはチケット上でユーザ/グループを割り当てるCF(フィルタ指定済)
GROUPは、選択対象のユーザグループ定義(PJに登録済)
とする。

標準のフィルタ選択肢の動作は下記の通り。
担当者欄のみ、グループ定義を選択可能である。

作成者  自分 有効 userリスト 匿名ユーザー
userCF  自分 有効 userリスト 匿名ユーザー

担当者  自分 有効 userリスト GROUP

作成者欄とuserCF欄は、models/query.rbのauthor_values
担当者欄は、models/query.rbのassigned_values
が利用されている。

今回は、userCF欄のフィルタ選択肢(author_values)を、単純に担当者用の選択肢(assigned_to_values)に変更した。
assigned_to_valuesの処理で不都合がある場合は、別名で再定義し、その処理を呼び出せば良い。

models/query.rb


  def author_values
    author_values = []
    author_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
    author_values += users.sort_by(&:status).collect{|s| [s.name, s.id.to_s, l("status_#{User::LABEL_BY_STATUS[s.status]}")] }
    author_values << [l(:label_user_anonymous), User.anonymous.id.to_s]
    author_values
  end

  def assigned_to_values
    assigned_to_values = []
    assigned_to_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
    assigned_to_values += (Setting.issue_group_assignment? ? principals : users).sort_by(&:status).collect{|s| [s.name, s.id.to_s, l("status_#{User::LABEL_BY_STATUS[s.status]}")] }
    assigned_to_values
  end

奈良 裕記 さんが4年以上前に更新

  • 題名カスタムフィールドの形式「ユーザー」にてグループも選べるようにしたい から カスタムフィールドの形式「ユーザー」にてグループも選べるようにしたい &チケット一覧画面でもフィルタしたい。 に変更
  • 説明 を更新 (差分)

要件追加しました。

奈良 裕記 さんが4年以上前に更新

本家チケット起票9枚目。今年中には2桁行きたい(10進数)
http://www.redmine.org/issues/32484

高橋 直也 さんが4年以上前に更新

https://redmine.tokyo/issues/911#note-12
上記について私の環境(3.4.11)でも試してみました。
期待通りグループの選択、フィルターを行うことが出来ました。

迅速な対応ありがとうございます。
解説までつけて頂きとても助かりました。

奈良 裕記 さんが4年以上前に更新

奈良 裕記 さんが4年以上前に更新

動作確認ありがとうございました。
これで安心して広報できますw。

奈良 裕記 さんが4年以上前に更新

奈良 裕記 さんがほぼ3年前に更新

他の形式にエクスポート: Atom PDF