diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-02-19 21:09:10 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-02-19 21:09:10 +0300 |
commit | 33795139ea8e72756bee3675b4e16387425e6ab1 (patch) | |
tree | 3ca568fca61482e57810ee30ad5ce4b964a82c4e /app/models | |
parent | c7e385e282bcb8505589bce526e692b7bb819ffa (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/concerns/milestone_eventable.rb | 9 | ||||
-rw-r--r-- | app/models/concerns/resource_event_tools.rb | 31 | ||||
-rw-r--r-- | app/models/issue.rb | 1 | ||||
-rw-r--r-- | app/models/merge_request.rb | 1 | ||||
-rw-r--r-- | app/models/milestone_note.rb | 49 | ||||
-rw-r--r-- | app/models/resource_label_event.rb | 21 | ||||
-rw-r--r-- | app/models/resource_milestone_event.rb | 30 |
7 files changed, 122 insertions, 20 deletions
diff --git a/app/models/concerns/milestone_eventable.rb b/app/models/concerns/milestone_eventable.rb new file mode 100644 index 00000000000..17a02c9d3e4 --- /dev/null +++ b/app/models/concerns/milestone_eventable.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MilestoneEventable + extend ActiveSupport::Concern + + included do + has_many :resource_milestone_events + end +end diff --git a/app/models/concerns/resource_event_tools.rb b/app/models/concerns/resource_event_tools.rb new file mode 100644 index 00000000000..7226b9573e1 --- /dev/null +++ b/app/models/concerns/resource_event_tools.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module ResourceEventTools + extend ActiveSupport::Concern + + included do + belongs_to :user + + validates :user, presence: { unless: :importing? }, on: :create + + validate :exactly_one_issuable + + scope :created_after, ->(time) { where('created_at > ?', time) } + end + + def exactly_one_issuable + issuable_count = self.class.issuable_attrs.count { |attr| self["#{attr}_id"] } + + return true if issuable_count == 1 + + # if none of issuable IDs is set, check explicitly if nested issuable + # object is set, this is used during project import + if issuable_count == 0 && importing? + issuable_count = self.class.issuable_attrs.count { |attr| self.public_send(attr) } # rubocop:disable GitlabSecurity/PublicSend + + return true if issuable_count == 1 + end + + errors.add(:base, "Exactly one of #{self.class.issuable_attrs.join(', ')} is required") + end +end diff --git a/app/models/issue.rb b/app/models/issue.rb index 83f9e803d42..1c191064d1a 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -15,6 +15,7 @@ class Issue < ApplicationRecord include ThrottledTouch include LabelEventable include IgnorableColumns + include MilestoneEventable DueDateStruct = Struct.new(:title, :name).freeze NoDueDate = DueDateStruct.new('No Due Date', '0').freeze diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index b469174fc63..5dda1bd8cc7 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -18,6 +18,7 @@ class MergeRequest < ApplicationRecord include DeprecatedAssignee include ShaAttribute include IgnorableColumns + include MilestoneEventable sha_attribute :squash_commit_sha diff --git a/app/models/milestone_note.rb b/app/models/milestone_note.rb new file mode 100644 index 00000000000..8ff0503502f --- /dev/null +++ b/app/models/milestone_note.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +class MilestoneNote < ::Note + attr_accessor :resource_parent, :event, :milestone + + def self.from_event(event, resource: nil, resource_parent: nil) + resource ||= event.resource + + attrs = { + system: true, + author: event.user, + created_at: event.created_at, + noteable: resource, + milestone: event.milestone, + event: event, + system_note_metadata: ::SystemNoteMetadata.new(action: 'milestone'), + resource_parent: resource_parent + } + + if resource_parent.is_a?(Project) + attrs[:project_id] = resource_parent.id + end + + MilestoneNote.new(attrs) + end + + def note + @note ||= note_text + end + + def note_html + @note_html ||= Banzai::Renderer.cacheless_render_field(self, :note, { group: group, project: project }) + end + + def project + resource_parent if resource_parent.is_a?(Project) + end + + def group + resource_parent if resource_parent.is_a?(Group) + end + + private + + def note_text(html: false) + format = milestone&.group_milestone? ? :name : :iid + milestone.nil? ? 'removed milestone' : "changed milestone to #{milestone.to_reference(project, format: format)}" + end +end diff --git a/app/models/resource_label_event.rb b/app/models/resource_label_event.rb index 98fc9e7bae8..59907f1b962 100644 --- a/app/models/resource_label_event.rb +++ b/app/models/resource_label_event.rb @@ -4,20 +4,17 @@ class ResourceLabelEvent < ApplicationRecord include Importable include Gitlab::Utils::StrongMemoize include CacheMarkdownField + include ResourceEventTools cache_markdown_field :reference - belongs_to :user belongs_to :issue belongs_to :merge_request belongs_to :label - scope :created_after, ->(time) { where('created_at > ?', time) } scope :inc_relations, -> { includes(:label, :user) } - validates :user, presence: { unless: :importing? }, on: :create validates :label, presence: { unless: :importing? }, on: :create - validate :exactly_one_issuable after_save :expire_etag_cache after_destroy :expire_etag_cache @@ -94,22 +91,6 @@ class ResourceLabelEvent < ApplicationRecord end end - def exactly_one_issuable - issuable_count = self.class.issuable_attrs.count { |attr| self["#{attr}_id"] } - - return true if issuable_count == 1 - - # if none of issuable IDs is set, check explicitly if nested issuable - # object is set, this is used during project import - if issuable_count == 0 && importing? - issuable_count = self.class.issuable_attrs.count { |attr| self.public_send(attr) } # rubocop:disable GitlabSecurity/PublicSend - - return true if issuable_count == 1 - end - - errors.add(:base, "Exactly one of #{self.class.issuable_attrs.join(', ')} is required") - end - def expire_etag_cache issuable.expire_note_etag_cache end diff --git a/app/models/resource_milestone_event.rb b/app/models/resource_milestone_event.rb new file mode 100644 index 00000000000..ba43a1ee363 --- /dev/null +++ b/app/models/resource_milestone_event.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class ResourceMilestoneEvent < ApplicationRecord + include Gitlab::Utils::StrongMemoize + include Importable + include ResourceEventTools + + belongs_to :issue + belongs_to :merge_request + belongs_to :milestone + + scope :by_issue, ->(issue) { where(issue_id: issue.id) } + scope :by_merge_request, ->(merge_request) { where(merge_request_id: merge_request.id) } + + enum action: { + add: 1, + remove: 2 + } + + # state is used for issue and merge request states. + enum state: Issue.available_states.merge(MergeRequest.available_states) + + def self.issuable_attrs + %i(issue merge_request).freeze + end + + def resource + issue || merge_request + end +end |