summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2008-01-16 21:27:48 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2008-01-16 21:27:48 +0000
commit049051103b02efdef64f4119959d95d23d45e392 (patch)
treecfb967b5c44fdbdb2e5fc5aa328a058128238379
parent18066ba8bf68da4b00b7e740e6c67f8d8b1e0093 (diff)
downloadredmine-049051103b02efdef64f4119959d95d23d45e392.tar.gz
redmine-049051103b02efdef64f4119959d95d23d45e392.zip
On the calendar, the gantt and in the Tracker filter on the issue list, only active trackers of the project (and its sub projects) can be selected.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1071 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/controllers/projects_controller.rb4
-rw-r--r--app/models/project.rb9
-rw-r--r--app/models/query.rb5
-rw-r--r--app/models/tracker.rb1
-rw-r--r--test/fixtures/projects_trackers.yml6
-rw-r--r--test/fixtures/trackers.yml3
-rw-r--r--test/functional/projects_controller_test.rb6
-rw-r--r--test/unit/project_test.rb16
8 files changed, 37 insertions, 13 deletions
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 2ae742dfa..6add8585b 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -418,7 +418,7 @@ class ProjectsController < ApplicationController
end
def calendar
- @trackers = Tracker.find(:all, :order => 'position')
+ @trackers = @project.rolled_up_trackers
retrieve_selected_tracker_ids(@trackers)
if params[:year] and params[:year].to_i > 1900
@@ -445,7 +445,7 @@ class ProjectsController < ApplicationController
end
def gantt
- @trackers = Tracker.find(:all, :order => 'position')
+ @trackers = @project.rolled_up_trackers
retrieve_selected_tracker_ids(@trackers)
if params[:year] and params[:year].to_i >0
diff --git a/app/models/project.rb b/app/models/project.rb
index 60a7a84a4..0e7f8284c 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -146,6 +146,15 @@ class Project < ActiveRecord::Base
children.select {|child| child.active?}
end
+ # Returns an array of the trackers used by the project and its sub projects
+ def rolled_up_trackers
+ @rolled_up_trackers ||=
+ Tracker.find(:all, :include => :projects,
+ :select => "DISTINCT #{Tracker.table_name}.*",
+ :conditions => ["#{Project.table_name}.id = ? OR #{Project.table_name}.parent_id = ?", id, id],
+ :order => "#{Tracker.table_name}.position")
+ end
+
# Deletes all project's members
def delete_all_members
Member.delete_all(['project_id = ?', id])
diff --git a/app/models/query.rb b/app/models/query.rb
index 09dc0d581..3a1b5a19e 100644
--- a/app/models/query.rb
+++ b/app/models/query.rb
@@ -132,8 +132,11 @@ class Query < ActiveRecord::Base
def available_filters
return @available_filters if @available_filters
+
+ trackers = project.nil? ? Tracker.find(:all, :order => 'position') : project.rolled_up_trackers
+
@available_filters = { "status_id" => { :type => :list_status, :order => 1, :values => IssueStatus.find(:all, :order => 'position').collect{|s| [s.name, s.id.to_s] } },
- "tracker_id" => { :type => :list, :order => 2, :values => Tracker.find(:all, :order => 'position').collect{|s| [s.name, s.id.to_s] } },
+ "tracker_id" => { :type => :list, :order => 2, :values => trackers.collect{|s| [s.name, s.id.to_s] } },
"priority_id" => { :type => :list, :order => 3, :values => Enumeration.find(:all, :conditions => ['opt=?','IPRI']).collect{|s| [s.name, s.id.to_s] } },
"subject" => { :type => :text, :order => 8 },
"created_on" => { :type => :date_past, :order => 9 },
diff --git a/app/models/tracker.rb b/app/models/tracker.rb
index 8d8647747..07253a227 100644
--- a/app/models/tracker.rb
+++ b/app/models/tracker.rb
@@ -19,6 +19,7 @@ class Tracker < ActiveRecord::Base
before_destroy :check_integrity
has_many :issues
has_many :workflows, :dependent => :delete_all
+ has_and_belongs_to_many :projects
has_and_belongs_to_many :custom_fields, :class_name => 'IssueCustomField', :join_table => "#{table_name_prefix}custom_fields_trackers#{table_name_suffix}", :association_foreign_key => 'custom_field_id'
acts_as_list
diff --git a/test/fixtures/projects_trackers.yml b/test/fixtures/projects_trackers.yml
index cfca5b228..8eb7d85ab 100644
--- a/test/fixtures/projects_trackers.yml
+++ b/test/fixtures/projects_trackers.yml
@@ -14,9 +14,6 @@ projects_trackers_002:
projects_trackers_014:
project_id: 5
tracker_id: 2
-projects_trackers_003:
- project_id: 1
- tracker_id: 3
projects_trackers_015:
project_id: 5
tracker_id: 3
@@ -29,9 +26,6 @@ projects_trackers_005:
projects_trackers_006:
project_id: 2
tracker_id: 3
-projects_trackers_007:
- project_id: 3
- tracker_id: 1
projects_trackers_008:
project_id: 3
tracker_id: 2
diff --git a/test/fixtures/trackers.yml b/test/fixtures/trackers.yml
index d4ea34ac8..2643e8d1a 100644
--- a/test/fixtures/trackers.yml
+++ b/test/fixtures/trackers.yml
@@ -3,11 +3,14 @@ trackers_001:
name: Bug
id: 1
is_in_chlog: true
+ position: 1
trackers_002:
name: Feature request
id: 2
is_in_chlog: true
+ position: 2
trackers_003:
name: Support request
id: 3
is_in_chlog: false
+ position: 3
diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb
index 896f59074..f19aa7748 100644
--- a/test/functional/projects_controller_test.rb
+++ b/test/functional/projects_controller_test.rb
@@ -112,10 +112,10 @@ class ProjectsControllerTest < Test::Unit::TestCase
def test_move_issues_to_another_tracker
@request.session[:user_id] = 1
- post :move_issues, :id => 1, :issue_ids => [1, 2], :new_tracker_id => 3
+ post :move_issues, :id => 1, :issue_ids => [1, 2], :new_tracker_id => 2
assert_redirected_to 'projects/ecookbook/issues'
- assert_equal 3, Issue.find(1).tracker_id
- assert_equal 3, Issue.find(2).tracker_id
+ assert_equal 2, Issue.find(1).tracker_id
+ assert_equal 2, Issue.find(2).tracker_id
end
def test_list_files
diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb
index 62ba2b02d..b05b7b09f 100644
--- a/test/unit/project_test.rb
+++ b/test/unit/project_test.rb
@@ -18,7 +18,7 @@
require File.dirname(__FILE__) + '/../test_helper'
class ProjectTest < Test::Unit::TestCase
- fixtures :projects, :issues, :issue_statuses, :journals, :journal_details, :users, :members, :roles
+ fixtures :projects, :issues, :issue_statuses, :journals, :journal_details, :users, :members, :roles, :projects_trackers, :trackers
def setup
@ecookbook = Project.find(1)
@@ -112,6 +112,20 @@ class ProjectTest < Test::Unit::TestCase
sub.parent = Project.find(2)
assert !sub.save
end
+
+ def test_rolled_up_trackers
+ parent = Project.find(1)
+ child = parent.children.find(3)
+
+ assert_equal [1, 2], parent.tracker_ids
+ assert_equal [2, 3], child.tracker_ids
+
+ assert_kind_of Tracker, parent.rolled_up_trackers.first
+ assert_equal Tracker.find(1), parent.rolled_up_trackers.first
+
+ assert_equal [1, 2, 3], parent.rolled_up_trackers.collect(&:id)
+ assert_equal [2, 3], child.rolled_up_trackers.collect(&:id)
+ end
def test_issues_status_changes
journals = @ecookbook.issues_status_changes 3.days.ago.to_date, Date.today