@@ -149,7 +149,8 class Attachment < ActiveRecord::Base | |||||
149 | :file => file, |
|
149 | :file => file, | |
150 | :description => attachment['description'].to_s.strip, |
|
150 | :description => attachment['description'].to_s.strip, | |
151 | :author => User.current) |
|
151 | :author => User.current) | |
152 |
|
152 | obj.attachments << a | ||
|
153 | ||||
153 | if a.new_record? |
|
154 | if a.new_record? | |
154 | obj.unsaved_attachments ||= [] |
|
155 | obj.unsaved_attachments ||= [] | |
155 | obj.unsaved_attachments << a |
|
156 | obj.unsaved_attachments << a |
@@ -35,7 +35,7 class Issue < ActiveRecord::Base | |||||
35 | has_many :relations_to, :class_name => 'IssueRelation', :foreign_key => 'issue_to_id', :dependent => :delete_all |
|
35 | has_many :relations_to, :class_name => 'IssueRelation', :foreign_key => 'issue_to_id', :dependent => :delete_all | |
36 |
|
36 | |||
37 | acts_as_nested_set :scope => 'root_id', :dependent => :destroy |
|
37 | acts_as_nested_set :scope => 'root_id', :dependent => :destroy | |
38 | acts_as_attachable :after_remove => :attachment_removed |
|
38 | acts_as_attachable :after_add => :attachment_added, :after_remove => :attachment_removed | |
39 | acts_as_customizable |
|
39 | acts_as_customizable | |
40 | acts_as_watchable |
|
40 | acts_as_watchable | |
41 | acts_as_searchable :columns => ['subject', "#{table_name}.description", "#{Journal.table_name}.notes"], |
|
41 | acts_as_searchable :columns => ['subject', "#{table_name}.description", "#{Journal.table_name}.notes"], | |
@@ -612,8 +612,6 class Issue < ActiveRecord::Base | |||||
612 |
|
612 | |||
613 | if valid? |
|
613 | if valid? | |
614 | attachments = Attachment.attach_files(self, params[:attachments]) |
|
614 | attachments = Attachment.attach_files(self, params[:attachments]) | |
615 |
|
||||
616 | attachments[:files].each {|a| @current_journal.details << JournalDetail.new(:property => 'attachment', :prop_key => a.id, :value => a.filename)} |
|
|||
617 | # TODO: Rename hook |
|
615 | # TODO: Rename hook | |
618 | Redmine::Hook.call_hook(:controller_issues_edit_before_save, { :params => params, :issue => self, :time_entry => @time_entry, :journal => @current_journal}) |
|
616 | Redmine::Hook.call_hook(:controller_issues_edit_before_save, { :params => params, :issue => self, :time_entry => @time_entry, :journal => @current_journal}) | |
619 | begin |
|
617 | begin | |
@@ -842,6 +840,13 class Issue < ActiveRecord::Base | |||||
842 | end |
|
840 | end | |
843 | end |
|
841 | end | |
844 | end |
|
842 | end | |
|
843 | ||||
|
844 | # Callback on attachment deletion | |||
|
845 | def attachment_added(obj) | |||
|
846 | if @current_journal && !obj.new_record? | |||
|
847 | @current_journal.details << JournalDetail.new(:property => 'attachment', :prop_key => obj.id, :value => obj.filename) | |||
|
848 | end | |||
|
849 | end | |||
845 |
|
850 | |||
846 | # Callback on attachment deletion |
|
851 | # Callback on attachment deletion | |
847 | def attachment_removed(obj) |
|
852 | def attachment_removed(obj) |
@@ -200,7 +200,7 class MailHandler < ActionMailer::Base | |||||
200 | def add_attachments(obj) |
|
200 | def add_attachments(obj) | |
201 | if email.has_attachments? |
|
201 | if email.has_attachments? | |
202 | email.attachments.each do |attachment| |
|
202 | email.attachments.each do |attachment| | |
203 | Attachment.create(:container => obj, |
|
203 | obj.attachments << Attachment.create(:container => obj, | |
204 | :file => attachment, |
|
204 | :file => attachment, | |
205 | :author => user, |
|
205 | :author => user, | |
206 | :content_type => attachment.content_type) |
|
206 | :content_type => attachment.content_type) |
@@ -307,7 +307,7 class MailHandlerTest < ActiveSupport::TestCase | |||||
307 | assert_equal 1, ActionMailer::Base.deliveries.size |
|
307 | assert_equal 1, ActionMailer::Base.deliveries.size | |
308 | end |
|
308 | end | |
309 |
|
309 | |||
310 |
def test_ |
|
310 | def test_update_issue | |
311 | journal = submit_email('ticket_reply.eml') |
|
311 | journal = submit_email('ticket_reply.eml') | |
312 | assert journal.is_a?(Journal) |
|
312 | assert journal.is_a?(Journal) | |
313 | assert_equal User.find_by_login('jsmith'), journal.user |
|
313 | assert_equal User.find_by_login('jsmith'), journal.user | |
@@ -316,7 +316,7 class MailHandlerTest < ActiveSupport::TestCase | |||||
316 | assert_equal 'Feature request', journal.issue.tracker.name |
|
316 | assert_equal 'Feature request', journal.issue.tracker.name | |
317 | end |
|
317 | end | |
318 |
|
318 | |||
319 |
def test_ |
|
319 | def test_update_issue_with_attribute_changes | |
320 | # This email contains: 'Status: Resolved' |
|
320 | # This email contains: 'Status: Resolved' | |
321 | journal = submit_email('ticket_reply_with_status.eml') |
|
321 | journal = submit_email('ticket_reply_with_status.eml') | |
322 | assert journal.is_a?(Journal) |
|
322 | assert journal.is_a?(Journal) | |
@@ -334,15 +334,36 class MailHandlerTest < ActiveSupport::TestCase | |||||
334 | assert !journal.notes.match(/^Status:/i) |
|
334 | assert !journal.notes.match(/^Status:/i) | |
335 | assert !journal.notes.match(/^Start Date:/i) |
|
335 | assert !journal.notes.match(/^Start Date:/i) | |
336 | end |
|
336 | end | |
|
337 | ||||
|
338 | def test_update_issue_with_attachment | |||
|
339 | assert_difference 'Journal.count' do | |||
|
340 | assert_difference 'JournalDetail.count' do | |||
|
341 | assert_difference 'Attachment.count' do | |||
|
342 | assert_no_difference 'Issue.count' do | |||
|
343 | journal = submit_email('ticket_with_attachment.eml') do |raw| | |||
|
344 | raw.gsub! /^Subject: .*$/, 'Subject: Re: [Cookbook - Feature #2] (New) Add ingredients categories' | |||
|
345 | end | |||
|
346 | end | |||
|
347 | end | |||
|
348 | end | |||
|
349 | end | |||
|
350 | journal = Journal.first(:order => 'id DESC') | |||
|
351 | assert_equal Issue.find(2), journal.journalized | |||
|
352 | assert_equal 1, journal.details.size | |||
|
353 | ||||
|
354 | detail = journal.details.first | |||
|
355 | assert_equal 'attachment', detail.property | |||
|
356 | assert_equal 'Paella.jpg', detail.value | |||
|
357 | end | |||
337 |
|
358 | |||
338 |
def test_ |
|
359 | def test_update_issue_should_send_email_notification | |
339 | ActionMailer::Base.deliveries.clear |
|
360 | ActionMailer::Base.deliveries.clear | |
340 | journal = submit_email('ticket_reply.eml') |
|
361 | journal = submit_email('ticket_reply.eml') | |
341 | assert journal.is_a?(Journal) |
|
362 | assert journal.is_a?(Journal) | |
342 | assert_equal 1, ActionMailer::Base.deliveries.size |
|
363 | assert_equal 1, ActionMailer::Base.deliveries.size | |
343 | end |
|
364 | end | |
344 |
|
365 | |||
345 |
def test_ |
|
366 | def test_update_issue_should_not_set_defaults | |
346 | journal = submit_email('ticket_reply.eml', :issue => {:tracker => 'Support request', :priority => 'High'}) |
|
367 | journal = submit_email('ticket_reply.eml', :issue => {:tracker => 'Support request', :priority => 'High'}) | |
347 | assert journal.is_a?(Journal) |
|
368 | assert journal.is_a?(Journal) | |
348 | assert_match /This is reply/, journal.notes |
|
369 | assert_match /This is reply/, journal.notes |
General Comments 0
You need to be logged in to leave comments.
Login now