Project

General

Profile

QA #911

カスタムフィールドの形式「ユーザー」にてグループも選べるようにしたい

Added by 楠川 智久 3 months ago. Updated 3 months ago.

Status:
回答済
Priority:
通常
Assignee:
Category:
-
Target version:
-
Start date:
02/02/2019
Due date:
% Done:

0%

Estimated time:

Description

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


Files

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

History

#1

Updated by 奈良 裕記 3 months ago

+1

#2

Updated by 奈良 裕記 3 months ago

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

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
#3

Updated by 楠川 智久 3 months ago

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

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
に修正をコミット/プッシュしました。

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

#4

Updated by 奈良 裕記 3 months ago

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

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

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

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

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

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

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

#5

Updated by 楠川 智久 3 months ago

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

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

#6

Updated by 奈良 裕記 3 months ago

本家チケット発掘

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

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

#7

Updated by 奈良 裕記 3 months ago

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

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

Also available in: Atom PDF