summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/helpers/timelog_helper.rb1
-rw-r--r--app/models/time_entry.rb4
-rw-r--r--test/functional/timelog_controller_test.rb42
3 files changed, 46 insertions, 1 deletions
diff --git a/app/helpers/timelog_helper.rb b/app/helpers/timelog_helper.rb
index fe5acb8f6..6fa0e0442 100644
--- a/app/helpers/timelog_helper.rb
+++ b/app/helpers/timelog_helper.rb
@@ -44,6 +44,7 @@ module TimelogHelper
def user_collection_for_select_options(time_entry)
collection = time_entry.assignable_users
+ collection << time_entry.user unless time_entry.user.nil? && !collection.include?(time_entry.user)
principals_options_for_select(collection, time_entry.user_id.to_s)
end
diff --git a/app/models/time_entry.rb b/app/models/time_entry.rb
index a763dc1be..e8ea1a88d 100644
--- a/app/models/time_entry.rb
+++ b/app/models/time_entry.rb
@@ -146,7 +146,9 @@ class TimeEntry < ActiveRecord::Base
end
end
errors.add :project_id, :invalid if project.nil?
- errors.add :user_id, :invalid if user_id != author_id && !self.assignable_users.map(&:id).include?(user_id)
+ if user_id_changed? && user_id != author_id && !self.assignable_users.map(&:id).include?(user_id)
+ errors.add :user_id, :invalid
+ end
errors.add :issue_id, :invalid if (issue_id && !issue) || (issue && project!=issue.project) || @invalid_issue_id
errors.add :activity_id, :inclusion if activity_id_changed? && project && !project.activities.include?(activity)
if spent_on_changed? && user
diff --git a/test/functional/timelog_controller_test.rb b/test/functional/timelog_controller_test.rb
index a9da5fa42..d98910815 100644
--- a/test/functional/timelog_controller_test.rb
+++ b/test/functional/timelog_controller_test.rb
@@ -186,6 +186,28 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_select 'a[href=?]', '/projects/ecookbook/time_entries', {:text => 'Cancel'}
end
+ def test_get_edit_with_an_existing_time_entry_with_locked_user
+ user = User.find(3)
+ entry = TimeEntry.generate!(:user_id => user.id, :comments => "Time entry on a future locked user")
+ entry.save!
+
+ user.status = User::STATUS_LOCKED
+ user.save!
+ Role.find_by_name('Manager').add_permission! :log_time_for_other_users
+ @request.session[:user_id] = 2
+
+ get :edit, :params => {
+ :id => entry.id
+ }
+
+ assert_response :success
+
+ assert_select 'select[name=?]', 'time_entry[user_id]' do
+ # User with id 3 should be selected even if it's locked
+ assert_select 'option[value="3"][selected=selected]'
+ end
+ end
+
def test_post_create
@request.session[:user_id] = 3
assert_difference 'TimeEntry.count' do
@@ -639,6 +661,26 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_select 'p[id=?]', 'errorExplanation', :text => I18n.t(:error_not_allowed_to_log_time_for_other_users)
end
+ def test_update_should_allow_updating_existing_entry_logged_on_a_locked_user
+ entry = TimeEntry.generate!(:user_id => 2, :hours => 4, :comments => "Time entry on a future locked user")
+ Role.find_by_name('Manager').add_permission! :log_time_for_other_users
+ @request.session[:user_id] = 2
+
+ put :update, :params => {
+ :id => entry.id,
+ :time_entry => {
+ :hours => '6'
+ }
+ }
+
+ assert_response :redirect
+
+ entry.reload
+ # Ensure user didn't change
+ assert_equal 2, entry.user_id
+ assert_equal 6.0, entry.hours
+ end
+
def test_get_bulk_edit
@request.session[:user_id] = 2