summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-02-19 18:09:10 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-02-19 18:09:10 +0000
commit33795139ea8e72756bee3675b4e16387425e6ab1 (patch)
tree3ca568fca61482e57810ee30ad5ce4b964a82c4e /app/models
parentc7e385e282bcb8505589bce526e692b7bb819ffa (diff)
downloadgitlab-ce-33795139ea8e72756bee3675b4e16387425e6ab1.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models')
-rw-r--r--app/models/concerns/milestone_eventable.rb9
-rw-r--r--app/models/concerns/resource_event_tools.rb31
-rw-r--r--app/models/issue.rb1
-rw-r--r--app/models/merge_request.rb1
-rw-r--r--app/models/milestone_note.rb49
-rw-r--r--app/models/resource_label_event.rb21
-rw-r--r--app/models/resource_milestone_event.rb30
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