event.rb 4.6 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# == Schema Information
#
# Table name: events
#
#  id          :integer          not null, primary key
#  target_type :string(255)
#  target_id   :integer
#  title       :string(255)
#  data        :text
#  project_id  :integer
#  created_at  :datetime         not null
#  updated_at  :datetime         not null
#  action      :integer
#  author_id   :integer
#

D
Dmitriy Zaporozhets 已提交
17
class Event < ActiveRecord::Base
18 19 20
  attr_accessible :project, :action, :data, :author_id, :project_id,
                  :target_id, :target_type

21 22
  default_scope where("author_id IS NOT NULL")

23 24 25 26 27 28
  Created   = 1
  Updated   = 2
  Closed    = 3
  Reopened  = 4
  Pushed    = 5
  Commented = 6
29
  Merged    = 7
A
Alex Denisov 已提交
30
  Joined    = 8 # User joined project
A
Alex Denisov 已提交
31
  Left      = 9 # User left project
32

N
Nihad Abbasov 已提交
33 34 35 36
  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

R
randx 已提交
37
  belongs_to :author, class_name: "User"
D
Dmitriy Zaporozhets 已提交
38
  belongs_to :project
39
  belongs_to :target, polymorphic: true
40

R
randx 已提交
41 42
  # For Hash only
  serialize :data
43

A
Andrey Kumanyaev 已提交
44
  # Scopes
45
  scope :recent, order("created_at DESC")
46
  scope :code_push, where(action: Pushed)
47
  scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent }
48

A
Andrey Kumanyaev 已提交
49 50 51 52 53 54 55
  class << self
    def determine_action(record)
      if [Issue, MergeRequest].include? record.class
        Event::Created
      elsif record.kind_of? Note
        Event::Commented
      end
56
    end
D
Dmitriy Zaporozhets 已提交
57 58
  end

59 60 61 62 63 64 65 66
  def proper?
    if push?
      true
    elsif membership_changed?
      true
    else
      (issue? || merge_request? || note? || milestone?) && target
    end
D
Dmitriy Zaporozhets 已提交
67 68
  end

69 70 71 72
  def project_name
    if project
      project.name
    else
R
Riyad Preukschas 已提交
73
      "(deleted project)"
74 75 76
    end
  end

77 78 79 80
  def target_title
    target.try :title
  end

81
  def push?
82
    action == self.class::Pushed && valid_push?
83 84
  end

85 86 87 88
  def merged?
    action == self.class::Merged
  end

89 90 91 92 93 94 95 96
  def closed?
    action == self.class::Closed
  end

  def reopened?
    action == self.class::Reopened
  end

97 98 99 100 101 102 103 104
  def milestone?
    target_type == "Milestone"
  end

  def note?
    target_type == "Note"
  end

105
  def issue?
106
    target_type == "Issue"
107 108
  end

109
  def merge_request?
110
    target_type == "MergeRequest"
111 112
  end

A
Alex Denisov 已提交
113
  def joined?
A
Alex Denisov 已提交
114 115 116 117 118 119 120 121 122
    action == Joined
  end

  def left?
    action == Left
  end

  def membership_changed?
    joined? || left?
A
Alex Denisov 已提交
123 124
  end

125
  def issue
126 127 128 129 130 131 132
    target if target_type == "Issue"
  end

  def merge_request
    target if target_type == "MergeRequest"
  end

133
  def author
134
    @author ||= User.find(author_id)
135
  end
136 137 138 139 140 141

  def action_name
    if closed?
      "closed"
    elsif merged?
      "merged"
A
Alex Denisov 已提交
142 143
    elsif joined?
      'joined'
A
Alex Denisov 已提交
144 145
    elsif left?
      'left'
146
    else
147
      "opened"
148 149
    end
  end
D
Dmitriy Zaporozhets 已提交
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284

  def valid_push?
    data[:ref]
  rescue => ex
    false
  end

  def tag?
    data[:ref]["refs/tags"]
  end

  def branch?
    data[:ref]["refs/heads"]
  end

  def new_branch?
    commit_from =~ /^00000/
  end

  def new_ref?
    commit_from =~ /^00000/
  end

  def rm_ref?
    commit_to =~ /^00000/
  end

  def md_ref?
    !(rm_ref? || new_ref?)
  end

  def commit_from
    data[:before]
  end

  def commit_to
    data[:after]
  end

  def ref_name
    if tag?
      tag_name
    else
      branch_name
    end
  end

  def branch_name
    @branch_name ||= data[:ref].gsub("refs/heads/", "")
  end

  def tag_name
    @tag_name ||= data[:ref].gsub("refs/tags/", "")
  end

  # Max 20 commits from push DESC
  def commits
    @commits ||= data[:commits].map { |commit| project.commit(commit[:id]) }.reverse
  end

  def commits_count
    data[:total_commits_count] || commits.count || 0
  end

  def ref_type
    tag? ? "tag" : "branch"
  end

  def push_action_name
    if new_ref?
      "pushed new"
    elsif rm_ref?
      "deleted"
    else
      "pushed to"
    end
  end

  def parent_commit
    project.commit(commit_from)
  rescue => ex
    nil
  end

  def last_commit
    project.commit(commit_to)
  rescue => ex
    nil
  end

  def push_with_commits?
    md_ref? && commits.any? && parent_commit && last_commit
  rescue Grit::NoSuchPathError
    false
  end

  def last_push_to_non_root?
    branch? && project.default_branch != branch_name
  end

  def note_commit_id
    target.commit_id
  end

  def note_short_commit_id
    note_commit_id[0..8]
  end

  def note_commit?
    target.noteable_type == "Commit"
  end

  def note_target
    target.noteable
  end

  def note_target_id
    if note_commit?
      target.commit_id
    else
      target.noteable_id.to_s
    end
  end

  def wall_note?
    target.noteable_type.blank?
  end

  def note_target_type
    if target.noteable_type.present?
      target.noteable_type.titleize
    else
      "Wall"
    end.downcase
  end
D
Dmitriy Zaporozhets 已提交
285
end