mirror of
https://github.com/redmine/redmine.git
synced 2025-11-12 08:16:03 +01:00
Merged r15540 (#285).
git-svn-id: http://svn.redmine.org/redmine/branches/3.3-stable@15542 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -137,7 +137,7 @@ class ProjectsController < ApplicationController
|
|||||||
@users_by_role = @project.users_by_role
|
@users_by_role = @project.users_by_role
|
||||||
@subprojects = @project.children.visible.to_a
|
@subprojects = @project.children.visible.to_a
|
||||||
@news = @project.news.limit(5).includes(:author, :project).reorder("#{News.table_name}.created_on DESC").to_a
|
@news = @project.news.limit(5).includes(:author, :project).reorder("#{News.table_name}.created_on DESC").to_a
|
||||||
@trackers = @project.rolled_up_trackers
|
@trackers = @project.rolled_up_trackers.visible
|
||||||
|
|
||||||
cond = @project.project_condition(Setting.display_subprojects_issues?)
|
cond = @project.project_condition(Setting.display_subprojects_issues?)
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class ReportsController < ApplicationController
|
|||||||
before_filter :find_project, :authorize, :find_issue_statuses
|
before_filter :find_project, :authorize, :find_issue_statuses
|
||||||
|
|
||||||
def issue_report
|
def issue_report
|
||||||
@trackers = @project.trackers
|
@trackers = @project.rolled_up_trackers(false).visible
|
||||||
@versions = @project.shared_versions.sort
|
@versions = @project.shared_versions.sort
|
||||||
@priorities = IssuePriority.all.reverse
|
@priorities = IssuePriority.all.reverse
|
||||||
@categories = @project.issue_categories
|
@categories = @project.issue_categories
|
||||||
@@ -43,7 +43,7 @@ class ReportsController < ApplicationController
|
|||||||
case params[:detail]
|
case params[:detail]
|
||||||
when "tracker"
|
when "tracker"
|
||||||
@field = "tracker_id"
|
@field = "tracker_id"
|
||||||
@rows = @project.trackers
|
@rows = @project.rolled_up_trackers(false).visible
|
||||||
@data = Issue.by_tracker(@project)
|
@data = Issue.by_tracker(@project)
|
||||||
@report_title = l(:field_tracker)
|
@report_title = l(:field_tracker)
|
||||||
when "version"
|
when "version"
|
||||||
|
|||||||
@@ -421,16 +421,24 @@ class Project < ActiveRecord::Base
|
|||||||
save
|
save
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns an array of the trackers used by the project and its active sub projects
|
# Returns a scope of the trackers used by the project and its active sub projects
|
||||||
def rolled_up_trackers
|
def rolled_up_trackers(include_subprojects=true)
|
||||||
@rolled_up_trackers ||=
|
if include_subprojects
|
||||||
|
@rolled_up_trackers ||= rolled_up_trackers_base_scope.
|
||||||
|
where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ?", lft, rgt)
|
||||||
|
else
|
||||||
|
rolled_up_trackers_base_scope.
|
||||||
|
where(:projects => {:id => id})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def rolled_up_trackers_base_scope
|
||||||
Tracker.
|
Tracker.
|
||||||
joins(projects: :enabled_modules).
|
joins(projects: :enabled_modules).
|
||||||
where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> ?", lft, rgt, STATUS_ARCHIVED).
|
where("#{Project.table_name}.status <> ?", STATUS_ARCHIVED).
|
||||||
where("#{EnabledModule.table_name}.name = ?", 'issue_tracking').
|
where(:enabled_modules => {:name => 'issue_tracking'}).
|
||||||
uniq.
|
uniq.
|
||||||
sorted.
|
sorted
|
||||||
to_a
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Closes open and locked project versions that are completed
|
# Closes open and locked project versions that are completed
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ class Query < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def trackers
|
def trackers
|
||||||
@trackers ||= project.nil? ? Tracker.sorted.to_a : project.rolled_up_trackers
|
@trackers ||= (project.nil? ? Tracker.all : project.rolled_up_trackers).visible.sorted
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a hash of localized labels for all filter operators
|
# Returns a hash of localized labels for all filter operators
|
||||||
|
|||||||
@@ -46,6 +46,29 @@ class Tracker < ActiveRecord::Base
|
|||||||
scope :sorted, lambda { order(:position) }
|
scope :sorted, lambda { order(:position) }
|
||||||
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
|
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
|
||||||
|
|
||||||
|
# Returns the trackers that are visible by the user.
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# project.trackers.visible(user)
|
||||||
|
# => returns the trackers that are visible by the user in project
|
||||||
|
#
|
||||||
|
# Tracker.visible(user)
|
||||||
|
# => returns the trackers that are visible by the user in at least on project
|
||||||
|
scope :visible, lambda {|*args|
|
||||||
|
user = args.shift || User.current
|
||||||
|
condition = Project.allowed_to_condition(user, :view_issues) do |role, user|
|
||||||
|
unless role.permissions_all_trackers?(:view_issues)
|
||||||
|
tracker_ids = role.permissions_tracker_ids(:view_issues)
|
||||||
|
if tracker_ids.any?
|
||||||
|
"#{Tracker.table_name}.id IN (#{tracker_ids.join(',')})"
|
||||||
|
else
|
||||||
|
'1=0'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
joins(:projects).where(condition).uniq
|
||||||
|
}
|
||||||
|
|
||||||
def to_s; name end
|
def to_s; name end
|
||||||
|
|
||||||
def <=>(tracker)
|
def <=>(tracker)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
require File.expand_path('../../test_helper', __FILE__)
|
require File.expand_path('../../test_helper', __FILE__)
|
||||||
|
|
||||||
class TrackerTest < ActiveSupport::TestCase
|
class TrackerTest < ActiveSupport::TestCase
|
||||||
fixtures :trackers, :workflows, :issue_statuses, :roles, :issues
|
fixtures :trackers, :workflows, :issue_statuses, :roles, :issues, :projects, :projects_trackers
|
||||||
|
|
||||||
def test_sorted_scope
|
def test_sorted_scope
|
||||||
assert_equal Tracker.all.sort, Tracker.sorted.to_a
|
assert_equal Tracker.all.sort, Tracker.sorted.to_a
|
||||||
@@ -28,6 +28,18 @@ class TrackerTest < ActiveSupport::TestCase
|
|||||||
assert_equal Tracker.find_by_name('Feature'), Tracker.named('feature').first
|
assert_equal Tracker.find_by_name('Feature'), Tracker.named('feature').first
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_visible_scope_chained_with_project_rolled_up_trackers
|
||||||
|
project = Project.find(1)
|
||||||
|
role = Role.generate!
|
||||||
|
role.add_permission! :view_issues
|
||||||
|
role.set_permission_trackers :view_issues, [2]
|
||||||
|
role.save!
|
||||||
|
user = User.generate!
|
||||||
|
User.add_to_project user, project, role
|
||||||
|
|
||||||
|
assert_equal [2], project.rolled_up_trackers(false).visible(user).map(&:id)
|
||||||
|
end
|
||||||
|
|
||||||
def test_copy_workflows
|
def test_copy_workflows
|
||||||
source = Tracker.find(1)
|
source = Tracker.find(1)
|
||||||
rules_count = source.workflow_rules.count
|
rules_count = source.workflow_rules.count
|
||||||
|
|||||||
Reference in New Issue
Block a user