Project

General

Profile

QA #286

チケット一覧のフィルターで担当者の表示を"チケット割り当て可能な担当者"だけにしたい

Added by Tamura Shinji almost 4 years ago. Updated over 3 years ago.

Status:
新規
Priority:
通常
Assignee:
-
Category:
-
Target version:
-
Start date:
01/13/2017
Due date:
% Done:

0%

Estimated time:

Description

■現象/要望

チケット作成のところでは担当者の選択肢はチケット割り当て可能なロールのユーザだけが表示されるのですが、
チケット一覧のフィルターではプロジェクトに登録されているメンバーすべてが表示されます。
もしかしたら、どこかの設定で非表示できるのかもしれませんが見つけられませんでした。
チケット一覧の担当者フィルターの表示項目をチケット割り当て可能なロールのユーザだけにすることは可能でしょうか?

■解決策

■対応状況

■補足

#1

Updated by 奈良 裕記 almost 4 years ago

類似チケットありました。
下記プラグインで対応可能でしょうか?

http://www.redmine.org/issues/2937#note-26

https://github.com/luisr9/redmine_filter_assignable

# 探し方 #280 から filterで検索しました。

#2

Updated by Tamura Shinji almost 4 years ago

ありがとうございます。
このプラグインは自分でも見つけていたのですが"on workflow"とあったので違うと思っていました。
試してみたところ、設定をいじってもどこに影響があるのかさっぱりわからずじまいでした。
このプラグインのソースでIssue_Controllerのパッチがあるので見て見ましたが、チケット一覧には影響がないような気がします。

#3

Updated by 奈良 裕記 almost 4 years ago

数十人いると、Query選択肢もRole単位に限定したいのは理解できます。

人員追加変更を考慮すると、過去人員分も考える必要がありそうです。(PJに現在所属していなくとも)

Issueではなく、IssueQueryの方ですね

app/models/issue_query.rb
app/models/query.rb

関連部分の3.3の関連コード引っ張ってきました。

現行3.3

app/models/issue_query.rb


  def initialize_available_filters

    ..
    role_values = Role.givable.collect {|r| [r.name, r.id.to_s] }
    add_available_filter("assigned_to_role",
      :type => :list_optional, :values => role_values
    ) unless role_values.empty?
    ..
    add_custom_fields_filters(issue_custom_fields)
    ..
  end

  def sql_for_assigned_to_role_field(field, operator, value)
    case operator
    when "*", "!*" # Member / Not member
      sw = operator == "!*" ? 'NOT' : ''
      nl = operator == "!*" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : ''
      "(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}" +
        " WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id))" 
    when "=", "!" 
      role_cond = value.any? ?
        "#{MemberRole.table_name}.role_id IN (" + value.collect{|val| "'#{self.class.connection.quote_string(val)}'"}.join(",") + ")" :
        "1=0" 
      sw = operator == "!" ? 'NOT' : ''
      nl = operator == "!" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : ''
      "(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}, #{MemberRole.table_name}" +
        " WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id AND #{Member.table_name}.id = #{MemberRole.table_name}.member_id AND #{role_cond}))" 
    end
  end

app/models/query.rb


  # Adds filters for the given custom fields scope
  def add_custom_fields_filters(scope, assoc=nil)
    scope.visible.where(:is_filter => true).sorted.each do |field|
      add_custom_field_filter(field, assoc)
    end
  end

  # Adds a filter for the given custom field
  def add_custom_field_filter(field, assoc=nil)
    options = field.query_filter_options(self)
    if field.format.target_class && field.format.target_class <= User
      if options[:values].is_a?(Array) && User.current.logged?
        options[:values].unshift ["<< #{l(:label_me)} >>", "me"]
      end
    end
    filter_id = "cf_#{field.id}" 
    filter_name = field.name
    if assoc.present?
      filter_id = "#{assoc}.#{filter_id}" 
      filter_name = l("label_attribute_of_#{assoc}", :name => filter_name)
    end
    add_available_filter filter_id, options.merge({
      :name => filter_name,
      :field => field
    })
  end

#4

Updated by Tamura Shinji almost 4 years ago

add_available_filter("assigned_to_role",

とあるので、割り当て可能なロールに絞られているような気がするんですが、これが効いていない!?

#5

Updated by 奈良 裕記 almost 4 years ago

models\query.rbの下記処理が、CFのRole制限を考慮していない様に見えるのですが。。。

def statement
  1. filters clauses
def sql_for_custom_field(field, operator, value, custom_field_id)
def sql_for_field(field, operator, value, db_table, db_field, is_custom_filter=false)
#6

Updated by Tamura Shinji almost 4 years ago

どこかに、app/models/issues.rbにある


  def assignable_users
    users = project.assignable_users
    users << author if author
    users << assigned_to if assigned_to
    users.uniq.sort
  end


が必要なんですよねぇ。。。

#7

Updated by Takano Akiko over 3 years ago

こんにちは。
だいぶ前のバージョンの時ですが、現場でも「メンバーの中でも実際にアサイン可能(ユーザが有効)になっているユーザだけプルダウンに出て欲しい」という要望をいただいてて、ちょっと考えたことがありました。
また、プルダウンの中にチケットの作成者がいたら、表示をちょっと変えて欲しいといった要望もいただきました。

当時作ってみて保留にしてたのがあります。
https://github.com/akiko-pusu/redmine_assign_addon

1.4系の時に作ったので、今動かせる環境がないのですが、動作としては

- プラグインを有効にすると、アサイン可能かつ有効なユーザだけ選択できるようになる
- もしくはオプションで有効でないユーザも表示するけどグレー表示する
- 作成者はプルダウンでもちょっと表示を変えてあげる(最後にチケットを作成者に返しやすいように)

というものだったと思います。
また、プルダウンはViewのテンプレートを上書きするのではなくて、ajaxでプルダウンを差し替える形でした。

実装はいろいろ方法があるにしても、本家に実装されるといいと思っていて、わたしも + してた気がします。

#8

Updated by Tamura Shinji over 3 years ago

すばらしい。。。

試してみます。1.4系からだと変更が多いだろうなぁ。。。

#9

Updated by Takano Akiko over 3 years ago

こんにちは!コメントありがとうございます。
プラグイン絶滅期以前のバージョンですからね...。

この当時よりは少しは私もRedmine / フロント側の知識が増えたので、作り直してみようかなとも思ってます。

#10

Updated by Tamura Shinji over 3 years ago

是非是非おねがいします!

自分も昔は1.4系使ってました。。。
現在は、大半が2.6系で一部3.2に移行しているところです。
(社内で運用しているRedmineが30サイトあるのでいろいろ面倒でして。。。)

Also available in: Atom PDF