summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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