category_filter.patch

Jean-Philippe Lang, 2018-10-11 19:09

Download (4.63 KB)

View differences:

app/models/issue_category.rb (copie de travail)
28 28
  safe_attributes 'name', 'assigned_to_id'
29 29

  
30 30
  scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
31
  scope :visible, lambda {|user = User.current|
32
    joins(:project).
33
      where(Project.allowed_to_condition(user, :view_issues))
34
  }
31 35

  
32 36
  alias :destroy_without_reassign :destroy
33 37

  
app/models/issue_query.rb (copie de travail)
31 31
    QueryColumn.new(:author, :sortable => lambda {User.fields_for_order_statement("authors")}, :groupable => true),
32 32
    QueryColumn.new(:assigned_to, :sortable => lambda {User.fields_for_order_statement}, :groupable => true),
33 33
    QueryColumn.new(:updated_on, :sortable => "#{Issue.table_name}.updated_on", :default_order => 'desc'),
34
    QueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name", :groupable => true),
34
    IssueCategoryQueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name", :groupable => "#{IssueCategory.table_name}.name"),
35 35
    QueryColumn.new(:fixed_version, :sortable => lambda {Version.fields_for_order_statement}, :groupable => true),
36 36
    QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date"),
37 37
    QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date"),
......
124 124

  
125 125
    add_available_filter "category_id",
126 126
      :type => :list_optional,
127
      :values => lambda { project.issue_categories.collect{|s| [s.name, s.id.to_s] } } if project
127
      :values => lambda { issue_category_values }
128 128

  
129 129
    add_available_filter "subject", :type => :text
130 130
    add_available_filter "description", :type => :text
......
543 543
    end
544 544
  end
545 545

  
546
  def sql_for_category_id_field(field, operator, value)
547
    ids = value.select {|v| v.to_s =~ /\A\d+\z/}
548
    names = value - ids
549
    if names.any?
550
      ids += IssueCategory.where(:name => names).ids
551
    end
552
    sql_for_field(field, operator, ids.uniq, Issue.table_name, "category_id")
553
  end
554

  
546 555
  def sql_for_relations(field, operator, value, options={})
547 556
    relation_options = IssueRelation::TYPES[field]
548 557
    return relation_options unless relation_options
app/models/project.rb (copie de travail)
330 330
    @users = nil
331 331
    @shared_versions = nil
332 332
    @rolled_up_versions = nil
333
    @rolled_up_issue_categories = nil
333 334
    @rolled_up_trackers = nil
334 335
    @rolled_up_statuses = nil
335 336
    @rolled_up_custom_fields = nil
......
482 483
        where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> ?", lft, rgt, STATUS_ARCHIVED)
483 484
  end
484 485

  
486
  def rolled_up_issue_categories
487
    @rolled_up_issue_categories ||=
488
      IssueCategory.
489
        joins(:project).
490
        where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> ?", lft, rgt, STATUS_ARCHIVED)
491
  end
492

  
485 493
  # Returns a scope of the Versions used by the project
486 494
  def shared_versions
487 495
    if new_record?
app/models/query.rb (copie de travail)
162 162
  end
163 163
end
164 164

  
165
class IssueCategoryQueryColumn < QueryColumn
166
  
167
  def value_object(object)
168
    value(object)
169
  end
170
  
171
  def value(object)
172
    object.category.try(:name)
173
  end
174
end
175

  
165 176
class QueryFilter
166 177
  include Redmine::I18n
167 178

  
......
569 580
    watcher_values += users.sort_by(&:status).collect{|s| [s.name, s.id.to_s, l("status_#{User::LABEL_BY_STATUS[s.status]}")] } if User.current.allowed_to?(:view_issue_watchers, self.project)
570 581
    watcher_values
571 582
  end
583
 
584
  def issue_category_values
585
    categories =
586
      if project
587
        project.rolled_up_issue_categories
588
      else
589
        IssueCategory
590
      end
591
    categories.visible.distinct.order(:name).pluck(:name, :name)
592
  end
572 593

  
594
  def find_category_id_filter_values(values)
595
    ids = values.select {|v| v.to_s =~ /\A\d+\z/}
596
    IssueCategory.where(:id => ids).distinct.order(:name).pluck(:name, :id).map {|name, id| [name, id.to_s]}
597
  end
598

  
573 599
  # Returns a scope of issue custom fields that are available as columns or filters
574 600
  def issue_custom_fields
575 601
    if project