summaryrefslogtreecommitdiff
path: root/app/models/note.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/note.rb')
-rw-r--r--app/models/note.rb110
1 files changed, 70 insertions, 40 deletions
diff --git a/app/models/note.rb b/app/models/note.rb
index b055ae623b2..3ad03cc601b 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -19,7 +19,6 @@ require 'carrierwave/orm/activerecord'
require 'file_size_validator'
class Note < ActiveRecord::Base
-
attr_accessible :note, :noteable, :noteable_id, :noteable_type, :project_id,
:attachment, :line_code, :commit_id
@@ -34,6 +33,7 @@ class Note < ActiveRecord::Base
delegate :name, :email, to: :author, prefix: true
validates :note, :project, presence: true
+ validates :line_code, format: { with: /\A\d+_\d+_\d+\Z/ }, allow_blank: true
validates :attachment, file_size: { maximum: 10.megabytes.to_i }
validates :noteable_id, presence: true, if: ->(n) { n.noteable_type.present? && n.noteable_type != 'Commit' }
@@ -60,12 +60,68 @@ class Note < ActiveRecord::Base
}, without_protection: true)
end
- def notify
- @notify ||= false
+ def commit_author
+ @commit_author ||=
+ project.users.find_by_email(noteable.author_email) ||
+ project.users.find_by_name(noteable.author_name)
+ rescue
+ nil
end
- def notify_author
- @notify_author ||= false
+ 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
+ @discussion_id ||= [:discussion, noteable_type.underscore, noteable_id, line_code].join("-").to_sym
+ end
+
+ # Returns true if this is a downvote note,
+ # otherwise false is returned
+ def downvote?
+ votable? && (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_issue?
+ noteable_type == "Issue"
+ end
+
+ def for_merge_request?
+ noteable_type == "MergeRequest"
+ end
+
+ def for_merge_request_diff_line?
+ for_merge_request? && for_diff_line?
+ end
+
+ def for_wall?
+ noteable_type.blank?
end
# override to return commits, which are not active record
@@ -81,50 +137,24 @@ class Note < ActiveRecord::Base
nil
end
- # Check if we can notify commit author
- # with email about our comment
- #
- # If commit author email exist in project
- # and commit author is not passed user we can
- # send email to him
- #
- # params:
- # user - current user
- #
- # return:
- # Boolean
- #
- def notify_only_author?(user)
- for_commit? && commit_author &&
- commit_author.email != user.email
- end
-
- def for_commit?
- noteable_type == "Commit"
- end
-
- def for_diff_line?
- line_code.present?
+ def notify
+ @notify ||= false
end
- def commit_author
- @commit_author ||=
- project.users.find_by_email(noteable.author_email) ||
- project.users.find_by_name(noteable.author_name)
- rescue
- nil
+ def notify_author
+ @notify_author ||= false
end
# Returns true if this is an upvote note,
# otherwise false is returned
def upvote?
- note.start_with?('+1') || note.start_with?(':+1:')
+ votable? && (note.start_with?('+1') ||
+ note.start_with?(':+1:')
+ )
end
- # Returns true if this is a downvote note,
- # otherwise false is returned
- def downvote?
- note.start_with?('-1') || note.start_with?(':-1:')
+ def votable?
+ for_issue? || (for_merge_request? && !for_diff_line?)
end
def noteable_type_name