summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Davis <edavis@littlestreamsoftware.com>2010-09-14 19:02:25 +0000
committerEric Davis <edavis@littlestreamsoftware.com>2010-09-14 19:02:25 +0000
commitcdfc57d5442f72d62437f52af480049c943ecbf8 (patch)
tree576cbf92e5bdeec589544476cc83de216adda120
parent8900797adaf29adc447925b800d5457ca941795f (diff)
downloadredmine-cdfc57d5442f72d62437f52af480049c943ecbf8.tar.gz
redmine-cdfc57d5442f72d62437f52af480049c943ecbf8.zip
Change the TimelogController's to/from dates based on the project time entries
Instead of looking for the earliest and latest time entry system wide for the dates in the form, now TimelogController will only look at the time entries for the current project (and parent/sub projects). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4087 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/controllers/timelog_controller.rb4
-rw-r--r--app/models/project.rb9
-rw-r--r--app/models/time_entry.rb16
-rw-r--r--test/functional/timelog_controller_test.rb6
-rw-r--r--test/unit/time_entry_test.rb45
5 files changed, 65 insertions, 15 deletions
diff --git a/app/controllers/timelog_controller.rb b/app/controllers/timelog_controller.rb
index 726c69d5b..45f41ae5e 100644
--- a/app/controllers/timelog_controller.rb
+++ b/app/controllers/timelog_controller.rb
@@ -260,8 +260,8 @@ private
end
@from, @to = @to, @from if @from && @to && @from > @to
- @from ||= (TimeEntry.earilest_date_for_project || Date.today) - 1
- @to ||= (TimeEntry.latest_date_for_project || Date.today)
+ @from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today)
+ @to ||= (TimeEntry.latest_date_for_project(@project) || Date.today)
end
def load_available_criterias
diff --git a/app/models/project.rb b/app/models/project.rb
index 40898a34e..4b0236b37 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -493,6 +493,15 @@ class Project < ActiveRecord::Base
enabled_modules.clear
end
end
+
+ # Returns an array of projects that are in this project's hierarchy
+ #
+ # Example: parents, children, siblings
+ def hierarchy
+ parents = project.self_and_ancestors || []
+ descendants = project.descendants || []
+ project_hierarchy = parents | descendants # Set union
+ end
# Returns an auto-generated project identifier based on the last identifier used
def self.next_identifier
diff --git a/app/models/time_entry.rb b/app/models/time_entry.rb
index 56801a4ca..9bf970891 100644
--- a/app/models/time_entry.rb
+++ b/app/models/time_entry.rb
@@ -82,11 +82,19 @@ class TimeEntry < ActiveRecord::Base
end
end
- def self.earilest_date_for_project
- TimeEntry.minimum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries))
+ def self.earilest_date_for_project(project=nil)
+ finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
+ if project
+ finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
+ end
+ TimeEntry.minimum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
end
- def self.latest_date_for_project
- TimeEntry.maximum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries))
+ def self.latest_date_for_project(project=nil)
+ finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
+ if project
+ finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
+ end
+ TimeEntry.maximum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
end
end
diff --git a/test/functional/timelog_controller_test.rb b/test/functional/timelog_controller_test.rb
index 9e30a0ae8..0559a95ca 100644
--- a/test/functional/timelog_controller_test.rb
+++ b/test/functional/timelog_controller_test.rb
@@ -283,7 +283,7 @@ class TimelogControllerTest < ActionController::TestCase
assert_not_nil assigns(:total_hours)
assert_equal "162.90", "%.2f" % assigns(:total_hours)
# display all time by default
- assert_equal '2007-03-11'.to_date, assigns(:from)
+ assert_equal '2007-03-12'.to_date, assigns(:from)
assert_equal '2007-04-22'.to_date, assigns(:to)
end
@@ -325,8 +325,8 @@ class TimelogControllerTest < ActionController::TestCase
assert_equal 2, assigns(:entries).size
assert_not_nil assigns(:total_hours)
assert_equal 154.25, assigns(:total_hours)
- # display all time by default
- assert_equal '2007-03-11'.to_date, assigns(:from)
+ # display all time based on what's been logged
+ assert_equal '2007-03-12'.to_date, assigns(:from)
assert_equal '2007-04-22'.to_date, assigns(:to)
end
diff --git a/test/unit/time_entry_test.rb b/test/unit/time_entry_test.rb
index a541fc41f..3069f9368 100644
--- a/test/unit/time_entry_test.rb
+++ b/test/unit/time_entry_test.rb
@@ -50,17 +50,50 @@ class TimeEntryTest < ActiveSupport::TestCase
end
context "#earilest_date_for_project" do
- should "return the lowest spent_on value that is visible to the current user" do
+ setup do
User.current = nil
- assert_equal "2007-03-12", TimeEntry.earilest_date_for_project.to_s
+ @public_project = Project.generate!(:is_public => true)
+ @issue = Issue.generate_for_project!(@public_project)
+ TimeEntry.generate!(:spent_on => '2010-01-01',
+ :issue => @issue,
+ :project => @public_project)
end
+
+ context "without a project" do
+ should "return the lowest spent_on value that is visible to the current user" do
+ assert_equal "2007-03-12", TimeEntry.earilest_date_for_project.to_s
+ end
+ end
+
+ context "with a project" do
+ should "return the lowest spent_on value that is visible to the current user for that project and it's subprojects only" do
+ assert_equal "2010-01-01", TimeEntry.earilest_date_for_project(@public_project).to_s
+ end
+ end
+
end
context "#latest_date_for_project" do
- should "return the highest spent_on value that is visible to the current user" do
+ setup do
User.current = nil
- assert_equal "2007-04-22", TimeEntry.latest_date_for_project.to_s
+ @public_project = Project.generate!(:is_public => true)
+ @issue = Issue.generate_for_project!(@public_project)
+ TimeEntry.generate!(:spent_on => '2010-01-01',
+ :issue => @issue,
+ :project => @public_project)
end
- end
-
+
+ context "without a project" do
+ should "return the highest spent_on value that is visible to the current user" do
+ assert_equal "2010-01-01", TimeEntry.latest_date_for_project.to_s
+ end
+ end
+
+ context "with a project" do
+ should "return the highest spent_on value that is visible to the current user for that project and it's subprojects only" do
+ project = Project.find(1)
+ assert_equal "2007-04-22", TimeEntry.latest_date_for_project(project).to_s
+ end
+ end
+ end
end