feat(sva): block configuration changes when procedure is published

This commit is contained in:
Colin Darie 2023-06-02 18:34:46 +02:00
parent afe373c6b4
commit eb7f1f199a
No known key found for this signature in database
GPG key ID: 4FB865FDBCA4BCC4
8 changed files with 71 additions and 10 deletions

View file

@ -8,6 +8,12 @@ class Procedure::SVASVRFormComponent < ApplicationComponent
@configuration = configuration @configuration = configuration
end end
def form_disabled?
return false if procedure.brouillon?
procedure.sva_svr_enabled?
end
def decision_buttons def decision_buttons
scope = ".decision_buttons" scope = ".decision_buttons"

View file

@ -24,3 +24,4 @@ en:
reset_label: "Reset the delay" reset_label: "Reset the delay"
reset_hint: "Example: if the file is resubmitted on April 15 and the delay is 2 months, the decision will be automatically made on June 15, unless the instructor pronounces in the meantime or asks for corrections again" reset_hint: "Example: if the file is resubmitted on April 15 and the delay is 2 months, the decision will be automatically made on June 15, unless the instructor pronounces in the meantime or asks for corrections again"
notice_new_files_only: "Information: if you activate this rule, only the newly submitted files will be subject to it." notice_new_files_only: "Information: if you activate this rule, only the newly submitted files will be subject to it."
notice_edit_denied: "Warning: SVA/SVR cannot be changed or disabled."

View file

@ -24,3 +24,4 @@ fr:
reset_label: "Réinitialiser le délai" reset_label: "Réinitialiser le délai"
reset_hint: "Exemple: si le dossier est re-déposé le 15 avril et que le délai est de 2 mois, la décision sera automatiquement prise le 15 juin, sauf à ce que linstructeur se prononce dici là ou demande à nouveau des corrections" reset_hint: "Exemple: si le dossier est re-déposé le 15 avril et que le délai est de 2 mois, la décision sera automatiquement prise le 15 juin, sauf à ce que linstructeur se prononce dici là ou demande à nouveau des corrections"
notice_new_files_only: "Information : si vous activez cette règle, seuls les nouveaux dossiers déposés y seront soumis." notice_new_files_only: "Information : si vous activez cette règle, seuls les nouveaux dossiers déposés y seront soumis."
notice_edit_denied: "Avertissement : le changement ou la désactivation du SVA/SVR est impossible."

View file

@ -1,11 +1,11 @@
= form_for [procedure, configuration], url: admin_procedure_sva_svr_path(procedure), method: :put do |f| = form_for [procedure, configuration], url: admin_procedure_sva_svr_path(procedure), method: :put do |f|
- if procedure.publiee? - if procedure.publiee? && !procedure.sva_svr_enabled?
.fr-alert.fr-alert--info.fr-alert--sm.fr-mb-4w .fr-alert.fr-alert--info.fr-alert--sm.fr-mb-4w
- if procedure.sva_svr_enabled? %p= t('.notice_new_files_only')
%p Information : si vous désactivez cette règle, seuls les nouveaux dossiers seront impactés. Ceux déjà déjà déposés la conserveront.
- else
%p= t('.notice_new_files_only')
- if procedure.publiee? && procedure.sva_svr_enabled?
.fr-alert.fr-alert--warning.fr-alert--sm.fr-mb-4w
%p= t('.notice_edit_denied')
%fieldset.fr-fieldset %fieldset.fr-fieldset
%legend.fr-fieldset__legend= t(".rule") %legend.fr-fieldset__legend= t(".rule")
@ -27,11 +27,7 @@
%span.fr-hint-text %span.fr-hint-text
= t(".resume_intro") = t(".resume_intro")
- if procedure.publiee? && procedure.sva_svr_enabled?
.fr-alert.fr-alert--warning.fr-alert--sm
%p Attention : un changement de ce réglage affectera les éventuels dossiers en cours.
= render Dsfr::RadioButtonListComponent.new(form: f, target: :resume, buttons: resume_buttons) = render Dsfr::RadioButtonListComponent.new(form: f, target: :resume, buttons: resume_buttons)
= f.submit t(".submit"), class: "fr-btn" = f.submit t(".submit"), class: "fr-btn", disabled: form_disabled?
= link_to t(".cancel"), admin_procedure_path(procedure.id), class: "fr-btn fr-btn--secondary fr-ml-2w" = link_to t(".cancel"), admin_procedure_path(procedure.id), class: "fr-btn fr-btn--secondary fr-ml-2w"

View file

@ -2,6 +2,8 @@ module ProcedureSVASVRConcern
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do included do
validate :sva_svr_immutable_on_published, if: :will_save_change_to_sva_svr?
def sva_svr_enabled? def sva_svr_enabled?
sva? || svr? sva? || svr?
end end
@ -23,5 +25,16 @@ module ProcedureSVASVRConcern
def decision def decision
sva_svr.fetch("decision", nil)&.to_sym sva_svr.fetch("decision", nil)&.to_sym
end end
def decision_was
sva_svr_was.fetch("decision", nil)&.to_sym
end
def sva_svr_immutable_on_published
return if brouillon?
return if [:sva, :svr].exclude?(decision_was)
errors.add(:sva_svr, :immutable)
end
end end
end end

View file

@ -57,3 +57,5 @@ en:
format: 'Private field %{message}' format: 'Private field %{message}'
lien_dpo: lien_dpo:
invalid_uri_or_email: "Fill in with an email or a link" invalid_uri_or_email: "Fill in with an email or a link"
sva_svr:
immutable: "SVA/SVR configuration can no longer be modified"

View file

@ -65,3 +65,5 @@ fr:
invalid_uri_or_email: "Veuillez saisir un mail ou un lien" invalid_uri_or_email: "Veuillez saisir un mail ou un lien"
auto_archive_on: auto_archive_on:
future: doit être dans le futur future: doit être dans le futur
sva_svr:
immutable: "La configuration SVA/SVR ne peut plus être modifiée"

View file

@ -401,6 +401,46 @@ describe Procedure do
end end
end end
end end
context 'with sva svr' do
before {
procedure.sva_svr["decision"] = "svr"
}
context 'when procedure is published with sva' do
let(:procedure) { create(:procedure, :published, :sva) }
it 'prevents changes to sva_svr' do
expect(procedure).not_to be_valid
expect(procedure.errors[:sva_svr].join).to include('ne peut plus être modifiée')
end
end
context 'when procedure is published without sva' do
let(:procedure) { create(:procedure, :published) }
it 'allow activation' do
expect(procedure).to be_valid
end
it 'allow activation from disabled value' do
procedure.sva_svr["decision"] = "disabled"
procedure.save!
procedure.sva_svr["decision"] = "svr"
expect(procedure).to be_valid
end
end
context 'brouillon procedure' do
let(:procedure) { create(:procedure, :sva) }
it "can update sva config" do
expect(procedure).to be_valid
end
end
end
end end
describe 'opendata' do describe 'opendata' do