]> source.dussan.org Git - redmine.git/commitdiff
Gantt chart: display issues that don't have a due date if they are assigned to a...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 25 May 2008 13:26:21 +0000 (13:26 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 25 May 2008 13:26:21 +0000 (13:26 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1455 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/projects_controller.rb
app/models/issue.rb
app/views/projects/gantt.rfpdf
app/views/projects/gantt.rhtml
test/fixtures/issues.yml
test/fixtures/versions.yml
test/functional/projects_controller_test.rb
test/functional/versions_controller_test.rb

index 34ce734a56999f3247cbc20ac909ed1da0b23842..07b29fa2543b9593064ab627c4401ef079f2960e 100644 (file)
@@ -382,11 +382,18 @@ class ProjectsController < ApplicationController
     
     @events = []
     @project.issues_with_subprojects(@with_subprojects) do
+      # Issues that have start and due dates
       @events += Issue.find(:all, 
                            :order => "start_date, due_date",
                            :include => [:tracker, :status, :assigned_to, :priority, :project], 
                            :conditions => ["(((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null and #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')}))", @date_from, @date_to, @date_from, @date_to, @date_from, @date_to]
                            ) unless @selected_tracker_ids.empty?
+      # Issues that don't have a due date but that are assigned to a version with a date
+      @events += Issue.find(:all, 
+                           :order => "start_date, effective_date",
+                           :include => [:tracker, :status, :assigned_to, :priority, :project, :fixed_version], 
+                           :conditions => ["(((start_date>=? and start_date<=?) or (effective_date>=? and effective_date<=?) or (start_date<? and effective_date>?)) and start_date is not null and due_date is null and effective_date is not null and #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')}))", @date_from, @date_to, @date_from, @date_to, @date_from, @date_to]
+                           ) unless @selected_tracker_ids.empty?
       @events += Version.find(:all, :include => :project,
                                     :conditions => ["effective_date BETWEEN ? AND ?", @date_from, @date_to])
     end
index 0618b0f0a57338452d8a0e4f22f381ae90a9c220..633253db7950c84b33fbbceb775488540e10fa73 100644 (file)
@@ -230,6 +230,12 @@ class Issue < ActiveRecord::Base
     relations.select {|r| r.relation_type == IssueRelation::TYPE_DUPLICATES}.collect {|r| r.other_issue(self)}
   end
   
+  # Returns the due date or the target due date if any
+  # Used on gantt chart
+  def due_before
+    due_date || (fixed_version ? fixed_version.effective_date : nil)
+  end
+  
   def duration
     (start_date && due_date) ? due_date - start_date : 0
   end
index a293906ba668c474c8eafb97d41b7d80631e2f6f..e94fc58146924c42ab9a227640f14e0917afffb3 100644 (file)
@@ -124,9 +124,9 @@ pdf.SetFontStyle('B',7)
        \r
        if i.is_a? Issue\r
                i_start_date = (i.start_date >= @date_from ? i.start_date : @date_from )\r
-               i_end_date = (i.due_date <= @date_to ? i.due_date : @date_to )\r
+               i_end_date = (i.due_before <= @date_to ? i.due_before : @date_to )\r
                \r
-               i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor\r
+               i_done_date = i.start_date + ((i.due_before - i.start_date+1)*i.done_ratio/100).floor\r
                i_done_date = (i_done_date <= @date_from ? @date_from : i_done_date )\r
                i_done_date = (i_done_date >= @date_to ? @date_to : i_done_date )\r
                \r
index f398bace746e23e60c1421efbb73c20f5a7ac25f..071e0f32480587c910b548b48ed3becd196c83b0 100644 (file)
@@ -166,9 +166,9 @@ top = headers_height + 10
 @events.each do |i| 
   if i.is_a? Issue 
        i_start_date = (i.start_date >= @date_from ? i.start_date : @date_from )
-       i_end_date = (i.due_date <= @date_to ? i.due_date : @date_to )
+       i_end_date = (i.due_before <= @date_to ? i.due_before : @date_to )
        
-       i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor
+       i_done_date = i.start_date + ((i.due_before - i.start_date+1)*i.done_ratio/100).floor
        i_done_date = (i_done_date <= @date_from ? @date_from : i_done_date )
        i_done_date = (i_done_date >= @date_to ? @date_to : i_done_date )
        
index 48195a7b7620a96db77fb38f8a8f15b5a97cbf38..c037624aef01dd7fb193227ee51ee12d111f9a12 100644 (file)
@@ -13,6 +13,8 @@ issues_001:
   assigned_to_id: \r
   author_id: 2\r
   status_id: 1\r
+  start_date: <%= 1.day.ago.to_date.to_s(:db) %>\r
+  due_date: <%= 10.day.from_now.to_date.to_s(:db) %>\r
 issues_002: \r
   created_on: 2006-07-19 21:04:21 +02:00\r
   project_id: 1\r
@@ -20,13 +22,15 @@ issues_002:
   priority_id: 5\r
   subject: Add ingredients categories\r
   id: 2\r
-  fixed_version_id: \r
+  fixed_version_id: 2\r
   category_id: \r
   description: Ingredients of the recipe should be classified by categories\r
   tracker_id: 2\r
   assigned_to_id: 3\r
   author_id: 2\r
   status_id: 2\r
+  start_date: <%= 2.day.ago.to_date.to_s(:db) %>\r
+  due_date: \r
 issues_003: \r
   created_on: 2006-07-19 21:07:27 +02:00\r
   project_id: 1\r
index bf08660d50712123cca754e6f24b3fb3470ea743..62c5e6f990a2dcb5eb7281466dc969f65d329fa6 100644 (file)
@@ -14,7 +14,7 @@ versions_002:
   updated_on: 2006-07-19 21:00:33 +02:00\r
   id: 2\r
   description: Stable release\r
-  effective_date: 2006-07-19\r
+  effective_date: <%= 20.day.from_now.to_date.to_s(:db) %>\r
 versions_003: \r
   created_on: 2006-07-19 21:00:33 +02:00\r
   name: "2.0"\r
index bebe96f298d53d451124fa10d67f10a493464f86..82b5bdeb66d8140761e349771054e97037899686 100644 (file)
@@ -259,7 +259,16 @@ class ProjectsControllerTest < Test::Unit::TestCase
     get :gantt, :id => 1
     assert_response :success
     assert_template 'gantt.rhtml'
-    assert_not_nil assigns(:events)
+    events = assigns(:events)
+    assert_not_nil events
+    # Issue with start and due dates
+    i = Issue.find(1)
+    assert_not_nil i.due_date
+    assert events.include?(Issue.find(1))
+    # Issue with without due date but targeted to a version with date
+    i = Issue.find(2)
+    assert_nil i.due_date
+    assert events.include?(i)
   end
 
   def test_gantt_with_subprojects_should_not_show_private_subprojects
index 3477c5edd55113f60aa75640f83e1185214ff810..3a118701a497120a3a901112f7320b0698dfd2bd 100644 (file)
@@ -22,7 +22,7 @@ require 'versions_controller'
 class VersionsController; def rescue_action(e) raise e end; end
 
 class VersionsControllerTest < Test::Unit::TestCase
-  fixtures :projects, :versions, :users, :roles, :members, :enabled_modules
+  fixtures :projects, :versions, :issues, :users, :roles, :members, :enabled_modules
   
   def setup
     @controller = VersionsController.new
@@ -60,9 +60,9 @@ class VersionsControllerTest < Test::Unit::TestCase
 
   def test_destroy
     @request.session[:user_id] = 2
-    post :destroy, :id => 2
+    post :destroy, :id => 3
     assert_redirected_to 'projects/settings/ecookbook'
-    assert_nil Version.find_by_id(2)
+    assert_nil Version.find_by_id(3)
   end
   
   def test_issue_status_by