note.rb 3.54 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# == Schema Information
#
# Table name: notes
#
#  id            :integer          not null, primary key
#  note          :text
#  noteable_id   :string(255)
#  noteable_type :string(255)
#  author_id     :integer
#  created_at    :datetime         not null
#  updated_at    :datetime         not null
#  project_id    :integer
#  attachment    :string(255)
#  line_code     :string(255)
#

gitlabhq's avatar
gitlabhq committed
17 18 19 20
require 'carrierwave/orm/activerecord'
require 'file_size_validator'

class Note < ActiveRecord::Base
21 22 23
  attr_accessible :note, :noteable, :noteable_id, :noteable_type, :project_id,
                  :attachment, :line_code

Andrey Kumanyaev's avatar
Andrey Kumanyaev committed
24 25 26
  attr_accessor :notify
  attr_accessor :notify_author

gitlabhq's avatar
gitlabhq committed
27
  belongs_to :project
28
  belongs_to :noteable, polymorphic: true
Nihad Abbasov's avatar
Nihad Abbasov committed
29
  belongs_to :author, class_name: "User"
gitlabhq's avatar
gitlabhq committed
30

Nihad Abbasov's avatar
Nihad Abbasov committed
31 32
  delegate :name, to: :project, prefix: true
  delegate :name, :email, to: :author, prefix: true
33

34
  validates :note, :project, presence: true
Nihad Abbasov's avatar
Nihad Abbasov committed
35
  validates :attachment, file_size: { maximum: 10.megabytes.to_i }
gitlabhq's avatar
gitlabhq committed
36

37
  mount_uploader :attachment, AttachmentUploader
Andrey Kumanyaev's avatar
Andrey Kumanyaev committed
38 39

  # Scopes
40 41 42
  scope :common, ->{ where(noteable_id: nil) }
  scope :today, ->{ where("created_at >= :date", date: Date.today) }
  scope :last_week, ->{ where("created_at  >= :date", date: (Date.today - 7.days)) }
Andrey Kumanyaev's avatar
Andrey Kumanyaev committed
43
  scope :since, ->(day) { where("created_at  >= :date", date: (day)) }
44 45 46
  scope :fresh, ->{ order("created_at ASC, id ASC") }
  scope :inc_author_project, ->{ includes(:project, :author) }
  scope :inc_author, ->{ includes(:author) }
gitlabhq's avatar
gitlabhq committed
47

48
  def self.create_status_change_note(noteable, author, status)
Nihad Abbasov's avatar
Nihad Abbasov committed
49 50 51 52 53 54
    create({
      noteable: noteable,
      project: noteable.project,
      author: author,
      note: "_Status changed to #{status}_"
    }, without_protection: true)
55 56
  end

57 58 59 60 61 62
  def commit_author
    @commit_author ||=
      project.users.find_by_email(noteable.author_email) ||
      project.users.find_by_name(noteable.author_name)
  rescue
    nil
Valery Sizov's avatar
Valery Sizov committed
63
  end
Cedric Gatay's avatar
Cedric Gatay committed
64

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
  def diff
    noteable.diffs[diff_file_index]
  end

  def diff_file_index
    line_code.split('_')[0].to_i
  end

  def diff_file_name
    diff.b_path
  end

  def diff_new_line
    line_code.split('_')[2].to_i
  end

  def discussion_id
82
    @discussion_id ||= [:discussion, noteable_type.underscore, noteable_id, line_code].join("-").to_sym
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
  end

  # Returns true if this is a downvote note,
  # otherwise false is returned
  def downvote?
    note.start_with?('-1') || note.start_with?(':-1:')
  end

  def for_commit?
    noteable_type == "Commit"
  end

  def for_commit_diff_line?
    for_commit? && for_diff_line?
  end

  def for_diff_line?
    line_code.present?
  end

  def for_merge_request?
    noteable_type == "MergeRequest"
  end

  def for_merge_request_diff_line?
    for_merge_request? && for_diff_line?
Cedric Gatay's avatar
Cedric Gatay committed
109
  end
110

Riyad Preukschas's avatar
Riyad Preukschas committed
111 112 113
  # override to return commits, which are not active record
  def noteable
    if for_commit?
114
      project.commit(noteable_id)
115
    else
Riyad Preukschas's avatar
Riyad Preukschas committed
116
      super
117
    end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
118 119
  # Temp fix to prevent app crash
  # if note commit id doesnt exist
120
  rescue
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
121
    nil
122
  end
123

124 125 126 127 128 129 130 131
  def notify
    @notify ||= false
  end

  def notify_author
    @notify_author ||= false
  end

132 133 134
  # Check if we can notify commit author
  # with email about our comment
  #
135 136
  # If commit author email exist in project
  # and commit author is not passed user we can
137 138 139 140
  # send email to him
  #
  # params:
  #   user - current user
141
  #
142 143 144 145
  # return:
  #   Boolean
  #
  def notify_only_author?(user)
Riyad Preukschas's avatar
Riyad Preukschas committed
146
    for_commit? && commit_author &&
147 148 149
      commit_author.email != user.email
  end

150 151 152
  # Returns true if this is an upvote note,
  # otherwise false is returned
  def upvote?
153
    note.start_with?('+1') || note.start_with?(':+1:')
154
  end
gitlabhq's avatar
gitlabhq committed
155
end