From edf3eefa87fa47148739509a5fc15379b2529e1a Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Thu, 13 Dec 2018 17:24:36 +0100 Subject: [PATCH] Fix Sentry 114, Instructeur can delete pj in private champs --- .../new_gestionnaire/dossiers_controller.rb | 7 ++++ .../purge_champ_piece_justificative.js.erb | 2 + .../_piece_justificative.html.haml | 5 ++- config/routes.rb | 4 ++ .../dossiers_controller_spec.rb | 40 +++++++++++++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 app/views/new_gestionnaire/dossiers/purge_champ_piece_justificative.js.erb diff --git a/app/controllers/new_gestionnaire/dossiers_controller.rb b/app/controllers/new_gestionnaire/dossiers_controller.rb index 2ae4e52da..2efa419cf 100644 --- a/app/controllers/new_gestionnaire/dossiers_controller.rb +++ b/app/controllers/new_gestionnaire/dossiers_controller.rb @@ -136,6 +136,13 @@ module NewGestionnaire redirect_to annotations_privees_gestionnaire_dossier_path(procedure, dossier) end + def purge_champ_piece_justificative + @champ = dossier.champs_private.find(params[:champ_id]) + @champ.piece_justificative_file.purge + + flash.notice = 'La pièce jointe a bien été supprimée.' + end + def print @dossier = dossier render layout: "print" diff --git a/app/views/new_gestionnaire/dossiers/purge_champ_piece_justificative.js.erb b/app/views/new_gestionnaire/dossiers/purge_champ_piece_justificative.js.erb new file mode 100644 index 000000000..b564293b9 --- /dev/null +++ b/app/views/new_gestionnaire/dossiers/purge_champ_piece_justificative.js.erb @@ -0,0 +1,2 @@ +<%= render_flash(timeout: 5000, sticky: true) %> +<%= remove_element("#piece_justificative_#{@champ.id}") %> diff --git a/app/views/shared/dossiers/editable_champs/_piece_justificative.html.haml b/app/views/shared/dossiers/editable_champs/_piece_justificative.html.haml index 1785b68d7..7ba9eb33e 100644 --- a/app/views/shared/dossiers/editable_champs/_piece_justificative.html.haml +++ b/app/views/shared/dossiers/editable_champs/_piece_justificative.html.haml @@ -13,7 +13,10 @@ %div{ id: "piece_justificative_#{champ.id}" } = render partial: "shared/champs/piece_justificative/pj_link", locals: { champ: champ, user_can_upload: true } %br - = link_to 'supprimer', purge_champ_piece_justificative_dossier_path(champ_id: champ.id), remote: true, method: :delete + - if champ.private? + = link_to 'supprimer', gestionnaire_champ_purge_champ_piece_justificative_path(procedure_id: champ.dossier.procedure_id, dossier_id: champ.dossier_id, champ_id: champ.id), remote: true, method: :delete + - else + = link_to 'supprimer', purge_champ_piece_justificative_dossier_path(champ_id: champ.id), remote: true, method: :delete %br Modifier : = form.file_field :piece_justificative_file, diff --git a/config/routes.rb b/config/routes.rb index 5d8fbbc9b..c2e67ecf8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -327,6 +327,10 @@ Rails.application.routes.draw do post 'send-to-instructeurs' => 'dossiers#send_to_instructeurs' post 'avis' => 'dossiers#create_avis' get 'print' => 'dossiers#print' + + resources :champs, only: [] do + delete 'purge_champ_piece_justificative' => 'dossiers#purge_champ_piece_justificative' + end end end end diff --git a/spec/controllers/new_gestionnaire/dossiers_controller_spec.rb b/spec/controllers/new_gestionnaire/dossiers_controller_spec.rb index 6ebdc7a0e..8221c6491 100644 --- a/spec/controllers/new_gestionnaire/dossiers_controller_spec.rb +++ b/spec/controllers/new_gestionnaire/dossiers_controller_spec.rb @@ -405,4 +405,44 @@ describe NewGestionnaire::DossiersController, type: :controller do it { expect(champ_datetime.value).to eq('21/12/2019 13:17') } it { expect(response).to redirect_to(annotations_privees_gestionnaire_dossier_path(dossier.procedure, dossier)) } end + + describe '#purge_champ_piece_justificative' do + before { sign_in(gestionnaire) } + + subject { delete :purge_champ_piece_justificative, params: { procedure_id: champ.dossier.procedure.id, dossier_id: champ.dossier.id, champ_id: champ.id }, format: :js } + + context 'when gestionnaire can process dossier' do + let(:champ){ create(:champ_piece_justificative, dossier_id: dossier.id, private: true) } + + it { is_expected.to have_http_status(200) } + + it do + subject + expect(champ.reload.piece_justificative_file.attached?).to be(false) + end + + context 'but champ is not linked to this dossier' do + let(:champ){ create(:champ_piece_justificative, dossier: create(:dossier), private: true) } + + it { is_expected.to redirect_to(root_path) } + + it do + subject + expect(champ.reload.piece_justificative_file.attached?).to be(true) + end + end + end + + context 'when gestionnaire cannot process dossier' do + let(:dossier){ create(:dossier, procedure: create(:procedure)) } + let(:champ){ create(:champ_piece_justificative, dossier_id: dossier.id, private: true) } + + it { is_expected.to redirect_to(root_path) } + + it do + subject + expect(champ.reload.piece_justificative_file.attached?).to be(true) + end + end + end end