diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2010-04-11 16:48:46 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2010-04-11 16:48:46 +0000 |
commit | f35921d3080ff16f365d2941f82717ddb2a57b7e (patch) | |
tree | f55070df03ea99075c846de5cd959b279f682e4c /app/models/issue.rb | |
parent | 43e5bb75d21f4654414e025b4fd49803507eba3c (diff) | |
download | redmine-f35921d3080ff16f365d2941f82717ddb2a57b7e.tar.gz redmine-f35921d3080ff16f365d2941f82717ddb2a57b7e.zip |
Fixes Issue#save_issue_with_child_records so that time entry do not get saved if issue save fails.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3664 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/issue.rb')
-rw-r--r-- | app/models/issue.rb | 55 |
1 files changed, 28 insertions, 27 deletions
diff --git a/app/models/issue.rb b/app/models/issue.rb index e2c85e1db..263cae132 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -484,34 +484,35 @@ class Issue < ActiveRecord::Base # 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 - @time_entry.project = project - @time_entry.issue = self - @time_entry.user = User.current - @time_entry.spent_on = Date.today - @time_entry.attributes = params[:time_entry] - self.time_entries << @time_entry - end - - if valid? - attachments = Attachment.attach_files(self, params[:attachments]) - - 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}) - 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 + Issue.transaction do + if params[:time_entry] && params[:time_entry][:hours].present? && User.current.allowed_to?(:log_time, project) + @time_entry = existing_time_entry || TimeEntry.new + @time_entry.project = project + @time_entry.issue = self + @time_entry.user = User.current + @time_entry.spent_on = Date.today + @time_entry.attributes = params[:time_entry] + self.time_entries << @time_entry + end + + if valid? + attachments = Attachment.attach_files(self, params[:attachments]) + + 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}) + 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}) + else + raise ActiveRecord::Rollback + end + rescue ActiveRecord::StaleObjectError + attachments[:files].each(&:destroy) + errors.add_to_base l(:notice_locking_conflict) + raise ActiveRecord::Rollback end - rescue ActiveRecord::StaleObjectError - attachments[:files].each(&:destroy) - errors.add_to_base l(:notice_locking_conflict) - return false end end end |