@@ -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 a |
|
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. |
|
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