From f2cf3188d718ff3c6ab9e9229f88c8f7191310bc Mon Sep 17 00:00:00 2001 From: Lisa Durand Date: Tue, 16 May 2023 10:59:17 +0200 Subject: [PATCH 1/2] empty invalid fields to allow clone procedure --- app/models/procedure.rb | 7 +++- .../procedures_controller_spec.rb | 32 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 42bf32233..f0c4b5c53 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -576,8 +576,13 @@ class Procedure < ApplicationRecord procedure.service = nil transaction do - procedure.save + if !procedure.valid? + procedure.errors.attribute_names.each do |attribute| + procedure.send("#{attribute}=", nil) + end + end + procedure.save move_new_children_to_new_parent_coordinate(procedure.draft_revision) end diff --git a/spec/controllers/administrateurs/procedures_controller_spec.rb b/spec/controllers/administrateurs/procedures_controller_spec.rb index 2660d0b5b..95ee5a0b2 100644 --- a/spec/controllers/administrateurs/procedures_controller_spec.rb +++ b/spec/controllers/administrateurs/procedures_controller_spec.rb @@ -572,6 +572,38 @@ describe Administrateurs::ProceduresController, type: :controller do expect(flash[:notice]).to have_content 'Démarche clonée, pensez a vérifier la Présentation et choisir le service a laquelle cette procédure est associé.' end end + + context 'when procedure has invalid fields' do + let(:admin_2) { create(:administrateur) } + let(:path) { 'spec/fixtures/files/invalid_file_format.json' } + + before do + sign_out(admin.user) + sign_in(admin_2.user) + + procedure.notice.attach(io: File.open(path), + filename: "invalid_file_format.json", + content_type: "application/json", + metadata: { virus_scan_result: ActiveStorage::VirusScanner::SAFE }) + + procedure.deliberation.attach(io: File.open(path), + filename: "invalid_file_format.json", + content_type: "application/json", + metadata: { virus_scan_result: ActiveStorage::VirusScanner::SAFE }) + + procedure.created_at = Date.new(2020, 2, 27) + procedure.save! + + subject { put :clone, params: { procedure_id: procedure.id } } + end + + it 'empty invalid fields and allow procedure to be cloned' do + expect(response).to redirect_to admin_procedure_path(id: Procedure.last.id) + expect(Procedure.last.notice.attached?).to be_falsey + expect(Procedure.last.deliberation.attached?).to be_falsey + expect(flash[:notice]).to have_content 'Démarche clonée, pensez a vérifier la Présentation et choisir le service a laquelle cette procédure est associé.' + end + end end describe 'PUT #archive' do From 7e39e8113b465dec0f22fb3f340053a19b67496b Mon Sep 17 00:00:00 2001 From: Lisa Durand Date: Tue, 16 May 2023 17:54:37 +0200 Subject: [PATCH 2/2] feedback PR Colin --- .../administrateurs/procedures_controller.rb | 2 +- app/models/procedure.rb | 13 +++++++------ .../administrateurs/procedures_controller_spec.rb | 6 +++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/controllers/administrateurs/procedures_controller.rb b/app/controllers/administrateurs/procedures_controller.rb index c31d605ad..c739d6996 100644 --- a/app/controllers/administrateurs/procedures_controller.rb +++ b/app/controllers/administrateurs/procedures_controller.rb @@ -169,7 +169,7 @@ module Administrateurs new_procedure = procedure.clone(current_administrateur, cloned_from_library?) if new_procedure.valid? - flash.notice = 'Démarche clonée, pensez a vérifier la Présentation et choisir le service a laquelle cette procédure est associé.' + flash.notice = 'Démarche clonée. Pensez à vérifier la présentation et choisir le service à laquelle cette démarche est associée.' redirect_to admin_procedure_path(id: new_procedure.id) else if cloned_from_library? diff --git a/app/models/procedure.rb b/app/models/procedure.rb index f0c4b5c53..f791e2cec 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -575,14 +575,15 @@ class Procedure < ApplicationRecord procedure.replaced_by_procedure = nil procedure.service = nil - transaction do - if !procedure.valid? - procedure.errors.attribute_names.each do |attribute| - procedure.send("#{attribute}=", nil) - end + if !procedure.valid? + procedure.errors.attribute_names.each do |attribute| + next if [:notice, :deliberation, :logo].exclude?(attribute) + procedure.public_send("#{attribute}=", nil) end + end - procedure.save + transaction do + procedure.save! move_new_children_to_new_parent_coordinate(procedure.draft_revision) end diff --git a/spec/controllers/administrateurs/procedures_controller_spec.rb b/spec/controllers/administrateurs/procedures_controller_spec.rb index 95ee5a0b2..24882f6bc 100644 --- a/spec/controllers/administrateurs/procedures_controller_spec.rb +++ b/spec/controllers/administrateurs/procedures_controller_spec.rb @@ -548,7 +548,7 @@ describe Administrateurs::ProceduresController, type: :controller do expect(Procedure.last.cloned_from_library).to be_falsey expect(Procedure.last.notice.attached?).to be_truthy expect(Procedure.last.deliberation.attached?).to be_truthy - expect(flash[:notice]).to have_content 'Démarche clonée, pensez a vérifier la Présentation et choisir le service a laquelle cette procédure est associé.' + expect(flash[:notice]).to have_content 'Démarche clonée. Pensez à vérifier la présentation et choisir le service à laquelle cette démarche est associée.' end context 'when the procedure is cloned from the library' do @@ -569,7 +569,7 @@ describe Administrateurs::ProceduresController, type: :controller do it 'creates a new procedure and redirect to it' do expect(response).to redirect_to admin_procedure_path(id: Procedure.last.id) - expect(flash[:notice]).to have_content 'Démarche clonée, pensez a vérifier la Présentation et choisir le service a laquelle cette procédure est associé.' + expect(flash[:notice]).to have_content 'Démarche clonée. Pensez à vérifier la présentation et choisir le service à laquelle cette démarche est associée.' end end @@ -601,7 +601,7 @@ describe Administrateurs::ProceduresController, type: :controller do expect(response).to redirect_to admin_procedure_path(id: Procedure.last.id) expect(Procedure.last.notice.attached?).to be_falsey expect(Procedure.last.deliberation.attached?).to be_falsey - expect(flash[:notice]).to have_content 'Démarche clonée, pensez a vérifier la Présentation et choisir le service a laquelle cette procédure est associé.' + expect(flash[:notice]).to have_content 'Démarche clonée. Pensez à vérifier la présentation et choisir le service à laquelle cette démarche est associée.' end end end