@@ -137,7 +137,7 class ProjectsController < ApplicationController | |||
|
137 | 137 | @users_by_role = @project.users_by_role |
|
138 | 138 | @subprojects = @project.children.visible.to_a |
|
139 | 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 | 142 | cond = @project.project_condition(Setting.display_subprojects_issues?) |
|
143 | 143 |
@@ -20,7 +20,7 class ReportsController < ApplicationController | |||
|
20 | 20 | before_filter :find_project, :authorize, :find_issue_statuses |
|
21 | 21 | |
|
22 | 22 | def issue_report |
|
23 | @trackers = @project.trackers | |
|
23 | @trackers = @project.rolled_up_trackers(false).visible | |
|
24 | 24 | @versions = @project.shared_versions.sort |
|
25 | 25 | @priorities = IssuePriority.all.reverse |
|
26 | 26 | @categories = @project.issue_categories |
@@ -43,7 +43,7 class ReportsController < ApplicationController | |||
|
43 | 43 | case params[:detail] |
|
44 | 44 | when "tracker" |
|
45 | 45 | @field = "tracker_id" |
|
46 | @rows = @project.trackers | |
|
46 | @rows = @project.rolled_up_trackers(false).visible | |
|
47 | 47 | @data = Issue.by_tracker(@project) |
|
48 | 48 | @report_title = l(:field_tracker) |
|
49 | 49 | when "version" |
@@ -421,16 +421,24 class Project < ActiveRecord::Base | |||
|
421 | 421 | save |
|
422 | 422 | end |
|
423 | 423 | |
|
424 |
# Returns a |
|
|
425 | def rolled_up_trackers | |
|
426 | @rolled_up_trackers ||= | |
|
427 | Tracker. | |
|
428 | joins(projects: :enabled_modules). | |
|
429 | where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> ?", lft, rgt, STATUS_ARCHIVED). | |
|
430 | where("#{EnabledModule.table_name}.name = ?", 'issue_tracking'). | |
|
431 | uniq. | |
|
432 | sorted. | |
|
433 | to_a | |
|
424 | # Returns a scope of the trackers used by the project and its active sub projects | |
|
425 | def rolled_up_trackers(include_subprojects=true) | |
|
426 | if include_subprojects | |
|
427 | @rolled_up_trackers ||= rolled_up_trackers_base_scope. | |
|
428 | where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ?", lft, rgt) | |
|
429 | else | |
|
430 | rolled_up_trackers_base_scope. | |
|
431 | where(:projects => {:id => id}) | |
|
432 | end | |
|
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 | 442 | end |
|
435 | 443 | |
|
436 | 444 | # Closes open and locked project versions that are completed |
@@ -301,7 +301,7 class Query < ActiveRecord::Base | |||
|
301 | 301 | end |
|
302 | 302 | |
|
303 | 303 | def trackers |
|
304 |
@trackers ||= project.nil? ? Tracker. |
|
|
304 | @trackers ||= (project.nil? ? Tracker.all : project.rolled_up_trackers).visible.sorted | |
|
305 | 305 | end |
|
306 | 306 | |
|
307 | 307 | # Returns a hash of localized labels for all filter operators |
@@ -46,6 +46,29 class Tracker < ActiveRecord::Base | |||
|
46 | 46 | scope :sorted, lambda { order(:position) } |
|
47 | 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 | 72 | def to_s; name end |
|
50 | 73 | |
|
51 | 74 | def <=>(tracker) |
@@ -18,7 +18,7 | |||
|
18 | 18 | require File.expand_path('../../test_helper', __FILE__) |
|
19 | 19 | |
|
20 | 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 | 23 | def test_sorted_scope |
|
24 | 24 | assert_equal Tracker.all.sort, Tracker.sorted.to_a |
@@ -28,6 +28,18 class TrackerTest < ActiveSupport::TestCase | |||
|
28 | 28 | assert_equal Tracker.find_by_name('Feature'), Tracker.named('feature').first |
|
29 | 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 | 43 | def test_copy_workflows |
|
32 | 44 | source = Tracker.find(1) |
|
33 | 45 | rules_count = source.workflow_rules.count |
General Comments 0
You need to be logged in to leave comments.
Login now