130 lines
3.3 KiB
Ruby
130 lines
3.3 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module ProcedurePublishConcern
|
||
|
extend ActiveSupport::Concern
|
||
|
|
||
|
def publish_or_reopen!(administrateur)
|
||
|
Procedure.transaction do
|
||
|
if brouillon?
|
||
|
reset!
|
||
|
end
|
||
|
|
||
|
other_procedure = other_procedure_with_path(path)
|
||
|
if other_procedure.present? && administrateur.owns?(other_procedure)
|
||
|
other_procedure.unpublish!
|
||
|
publish!(other_procedure.canonical_procedure || other_procedure)
|
||
|
else
|
||
|
publish!
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def publish_revision!
|
||
|
reset!
|
||
|
|
||
|
transaction { publish_new_revision }
|
||
|
|
||
|
dossiers
|
||
|
.state_not_termine
|
||
|
.find_each(&:rebase_later)
|
||
|
end
|
||
|
|
||
|
def reset_draft_revision!
|
||
|
if published_revision.present? && draft_changed?
|
||
|
reset!
|
||
|
transaction do
|
||
|
draft_revision.types_de_champ.filter(&:only_present_on_draft?).each(&:destroy)
|
||
|
draft_revision.update(dossier_submitted_message: nil)
|
||
|
draft_revision.destroy
|
||
|
update!(draft_revision: create_new_revision(published_revision))
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def reset!
|
||
|
if !locked? || draft_changed?
|
||
|
dossier_ids_to_destroy = draft_revision.dossiers.ids
|
||
|
if dossier_ids_to_destroy.present?
|
||
|
Rails.logger.info("Resetting #{dossier_ids_to_destroy.size} dossiers on procedure #{id}: #{dossier_ids_to_destroy}")
|
||
|
draft_revision.dossiers.destroy_all
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def before_publish
|
||
|
assign_attributes(closed_at: nil, unpublished_at: nil)
|
||
|
end
|
||
|
|
||
|
def after_publish(canonical_procedure = nil)
|
||
|
self.canonical_procedure = canonical_procedure
|
||
|
touch(:published_at)
|
||
|
publish_new_revision
|
||
|
end
|
||
|
|
||
|
def after_republish(canonical_procedure = nil)
|
||
|
touch(:published_at)
|
||
|
end
|
||
|
|
||
|
def after_close
|
||
|
touch(:closed_at)
|
||
|
end
|
||
|
|
||
|
def after_unpublish
|
||
|
touch(:unpublished_at)
|
||
|
end
|
||
|
|
||
|
def create_new_revision(revision = nil)
|
||
|
transaction do
|
||
|
new_revision = (revision || draft_revision)
|
||
|
.deep_clone(include: [:revision_types_de_champ])
|
||
|
.tap { |revision| revision.published_at = nil }
|
||
|
.tap(&:save!)
|
||
|
|
||
|
move_new_children_to_new_parent_coordinate(new_revision)
|
||
|
|
||
|
# they are not aware of the new tdcs
|
||
|
new_revision.types_de_champ_public.reset
|
||
|
new_revision.types_de_champ_private.reset
|
||
|
|
||
|
new_revision
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def publish_new_revision
|
||
|
cleanup_types_de_champ_options!
|
||
|
cleanup_types_de_champ_children!
|
||
|
self.published_revision = draft_revision
|
||
|
self.draft_revision = create_new_revision
|
||
|
save!(context: :publication)
|
||
|
published_revision.touch(:published_at)
|
||
|
end
|
||
|
|
||
|
def move_new_children_to_new_parent_coordinate(new_draft)
|
||
|
children = new_draft.revision_types_de_champ
|
||
|
.includes(parent: :type_de_champ)
|
||
|
.where.not(parent_id: nil)
|
||
|
coordinates_by_stable_id = new_draft.revision_types_de_champ
|
||
|
.includes(:type_de_champ)
|
||
|
.index_by(&:stable_id)
|
||
|
|
||
|
children.each do |child|
|
||
|
child.update!(parent: coordinates_by_stable_id.fetch(child.parent.stable_id))
|
||
|
end
|
||
|
new_draft.reload
|
||
|
end
|
||
|
|
||
|
def cleanup_types_de_champ_options!
|
||
|
draft_revision.types_de_champ.each do |type_de_champ|
|
||
|
type_de_champ.update!(options: type_de_champ.clean_options)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def cleanup_types_de_champ_children!
|
||
|
draft_revision.types_de_champ.reject(&:repetition?).each do |type_de_champ|
|
||
|
draft_revision.remove_children_of(type_de_champ)
|
||
|
end
|
||
|
end
|
||
|
end
|