From 049051103b02efdef64f4119959d95d23d45e392 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Wed, 16 Jan 2008 21:27:48 +0000 Subject: [PATCH] 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 --- app/controllers/projects_controller.rb | 4 ++-- app/models/project.rb | 9 +++++++++ app/models/query.rb | 5 ++++- app/models/tracker.rb | 1 + test/fixtures/projects_trackers.yml | 6 ------ test/fixtures/trackers.yml | 3 +++ test/functional/projects_controller_test.rb | 6 +++--- test/unit/project_test.rb | 16 +++++++++++++++- 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 -- 2.39.5