event.rb
2.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
class Event < ActiveRecord::Base
  include PushEvent
  default_scope where("author_id IS NOT NULL")
  Created   = 1
  Updated   = 2
  Closed    = 3
  Reopened  = 4
  Pushed    = 5
  Commented = 6
  Merged    = 7
  belongs_to :project
  belongs_to :target, :polymorphic => true
  # For Hash only
  serialize :data
  scope :recent, order("created_at DESC")
  scope :code_push, where(:action => Pushed)
  def self.determine_action(record)
    if [Issue, MergeRequest].include? record.class
      Event::Created
    elsif record.kind_of? Note
      Event::Commented
    end
  end
  def self.recent_for_user user
    where(:project_id => user.projects.map(&:id)).recent
  end
  # Next events currently enabled for system
  #  - push 
  #  - new issue
  #  - merge request
  def allowed?
    push? || issue? || merge_request?
  end
  def push?
    action == self.class::Pushed && valid_push?
  end
  def merged?
    action == self.class::Merged
  end
  def closed?
    action == self.class::Closed
  end
  def reopened?
    action == self.class::Reopened
  end
  def issue? 
    target_type == "Issue"
  end
  def merge_request? 
    target_type == "MergeRequest"
  end
  def new_issue? 
    target_type == "Issue" && 
      action == Created
  end
  def new_merge_request? 
    target_type == "MergeRequest" && 
      action == Created
  end
  def changed_merge_request? 
    target_type == "MergeRequest" && 
      [Closed, Reopened].include?(action)
  end
  def changed_issue? 
    target_type == "Issue" && 
      [Closed, Reopened].include?(action)
  end
  def issue 
    target if target_type == "Issue"
  end
  def merge_request
    target if target_type == "MergeRequest"
  end
  def author 
    @author ||= User.find(author_id)
  end
  def action_name
    if closed?
      "closed"
    elsif merged?
      "merged"
    else 
      "opened"
    end
  end
  delegate :name, :email, :to => :author, :prefix => true, :allow_nil => true
  delegate :title, :to => :issue, :prefix => true, :allow_nil => true
  delegate :title, :to => :merge_request, :prefix => true, :allow_nil => true
end
# == Schema Information
#
# Table name: events
#
#  id          :integer(4)      not null, primary key
#  target_type :string(255)
#  target_id   :integer(4)
#  title       :string(255)
#  data        :text
#  project_id  :integer(4)
#  created_at  :datetime        not null
#  updated_at  :datetime        not null
#  action      :integer(4)
#  author_id   :integer(4)
#