diff --git a/app/models/issue.rb b/app/models/issue.rb index d6d6c7c8b..4da07dfec 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -47,7 +47,7 @@ class Issue < ActiveRecord::Base :preload => [:project, :status, :tracker], :scope => lambda {|options| options[:open_issues] ? self.open : self.all} - acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id} (#{o.status}): #{o.subject}"}, + acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id} (#{o.event_status}): #{o.subject}"}, :url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.id}}, :type => Proc.new {|o| 'issue' + (o.closed? ? '-closed' : '')} @@ -1465,6 +1465,16 @@ def css_classes(user=User.current) s end + # Retrieves issue's original status from journal if modified since issue creation + def event_status + changed_statuses = JournalDetail.joins("LEFT OUTER JOIN #{Journal.table_name} ON #{JournalDetail.table_name}.journal_id = #{Journal.table_name}.id"). + where("#{Journal.table_name}.journalized_id = ? AND #{Journal.table_name}.journalized_type = 'Issue' AND #{JournalDetail.table_name}.prop_key = 'status_id'", self.id). + order("#{Journal.table_name}.created_on") + + initial_status_id = changed_statuses.first.try(:old_value) + initial_status_id ? IssueStatus.find_by_id(initial_status_id.to_i) : self.status + end + # Unassigns issues from +version+ if it's no longer shared with issue's project def self.update_versions_from_sharing_change(version) # Update issues assigned to the version diff --git a/test/unit/activity_test.rb b/test/unit/activity_test.rb index 2cfbeae00..00e72a833 100644 --- a/test/unit/activity_test.rb +++ b/test/unit/activity_test.rb @@ -132,6 +132,101 @@ def test_event_group_for_wiki_content_version assert_equal content.page, content.event_group end + def test_activity_contains_issue_status_update_events + issue = Issue.generate!(:status_id => 1) + + events = find_events(User.anonymous, :project => @project) + target_issue_events = events.find_all { |event| event == issue || (event.is_a?(Journal) && event.issue == issue ) } + target_issue_events.sort! { |x, y| x.event_datetime <=> y.event_datetime } + event_titles = target_issue_events.map{ |e| e.event_title } + assert_equal("Bug ##{issue.id} (New): Generated", event_titles[0], "event title should includes (New)") + + issue = Issue.find(issue.id) + issue.init_journal(User.first) + issue.status_id = 2 + assert issue.save + + events = find_events(User.anonymous, :project => @project) + target_issue_events = events.find_all { |event| event == issue || (event.is_a?(Journal) && event.issue == issue ) } + target_issue_events.sort! { |x, y| x.event_datetime <=> y.event_datetime } + event_titles = target_issue_events.map{ |e| e.event_title } + assert_equal("Bug ##{issue.id} (New): Generated", event_titles[0], "event title should includes (New)") + assert_equal("Bug ##{issue.id} (Assigned): Generated", event_titles[1], "event title should includes (Assinged)") + + issue = Issue.find(issue.id) + issue.init_journal(User.first) + issue.status_id = 3 + assert issue.save + + events = find_events(User.anonymous, :project => @project) + target_issue_events = events.find_all { |event| event == issue || (event.is_a?(Journal) && event.issue == issue ) } + target_issue_events.sort! { |x, y| x.event_datetime <=> y.event_datetime } + event_titles = target_issue_events.map{ |e| e.event_title } + assert_equal("Bug ##{issue.id} (New): Generated", event_titles[0], "event title should includes (New)") + assert_equal("Bug ##{issue.id} (Assigned): Generated", event_titles[1], "event title should includes (Assinged)") + assert_equal("Bug ##{issue.id} (Resolved): Generated", event_titles[2], "event title should includes (Resolved)") + end + + def test_activity_contains_issue_status_update_events2 + # ステータス以外(サブジェクト)を変更後、ステータスを変更する + # ステータス以外(サブジェクト)とステータスを一度に変更する + + issue = Issue.generate!(:status_id => 1, :subject => "Generated") + + issue = Issue.find(issue.id) + issue.init_journal(User.first) + issue.subject = "Activity test" + assert issue.save + + issue = Issue.find(issue.id) + issue.init_journal(User.first) + issue.status_id = 3 + assert issue.save + + events = find_events(User.anonymous, :project => @project) + target_issue_events = events.find_all { |event| event == issue || (event.is_a?(Journal) && event.issue == issue ) } + target_issue_events.sort! { |x, y| x.event_datetime <=> y.event_datetime } + event_titles = target_issue_events.map{ |e| e.event_title } + assert_equal("Bug ##{issue.id} (New): Activity test", event_titles[0], "event title should includes (New)") + assert_equal("Bug ##{issue.id} (Resolved): Activity test", event_titles[1], "event title should includes (Resolved)") + + issue = Issue.find(issue.id) + issue.init_journal(User.first, "Close") + issue.subject = "Closing test" + issue.status_id = 5 + assert issue.save + + events = find_events(User.anonymous, :project => @project) + target_issue_events = events.find_all { |event| event == issue || (event.is_a?(Journal) && event.issue == issue ) } + target_issue_events.sort! { |x, y| x.event_datetime <=> y.event_datetime } + event_titles = target_issue_events.map{ |e| e.event_title } + assert_equal("Bug ##{issue.id} (New): Closing test", event_titles[0], "event title should includes (New)") + assert_equal("Bug ##{issue.id} (Resolved): Closing test", event_titles[1], "event title should includes (Resolved)") + assert_equal("Bug ##{issue.id} (Closed): Closing test", event_titles[2], "event title should includes (Closed)") + end + + def test_activity_contains_issue_status_update_events3 + # コメントを追記後、ステータスを変更する + issue = Issue.generate!(:status_id => 1, :subject => "Generated") + + issue = Issue.find(issue.id) + issue.init_journal(User.first, "note") + assert issue.save + + issue = Issue.find(issue.id) + issue.init_journal(User.first) + issue.status_id = 3 + assert issue.save + + events = find_events(User.anonymous, :project => @project) + target_issue_events = events.find_all { |event| event == issue || (event.is_a?(Journal) && event.issue == issue ) } + target_issue_events.sort! { |x, y| x.event_datetime <=> y.event_datetime } + event_titles = target_issue_events.map{ |e| e.event_title } + assert_equal("Bug ##{issue.id} (New): Generated", event_titles[0], "event title should includes (New)") + assert_equal("Bug ##{issue.id}: Generated", event_titles[1], "event title should not include status") + assert_equal("Bug ##{issue.id} (Resolved): Generated", event_titles[2], "event title should includes (Resolved)") + end + class TestActivityProviderWithPermission def self.activity_provider_options {'test' => {:permission => :custom_permission}}