format.xml { render :xml => @issue.errors, :status => :unprocessable_entity }
end
end
-
- rescue ActiveRecord::StaleObjectError
- # Optimistic locking exception
- flash.now[:error] = l(:notice_locking_conflict)
- # Remove the previously added attachments if issue was not updated
- attachments[:files].each(&:destroy) if attachments[:files]
end
def reply
done_ratio
estimated_hours
custom_field_values
+ lock_version
) unless const_defined?(:SAFE_ATTRIBUTES)
# Safely sets attributes
end
# Saves an issue, time_entry, attachments, and a journal from the parameters
+ # Returns false if save fails
def save_issue_with_child_records(params, existing_time_entry=nil)
if params[:time_entry] && params[:time_entry][:hours].present? && User.current.allowed_to?(:log_time, project)
@time_entry = existing_time_entry || TimeEntry.new
attachments[:files].each {|a| @current_journal.details << JournalDetail.new(:property => 'attachment', :prop_key => a.id, :value => a.filename)}
# TODO: Rename hook
Redmine::Hook.call_hook(:controller_issues_edit_before_save, { :params => params, :issue => self, :time_entry => @time_entry, :journal => @current_journal})
- if save
- # TODO: Rename hook
- Redmine::Hook.call_hook(:controller_issues_edit_after_save, { :params => params, :issue => self, :time_entry => @time_entry, :journal => @current_journal})
- return true
+ begin
+ if save
+ # TODO: Rename hook
+ Redmine::Hook.call_hook(:controller_issues_edit_after_save, { :params => params, :issue => self, :time_entry => @time_entry, :journal => @current_journal})
+ return true
+ else
+ return false
+ end
+ rescue ActiveRecord::StaleObjectError
+ attachments[:files].each(&:destroy)
+ errors.add_to_base l(:notice_locking_conflict)
+ return false
end
end
- # failure, returns false
-
end
# Unassigns issues from +version+ if it's no longer shared with issue's project
assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
end
+ def test_put_update_stale_issue
+ issue = Issue.find(2)
+ @request.session[:user_id] = 2
+
+ assert_no_difference 'Journal.count' do
+ assert_no_difference 'Attachment.count' do
+ put :update,
+ :id => issue.id,
+ :issue => {
+ :fixed_version_id => 4,
+ :lock_version => (issue.lock_version - 1)
+ },
+ :notes => '',
+ :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
+ end
+ end
+
+ assert_response :success
+ assert_template 'edit'
+ assert_tag :tag => 'div', :attributes => { :id => 'errorExplanation' },
+ :content => /Data has been updated by another user/
+ end
+
def test_get_bulk_edit
@request.session[:user_id] = 2
get :bulk_edit, :ids => [1, 2]