diff options
Diffstat (limited to 'app/models/note.rb')
-rw-r--r-- | app/models/note.rb | 110 |
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 |