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
This commit is contained in:
Eric Davis 2010-09-14 19:02:25 +00:00
parent 8900797ada
commit cdfc57d544
5 changed files with 65 additions and 15 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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