Project

General

Profile

Defect #7293 » activity_new_issue_event_status.patch

v2 - Etienne Massip, 2011-02-08 16:35

View differences:

app/models/issue.rb (working copy)
30 30
  has_many :journals, :as => :journalized, :dependent => :destroy
31 31
  has_many :time_entries, :dependent => :delete_all
32 32
  has_and_belongs_to_many :changesets, :order => "#{Changeset.table_name}.committed_on ASC, #{Changeset.table_name}.id ASC"
33
  
33

  
34 34
  has_many :relations_from, :class_name => 'IssueRelation', :foreign_key => 'issue_from_id', :dependent => :delete_all
35 35
  has_many :relations_to, :class_name => 'IssueRelation', :foreign_key => 'issue_to_id', :dependent => :delete_all
36 36
  
......
42 42
                     :include => [:project, :journals],
43 43
                     # sort by id so that limited eager loading doesn't break with postgresql
44 44
                     :order_column => "#{table_name}.id"
45
  acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id} (#{o.status}): #{o.subject}"},
45
  acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id} (#{o.initial_status()}): #{o.subject}"},
46 46
                :url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.id}},
47 47
                :type => Proc.new {|o| 'issue' + (o.closed? ? ' closed' : '') }
48 48
  
......
90 90
  before_save :close_duplicates, :update_done_ratio_from_issue_status
91 91
  after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal
92 92
  after_destroy :update_parent_attributes
93
  
93

  
94
  # Retrieves issue's original status from journal if modified since issue creation
95
  def initial_status()
96

  
97
    status_modifications = journals.find_all { |journal| journal.new_status }
98
    status_modifications.sort! { |journal_a, journal_b| journal_a.created_on <=> journal_b.created_on }
99

  
100
    status_modifications.empty? ? self.status : status_modifications.first.prev_status 
101
  end
102

  
94 103
  # Returns true if usr or current user is allowed to view the issue
95 104
  def visible?(usr=nil)
96 105
    (usr || User.current).allowed_to?(:view_issues, self.project)
app/models/journal.rb (working copy)
48 48
    c = details.detect {|detail| detail.prop_key == 'status_id'}
49 49
    (c && c.value) ? IssueStatus.find_by_id(c.value.to_i) : nil
50 50
  end
51
  
51

  
52
  def prev_status
53
    c = details.detect {|detail| detail.prop_key == 'status_id'}
54
    (c && c.old_value) ? IssueStatus.find_by_id(c.old_value.to_i) : nil
55
  end
56

  
52 57
  def new_value_for(prop)
53 58
    c = details.detect {|detail| detail.prop_key == prop}
54 59
    c ? c.value : nil
test/unit/activity_test.rb (working copy)
24 24
  def setup
25 25
    @project = Project.find(1)
26 26
  end
27
  
27

  
28
  def test_activity_contains_issue_status_update_events
29
    events = find_events(User.anonymous, :project => @project)
30
    assert_not_nil events
31

  
32
    events.sort! { |x,y| x.event_datetime <=> y.event_datetime }
33

  
34
    issue_creation_events = events.find_all { |event| event == Issue.find(8) }
35

  
36
    assert_equal 1, issue_creation_events.size
37
    assert_equal IssueStatus.find_by_name('New'), issue_creation_events.first.initial_status
38

  
39
    issue_status_update_events = events.find_all { |event| event.is_a?(Journal) && event.issue == Issue.find(8) }
40

  
41
    assert_equal 2, issue_status_update_events.size
42
    assert_equal IssueStatus.find_by_name('New'), issue_status_update_events.first.prev_status
43
    assert_equal IssueStatus.find_by_name('Resolved'), issue_status_update_events.first.new_status
44

  
45
    assert_equal IssueStatus.find_by_name('Resolved'), issue_status_update_events.last.prev_status
46
    assert_equal IssueStatus.find_by_name('Closed'), issue_status_update_events.last.new_status
47
  end
48

  
28 49
  def test_activity_without_subprojects
29 50
    events = find_events(User.anonymous, :project => @project)
30 51
    assert_not_nil events
test/fixtures/journal_details.yml (working copy)
20 20
  value: "6"
21 21
  prop_key: fixed_version_id
22 22
  journal_id: 4
23
journal_details_004:
24
  old_value: "1"
25
  property: attr
26
  id: 4
27
  value: "3"
28
  prop_key: status_id
29
  journal_id: 5
30
journal_details_005:
31
  old_value: "3"
32
  property: attr
33
  id: 5
34
  value: "5"
35
  prop_key: status_id
36
  journal_id: 6
test/fixtures/issues.yml (working copy)
132 132
  lft: 1
133 133
  rgt: 2
134 134
issues_008: 
135
  created_on: <%= 10.days.ago.to_date.to_s(:db) %>
135
  created_on: <%= 12.days.ago.to_date.to_s(:db) %>
136 136
  project_id: 1
137 137
  updated_on: <%= 10.days.ago.to_date.to_s(:db) %>
138 138
  priority_id: 5
test/fixtures/journals.yml (working copy)
27 27
  journalized_type: Issue
28 28
  user_id: 1
29 29
  journalized_id: 6
30
journals_005:
31
  created_on: <%= 11.days.ago.to_date.to_s(:db) %>
32
  notes: "Resolving issue 8."
33
  id: 5
34
  journalized_type: Issue
35
  user_id: 1
36
  journalized_id: 8
37
journals_006:
38
  created_on: <%= 10.days.ago.to_date.to_s(:db) %>
39
  notes: "Closing issue 8."
40
  id: 6
41
  journalized_type: Issue
42
  user_id: 1
43
  journalized_id: 8
(2-2/4)