diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-07-20 18:40:28 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-07-20 18:40:28 +0300 |
commit | b595cb0c1dec83de5bdee18284abe86614bed33b (patch) | |
tree | 8c3d4540f193c5ff98019352f554e921b3a41a72 /app/services/issuable | |
parent | 2f9104a328fc8a4bddeaa4627b595166d24671d0 (diff) |
Add latest changes from gitlab-org/gitlab@15-2-stable-eev15.2.0-rc42
Diffstat (limited to 'app/services/issuable')
-rw-r--r-- | app/services/issuable/clone/attributes_rewriter.rb | 126 | ||||
-rw-r--r-- | app/services/issuable/clone/base_service.rb | 40 | ||||
-rw-r--r-- | app/services/issuable/import_csv/base_service.rb | 3 |
3 files changed, 24 insertions, 145 deletions
diff --git a/app/services/issuable/clone/attributes_rewriter.rb b/app/services/issuable/clone/attributes_rewriter.rb deleted file mode 100644 index 279d3051848..00000000000 --- a/app/services/issuable/clone/attributes_rewriter.rb +++ /dev/null @@ -1,126 +0,0 @@ -# frozen_string_literal: true - -module Issuable - module Clone - class AttributesRewriter < ::Issuable::Clone::BaseService - def initialize(current_user, original_entity, new_entity) - @current_user = current_user - @original_entity = original_entity - @new_entity = new_entity - end - - def execute - update_attributes = { labels: cloneable_labels } - - milestone = matching_milestone(original_entity.milestone&.title) - update_attributes[:milestone] = milestone if milestone.present? - - new_entity.update(update_attributes) - - copy_resource_label_events - copy_resource_milestone_events - copy_resource_state_events - end - - private - - def matching_milestone(title) - return if title.blank? || !new_entity.supports_milestone? - - params = { title: title, project_ids: new_entity.project&.id, group_ids: group&.id } - - milestones = MilestonesFinder.new(params).execute - milestones.first - end - - def cloneable_labels - params = { - project_id: new_entity.project&.id, - group_id: group&.id, - title: original_entity.labels.select(:title), - include_ancestor_groups: true - } - - params[:only_group_labels] = true if new_parent.is_a?(Group) - - LabelsFinder.new(current_user, params).execute - end - - def copy_resource_label_events - copy_events(ResourceLabelEvent.table_name, original_entity.resource_label_events) do |event| - event.attributes - .except('id', 'reference', 'reference_html') - .merge(entity_key => new_entity.id, 'action' => ResourceLabelEvent.actions[event.action]) - end - end - - def copy_resource_milestone_events - return unless milestone_events_supported? - - copy_events(ResourceMilestoneEvent.table_name, original_entity.resource_milestone_events) do |event| - if event.remove? - event_attributes_with_milestone(event, nil) - else - matching_destination_milestone = matching_milestone(event.milestone_title) - - event_attributes_with_milestone(event, matching_destination_milestone) if matching_destination_milestone.present? - end - end - end - - def copy_resource_state_events - return unless state_events_supported? - - copy_events(ResourceStateEvent.table_name, original_entity.resource_state_events) do |event| - event.attributes - .except(*blocked_state_event_attributes) - .merge(entity_key => new_entity.id, - 'state' => ResourceStateEvent.states[event.state]) - end - end - - # Overriden on EE::Issuable::Clone::AttributesRewriter - def blocked_state_event_attributes - ['id'] - end - - def event_attributes_with_milestone(event, milestone) - event.attributes - .except('id') - .merge(entity_key => new_entity.id, - 'milestone_id' => milestone&.id, - 'action' => ResourceMilestoneEvent.actions[event.action], - 'state' => ResourceMilestoneEvent.states[event.state]) - end - - def copy_events(table_name, events_to_copy) - events_to_copy.find_in_batches do |batch| - events = batch.map do |event| - yield(event) - end.compact - - ApplicationRecord.legacy_bulk_insert(table_name, events) # rubocop:disable Gitlab/BulkInsert - end - end - - def entity_key - new_entity.class.name.underscore.foreign_key - end - - def milestone_events_supported? - both_respond_to?(:resource_milestone_events) - end - - def state_events_supported? - both_respond_to?(:resource_state_events) - end - - def both_respond_to?(method) - original_entity.respond_to?(method) && - new_entity.respond_to?(method) - end - end - end -end - -Issuable::Clone::AttributesRewriter.prepend_mod_with('Issuable::Clone::AttributesRewriter') diff --git a/app/services/issuable/clone/base_service.rb b/app/services/issuable/clone/base_service.rb index ce9918a4b56..98c50347719 100644 --- a/app/services/issuable/clone/base_service.rb +++ b/app/services/issuable/clone/base_service.rb @@ -3,13 +3,13 @@ module Issuable module Clone class BaseService < IssuableBaseService - attr_reader :original_entity, :new_entity, :target_project + attr_reader :original_entity, :new_entity alias_method :old_project, :project - def execute(original_entity, target_project = nil) + def execute(original_entity, target_parent) @original_entity = original_entity - @target_project = target_project + @target_parent = target_parent # Using transaction because of a high resources footprint # on rewriting notes (unfolding references) @@ -25,19 +25,21 @@ module Issuable private - def copy_award_emoji - AwardEmojis::CopyService.new(original_entity, new_entity).execute - end + attr_reader :target_parent - def copy_notes - Notes::CopyService.new(current_user, original_entity, new_entity).execute + def rewritten_old_entity_attributes(include_milestone: true) + Gitlab::Issuable::Clone::AttributesRewriter.new( + current_user, + original_entity, + target_parent + ).execute(include_milestone: include_milestone) end def update_new_entity update_new_entity_description - update_new_entity_attributes copy_award_emoji copy_notes + copy_resource_events end def update_new_entity_description @@ -52,8 +54,16 @@ module Issuable new_entity.update!(update_description_params) end - def update_new_entity_attributes - AttributesRewriter.new(current_user, original_entity, new_entity).execute + def copy_award_emoji + AwardEmojis::CopyService.new(original_entity, new_entity).execute + end + + def copy_notes + Notes::CopyService.new(current_user, original_entity, new_entity).execute + end + + def copy_resource_events + Gitlab::Issuable::Clone::CopyResourceEventsService.new(current_user, original_entity, new_entity).execute end def update_old_entity @@ -74,14 +84,8 @@ module Issuable new_entity.resource_parent end - def group - if new_entity.project&.group && current_user.can?(:read_group, new_entity.project.group) - new_entity.project.group - end - end - def relative_position - return if original_entity.project.root_ancestor.id != target_project.root_ancestor.id + return if original_entity.project.root_ancestor.id != target_parent.root_ancestor.id original_entity.relative_position end diff --git a/app/services/issuable/import_csv/base_service.rb b/app/services/issuable/import_csv/base_service.rb index 4a2078a4e60..9b41c88159f 100644 --- a/app/services/issuable/import_csv/base_service.rb +++ b/app/services/issuable/import_csv/base_service.rb @@ -23,7 +23,8 @@ module Issuable with_csv_lines.each do |row, line_no| issuable_attributes = { title: row[:title], - description: row[:description] + description: row[:description], + due_date: row[:due_date] } if create_issuable(issuable_attributes).persisted? |