##// END OF EJS Templates
Limits the tracker list in filters and issue counts (#285)....
Jean-Philippe Lang -
r15158:6cd84af522bb
parent child
Show More
@@ -137,7 +137,7 class ProjectsController < ApplicationController
137 @users_by_role = @project.users_by_role
137 @users_by_role = @project.users_by_role
138 @subprojects = @project.children.visible.to_a
138 @subprojects = @project.children.visible.to_a
139 @news = @project.news.limit(5).includes(:author, :project).reorder("#{News.table_name}.created_on DESC").to_a
139 @news = @project.news.limit(5).includes(:author, :project).reorder("#{News.table_name}.created_on DESC").to_a
140 @trackers = @project.rolled_up_trackers
140 @trackers = @project.rolled_up_trackers.visible
141
141
142 cond = @project.project_condition(Setting.display_subprojects_issues?)
142 cond = @project.project_condition(Setting.display_subprojects_issues?)
143
143
@@ -20,7 +20,7 class ReportsController < ApplicationController
20 before_filter :find_project, :authorize, :find_issue_statuses
20 before_filter :find_project, :authorize, :find_issue_statuses
21
21
22 def issue_report
22 def issue_report
23 @trackers = @project.trackers
23 @trackers = @project.rolled_up_trackers(false).visible
24 @versions = @project.shared_versions.sort
24 @versions = @project.shared_versions.sort
25 @priorities = IssuePriority.all.reverse
25 @priorities = IssuePriority.all.reverse
26 @categories = @project.issue_categories
26 @categories = @project.issue_categories
@@ -43,7 +43,7 class ReportsController < ApplicationController
43 case params[:detail]
43 case params[:detail]
44 when "tracker"
44 when "tracker"
45 @field = "tracker_id"
45 @field = "tracker_id"
46 @rows = @project.trackers
46 @rows = @project.rolled_up_trackers(false).visible
47 @data = Issue.by_tracker(@project)
47 @data = Issue.by_tracker(@project)
48 @report_title = l(:field_tracker)
48 @report_title = l(:field_tracker)
49 when "version"
49 when "version"
@@ -421,16 +421,24 class Project < ActiveRecord::Base
421 save
421 save
422 end
422 end
423
423
424 # Returns an array of the trackers used by the project and its active sub projects
424 # Returns a scope of the trackers used by the project and its active sub projects
425 def rolled_up_trackers
425 def rolled_up_trackers(include_subprojects=true)
426 @rolled_up_trackers ||=
426 if include_subprojects
427 Tracker.
427 @rolled_up_trackers ||= rolled_up_trackers_base_scope.
428 joins(projects: :enabled_modules).
428 where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ?", lft, rgt)
429 where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> ?", lft, rgt, STATUS_ARCHIVED).
429 else
430 where("#{EnabledModule.table_name}.name = ?", 'issue_tracking').
430 rolled_up_trackers_base_scope.
431 uniq.
431 where(:projects => {:id => id})
432 sorted.
432 end
433 to_a
433 end
434
435 def rolled_up_trackers_base_scope
436 Tracker.
437 joins(projects: :enabled_modules).
438 where("#{Project.table_name}.status <> ?", STATUS_ARCHIVED).
439 where(:enabled_modules => {:name => 'issue_tracking'}).
440 uniq.
441 sorted
434 end
442 end
435
443
436 # Closes open and locked project versions that are completed
444 # Closes open and locked project versions that are completed
@@ -301,7 +301,7 class Query < ActiveRecord::Base
301 end
301 end
302
302
303 def trackers
303 def trackers
304 @trackers ||= project.nil? ? Tracker.sorted.to_a : project.rolled_up_trackers
304 @trackers ||= (project.nil? ? Tracker.all : project.rolled_up_trackers).visible.sorted
305 end
305 end
306
306
307 # Returns a hash of localized labels for all filter operators
307 # Returns a hash of localized labels for all filter operators
@@ -46,6 +46,29 class Tracker < ActiveRecord::Base
46 scope :sorted, lambda { order(:position) }
46 scope :sorted, lambda { order(:position) }
47 scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
47 scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
48
48
49 # Returns the trackers that are visible by the user.
50 #
51 # Examples:
52 # project.trackers.visible(user)
53 # => returns the trackers that are visible by the user in project
54 #
55 # Tracker.visible(user)
56 # => returns the trackers that are visible by the user in at least on project
57 scope :visible, lambda {|*args|
58 user = args.shift || User.current
59 condition = Project.allowed_to_condition(user, :view_issues) do |role, user|
60 unless role.permissions_all_trackers?(:view_issues)
61 tracker_ids = role.permissions_tracker_ids(:view_issues)
62 if tracker_ids.any?
63 "#{Tracker.table_name}.id IN (#{tracker_ids.join(',')})"
64 else
65 '1=0'
66 end
67 end
68 end
69 joins(:projects).where(condition).uniq
70 }
71
49 def to_s; name end
72 def to_s; name end
50
73
51 def <=>(tracker)
74 def <=>(tracker)
@@ -18,7 +18,7
18 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19
19
20 class TrackerTest < ActiveSupport::TestCase
20 class TrackerTest < ActiveSupport::TestCase
21 fixtures :trackers, :workflows, :issue_statuses, :roles, :issues
21 fixtures :trackers, :workflows, :issue_statuses, :roles, :issues, :projects, :projects_trackers
22
22
23 def test_sorted_scope
23 def test_sorted_scope
24 assert_equal Tracker.all.sort, Tracker.sorted.to_a
24 assert_equal Tracker.all.sort, Tracker.sorted.to_a
@@ -28,6 +28,18 class TrackerTest < ActiveSupport::TestCase
28 assert_equal Tracker.find_by_name('Feature'), Tracker.named('feature').first
28 assert_equal Tracker.find_by_name('Feature'), Tracker.named('feature').first
29 end
29 end
30
30
31 def test_visible_scope_chained_with_project_rolled_up_trackers
32 project = Project.find(1)
33 role = Role.generate!
34 role.add_permission! :view_issues
35 role.set_permission_trackers :view_issues, [2]
36 role.save!
37 user = User.generate!
38 User.add_to_project user, project, role
39
40 assert_equal [2], project.rolled_up_trackers(false).visible(user).map(&:id)
41 end
42
31 def test_copy_workflows
43 def test_copy_workflows
32 source = Tracker.find(1)
44 source = Tracker.find(1)
33 rules_count = source.workflow_rules.count
45 rules_count = source.workflow_rules.count
General Comments 0
You need to be logged in to leave comments. Login now