@@ -306,6 +306,17 module IssuesHelper | |||||
306 | end |
|
306 | end | |
307 | when 'attachment' |
|
307 | when 'attachment' | |
308 | label = l(:label_attachment) |
|
308 | label = l(:label_attachment) | |
|
309 | when 'relation' | |||
|
310 | if detail.value && !detail.old_value | |||
|
311 | rel_issue = Issue.find_by_id(detail.value) | |||
|
312 | value = rel_issue.nil? ? "#{l(:label_issue)} #{detail.value}" : | |||
|
313 | (no_html ? rel_issue : link_to_issue(rel_issue)) | |||
|
314 | elsif detail.old_value && !detail.value | |||
|
315 | rel_issue = Issue.find_by_id(detail.old_value) | |||
|
316 | old_value = rel_issue.nil? ? "#{l(:label_issue)} #{detail.old_value}" : | |||
|
317 | (no_html ? rel_issue : link_to_issue(rel_issue)) | |||
|
318 | end | |||
|
319 | label = l(detail.prop_key.to_sym) | |||
309 | end |
|
320 | end | |
310 | call_hook(:helper_issues_show_detail_after_setting, |
|
321 | call_hook(:helper_issues_show_detail_after_setting, | |
311 | {:detail => detail, :label => label, :value => value, :old_value => old_value }) |
|
322 | {:detail => detail, :label => label, :value => value, :old_value => old_value }) | |
@@ -353,7 +364,7 module IssuesHelper | |||||
353 | else |
|
364 | else | |
354 | l(:text_journal_set_to, :label => label, :value => value).html_safe |
|
365 | l(:text_journal_set_to, :label => label, :value => value).html_safe | |
355 | end |
|
366 | end | |
356 | when 'attachment' |
|
367 | when 'attachment', 'relation' | |
357 | l(:text_journal_added, :label => label, :value => value).html_safe |
|
368 | l(:text_journal_added, :label => label, :value => value).html_safe | |
358 | end |
|
369 | end | |
359 | else |
|
370 | else |
@@ -72,6 +72,8 class IssueRelation < ActiveRecord::Base | |||||
72 |
|
72 | |||
73 | attr_protected :issue_from_id, :issue_to_id |
|
73 | attr_protected :issue_from_id, :issue_to_id | |
74 | before_save :handle_issue_order |
|
74 | before_save :handle_issue_order | |
|
75 | after_create :create_journal_after_create | |||
|
76 | after_destroy :create_journal_after_delete | |||
75 |
|
77 | |||
76 | def visible?(user=User.current) |
|
78 | def visible?(user=User.current) | |
77 | (issue_from.nil? || issue_from.visible?(user)) && (issue_to.nil? || issue_to.visible?(user)) |
|
79 | (issue_from.nil? || issue_from.visible?(user)) && (issue_to.nil? || issue_to.visible?(user)) | |
@@ -179,4 +181,30 class IssueRelation < ActiveRecord::Base | |||||
179 | self.relation_type = TYPES[relation_type][:reverse] |
|
181 | self.relation_type = TYPES[relation_type][:reverse] | |
180 | end |
|
182 | end | |
181 | end |
|
183 | end | |
|
184 | ||||
|
185 | def create_journal_after_create | |||
|
186 | journal = issue_from.init_journal(User.current) | |||
|
187 | journal.details << JournalDetail.new(:property => 'relation', | |||
|
188 | :prop_key => label_for(issue_from).to_s, | |||
|
189 | :value => issue_to.id) | |||
|
190 | journal.save | |||
|
191 | journal = issue_to.init_journal(User.current) | |||
|
192 | journal.details << JournalDetail.new(:property => 'relation', | |||
|
193 | :prop_key => label_for(issue_to).to_s, | |||
|
194 | :value => issue_from.id) | |||
|
195 | journal.save | |||
|
196 | end | |||
|
197 | ||||
|
198 | def create_journal_after_delete | |||
|
199 | journal = issue_from.init_journal(User.current) | |||
|
200 | journal.details << JournalDetail.new(:property => 'relation', | |||
|
201 | :prop_key => label_for(issue_from).to_s, | |||
|
202 | :old_value => issue_to.id) | |||
|
203 | journal.save | |||
|
204 | journal = issue_to.init_journal(User.current) | |||
|
205 | journal.details << JournalDetail.new(:property => 'relation', | |||
|
206 | :prop_key => label_for(issue_to).to_s, | |||
|
207 | :old_value => issue_from.id) | |||
|
208 | journal.save | |||
|
209 | end | |||
182 | end |
|
210 | end |
@@ -210,4 +210,36 class IssuesHelperTest < ActionView::TestCase | |||||
210 | :old_value => 'error281.txt', :value => nil) |
|
210 | :old_value => 'error281.txt', :value => nil) | |
211 | assert_match 'error281.txt', show_detail(detail, true) |
|
211 | assert_match 'error281.txt', show_detail(detail, true) | |
212 | end |
|
212 | end | |
|
213 | ||||
|
214 | def test_show_detail_create_relation | |||
|
215 | detail = JournalDetail.new(:property => 'relation', | |||
|
216 | :prop_key => 'label_precedes', | |||
|
217 | :value => 1) | |||
|
218 | assert_equal "Precedes Bug #1: Can't print recipes added", show_detail(detail, true) | |||
|
219 | assert_match %r{<strong>Precedes</strong> <i><a href="/issues/1" class=".+">Bug #1</a>: Can't print recipes</i> added}, | |||
|
220 | show_detail(detail, false) | |||
|
221 | non_existed_issue_number = 9999 | |||
|
222 | assert_nil Issue.find_by_id(non_existed_issue_number) | |||
|
223 | detail = JournalDetail.new(:property => 'relation', | |||
|
224 | :prop_key => 'label_precedes', | |||
|
225 | :value => non_existed_issue_number) | |||
|
226 | assert_equal "Precedes Issue #{non_existed_issue_number} added", show_detail(detail, true) | |||
|
227 | assert_equal "<strong>Precedes</strong> <i>Issue #{non_existed_issue_number}</i> added", show_detail(detail, false) | |||
|
228 | end | |||
|
229 | ||||
|
230 | def test_show_detail_delete_relation | |||
|
231 | detail = JournalDetail.new(:property => 'relation', | |||
|
232 | :prop_key => 'label_precedes', | |||
|
233 | :old_value => 1) | |||
|
234 | assert_equal "Precedes deleted (Bug #1: Can't print recipes)", show_detail(detail, true) | |||
|
235 | assert_match %r{<strong>Precedes</strong> deleted \(<del><i><a href="/issues/1" class=".+">Bug #1</a>: Can't print recipes</i></del>\)}, | |||
|
236 | show_detail(detail, false) | |||
|
237 | non_existed_issue_number = 9999 | |||
|
238 | assert_nil Issue.find_by_id(non_existed_issue_number) | |||
|
239 | detail = JournalDetail.new(:property => 'relation', | |||
|
240 | :prop_key => 'label_precedes', | |||
|
241 | :old_value => non_existed_issue_number) | |||
|
242 | assert_equal "Precedes deleted (Issue 9999)", show_detail(detail, true) | |||
|
243 | assert_equal "<strong>Precedes</strong> deleted (<del><i>Issue 9999</i></del>)", show_detail(detail, false) | |||
|
244 | end | |||
213 | end |
|
245 | end |
@@ -167,4 +167,49 class IssueRelationTest < ActiveSupport::TestCase | |||||
167 | assert !r.save |
|
167 | assert !r.save | |
168 | assert_not_nil r.errors[:base] |
|
168 | assert_not_nil r.errors[:base] | |
169 | end |
|
169 | end | |
|
170 | ||||
|
171 | def test_create_should_make_journal_entry | |||
|
172 | from = Issue.find(1) | |||
|
173 | to = Issue.find(2) | |||
|
174 | from_journals = from.journals.size | |||
|
175 | to_journals = to.journals.size | |||
|
176 | relation = IssueRelation.new(:issue_from => from, :issue_to => to, | |||
|
177 | :relation_type => IssueRelation::TYPE_PRECEDES) | |||
|
178 | assert relation.save | |||
|
179 | from.reload | |||
|
180 | to.reload | |||
|
181 | relation.reload | |||
|
182 | assert_equal from.journals.size, (from_journals + 1) | |||
|
183 | assert_equal to.journals.size, (to_journals + 1) | |||
|
184 | assert_equal 'relation', from.journals.last.details.last.property | |||
|
185 | assert_equal 'label_precedes', from.journals.last.details.last.prop_key | |||
|
186 | assert_equal '2', from.journals.last.details.last.value | |||
|
187 | assert_nil from.journals.last.details.last.old_value | |||
|
188 | assert_equal 'relation', to.journals.last.details.last.property | |||
|
189 | assert_equal 'label_follows', to.journals.last.details.last.prop_key | |||
|
190 | assert_equal '1', to.journals.last.details.last.value | |||
|
191 | assert_nil to.journals.last.details.last.old_value | |||
|
192 | end | |||
|
193 | ||||
|
194 | def test_delete_should_make_journal_entry | |||
|
195 | relation = IssueRelation.find(1) | |||
|
196 | id = relation.id | |||
|
197 | from = relation.issue_from | |||
|
198 | to = relation.issue_to | |||
|
199 | from_journals = from.journals.size | |||
|
200 | to_journals = to.journals.size | |||
|
201 | assert relation.destroy | |||
|
202 | from.reload | |||
|
203 | to.reload | |||
|
204 | assert_equal from.journals.size, (from_journals + 1) | |||
|
205 | assert_equal to.journals.size, (to_journals + 1) | |||
|
206 | assert_equal 'relation', from.journals.last.details.last.property | |||
|
207 | assert_equal 'label_blocks', from.journals.last.details.last.prop_key | |||
|
208 | assert_equal '9', from.journals.last.details.last.old_value | |||
|
209 | assert_nil from.journals.last.details.last.value | |||
|
210 | assert_equal 'relation', to.journals.last.details.last.property | |||
|
211 | assert_equal 'label_blocked_by', to.journals.last.details.last.prop_key | |||
|
212 | assert_equal '10', to.journals.last.details.last.old_value | |||
|
213 | assert_nil to.journals.last.details.last.value | |||
|
214 | end | |||
170 | end |
|
215 | end |
General Comments 0
You need to be logged in to leave comments.
Login now