refactor(procedure): refactor procedure publish methods
This commit is contained in:
parent
1d2c8e15b2
commit
3ce36222b4
3 changed files with 130 additions and 119 deletions
|
@ -307,10 +307,6 @@ module Administrateurs
|
||||||
|
|
||||||
@procedure.publish_or_reopen!(current_administrateur)
|
@procedure.publish_or_reopen!(current_administrateur)
|
||||||
|
|
||||||
if @procedure.draft_changed?
|
|
||||||
@procedure.publish_revision!
|
|
||||||
end
|
|
||||||
|
|
||||||
if params[:old_procedure].present? && @procedure.errors.empty?
|
if params[:old_procedure].present? && @procedure.errors.empty?
|
||||||
current_administrateur
|
current_administrateur
|
||||||
.procedures
|
.procedures
|
||||||
|
|
129
app/models/concerns/procedure_publish_concern.rb
Normal file
129
app/models/concerns/procedure_publish_concern.rb
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
# 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
|
|
@ -8,6 +8,7 @@ class Procedure < ApplicationRecord
|
||||||
include ProcedureGroupeInstructeurAPIHackConcern
|
include ProcedureGroupeInstructeurAPIHackConcern
|
||||||
include ProcedureSVASVRConcern
|
include ProcedureSVASVRConcern
|
||||||
include ProcedureChorusConcern
|
include ProcedureChorusConcern
|
||||||
|
include ProcedurePublishConcern
|
||||||
include PiecesJointesListConcern
|
include PiecesJointesListConcern
|
||||||
include ColumnsConcern
|
include ColumnsConcern
|
||||||
|
|
||||||
|
@ -329,39 +330,6 @@ class Procedure < ApplicationRecord
|
||||||
dossiers.close_to_expiration.count
|
dossiers.close_to_expiration.count
|
||||||
end
|
end
|
||||||
|
|
||||||
def publish_or_reopen!(administrateur)
|
|
||||||
Procedure.transaction do
|
|
||||||
if brouillon?
|
|
||||||
reset!
|
|
||||||
cleanup_types_de_champ_options!
|
|
||||||
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 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 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 suggested_path(administrateur)
|
def suggested_path(administrateur)
|
||||||
if path_customized?
|
if path_customized?
|
||||||
return path
|
return path
|
||||||
|
@ -770,23 +738,6 @@ class Procedure < ApplicationRecord
|
||||||
"Procedure;#{id}"
|
"Procedure;#{id}"
|
||||||
end
|
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
|
|
||||||
|
|
||||||
def average_dossier_weight
|
def average_dossier_weight
|
||||||
if dossiers.termine.any?
|
if dossiers.termine.any?
|
||||||
dossiers_sample = dossiers.termine.limit(100)
|
dossiers_sample = dossiers.termine.limit(100)
|
||||||
|
@ -801,32 +752,6 @@ class Procedure < ApplicationRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def publish_revision!
|
|
||||||
reset!
|
|
||||||
cleanup_types_de_champ_options!
|
|
||||||
transaction do
|
|
||||||
self.published_revision = draft_revision
|
|
||||||
self.draft_revision = create_new_revision
|
|
||||||
save!(context: :publication)
|
|
||||||
published_revision.touch(:published_at)
|
|
||||||
end
|
|
||||||
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 cnaf_enabled?
|
def cnaf_enabled?
|
||||||
api_particulier_sources['cnaf'].present?
|
api_particulier_sources['cnaf'].present?
|
||||||
end
|
end
|
||||||
|
@ -865,45 +790,6 @@ class Procedure < ApplicationRecord
|
||||||
end
|
end
|
||||||
end
|
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 before_publish
|
|
||||||
assign_attributes(closed_at: nil, unpublished_at: nil)
|
|
||||||
end
|
|
||||||
|
|
||||||
def after_publish(canonical_procedure = nil)
|
|
||||||
self.canonical_procedure = canonical_procedure
|
|
||||||
self.published_revision = draft_revision
|
|
||||||
self.draft_revision = create_new_revision
|
|
||||||
save!(context: :publication)
|
|
||||||
touch(:published_at)
|
|
||||||
published_revision.touch(:published_at)
|
|
||||||
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 update_juridique_required
|
def update_juridique_required
|
||||||
self.juridique_required ||= (cadre_juridique.present? || deliberation.attached?)
|
self.juridique_required ||= (cadre_juridique.present? || deliberation.attached?)
|
||||||
true
|
true
|
||||||
|
|
Loading…
Reference in a new issue