Merge pull request #10721 from demarches-simplifiees/feat/10671
ETQ admin la non divulgation d'email des instructeurs n'est plus sous feature flag
This commit is contained in:
commit
7bc43bd94b
11 changed files with 118 additions and 9 deletions
|
@ -15,6 +15,17 @@
|
||||||
hint: "L’autogestion des instructeurs permet aux instructeurs de gérer eux-mêmes la liste des instructeurs de la démarche.#{ 'Nous recommandons de laisser l’autogestion des instructeurs activée.' if @procedure.routing_enabled? }",
|
hint: "L’autogestion des instructeurs permet aux instructeurs de gérer eux-mêmes la liste des instructeurs de la démarche.#{ 'Nous recommandons de laisser l’autogestion des instructeurs activée.' if @procedure.routing_enabled? }",
|
||||||
disabled: false)
|
disabled: false)
|
||||||
|
|
||||||
|
%li
|
||||||
|
= form_for @procedure,
|
||||||
|
method: :patch,
|
||||||
|
url: update_hide_instructeurs_email_admin_procedure_groupe_instructeurs_path(@procedure),
|
||||||
|
data: { controller: 'autosubmit', turbo: 'true' } do |f|
|
||||||
|
|
||||||
|
= render Dsfr::ToggleComponent.new(form: f,
|
||||||
|
target: :hide_instructeurs_email,
|
||||||
|
title: "Anonymat des instructeurs",
|
||||||
|
hint: "Permet de cacher l'adresse mail des instructeurs aux usagers lors de leurs interactions par le biais de la messagerie. Cette option est à activer pour les démarches sensibles.",
|
||||||
|
disabled: false)
|
||||||
%hr
|
%hr
|
||||||
%p.fr-mt-2w Routage
|
%p.fr-mt-2w Routage
|
||||||
%p.fr-mt-2w= t('.routing_configuration_notice_1')
|
%p.fr-mt-2w= t('.routing_configuration_notice_1')
|
||||||
|
|
|
@ -320,6 +320,13 @@ module Administrateurs
|
||||||
notice: "L’autogestion des instructeurs est #{procedure.instructeurs_self_management_enabled? ? "activée" : "désactivée"}."
|
notice: "L’autogestion des instructeurs est #{procedure.instructeurs_self_management_enabled? ? "activée" : "désactivée"}."
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_hide_instructeurs_email
|
||||||
|
procedure.update!(hide_instructeurs_email_params)
|
||||||
|
|
||||||
|
redirect_to options_admin_procedure_groupe_instructeurs_path(procedure),
|
||||||
|
notice: "L'anonymisation des instructeurs est #{procedure.hide_instructeurs_email? ? "activée" : "désactivée"}."
|
||||||
|
end
|
||||||
|
|
||||||
def import
|
def import
|
||||||
if procedure.publiee_or_close?
|
if procedure.publiee_or_close?
|
||||||
if !CSV_ACCEPTED_CONTENT_TYPES.include?(csv_file.content_type) && !CSV_ACCEPTED_CONTENT_TYPES.include?(marcel_content_type)
|
if !CSV_ACCEPTED_CONTENT_TYPES.include?(csv_file.content_type) && !CSV_ACCEPTED_CONTENT_TYPES.include?(marcel_content_type)
|
||||||
|
@ -463,6 +470,10 @@ module Administrateurs
|
||||||
params.require(:procedure).permit(:instructeurs_self_management_enabled)
|
params.require(:procedure).permit(:instructeurs_self_management_enabled)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def hide_instructeurs_email_params
|
||||||
|
params.require(:procedure).permit(:hide_instructeurs_email)
|
||||||
|
end
|
||||||
|
|
||||||
def routing_enabled_params
|
def routing_enabled_params
|
||||||
{ routing_enabled: params.require(:routing) == 'enable' }
|
{ routing_enabled: params.require(:routing) == 'enable' }
|
||||||
end
|
end
|
||||||
|
|
|
@ -39,7 +39,7 @@ class Commentaire < ApplicationRecord
|
||||||
|
|
||||||
def redacted_email
|
def redacted_email
|
||||||
if sent_by_instructeur?
|
if sent_by_instructeur?
|
||||||
if dossier.procedure.feature_enabled?(:hide_instructeur_email)
|
if dossier.procedure.hide_instructeurs_email?
|
||||||
"Instructeur n° #{instructeur.id}"
|
"Instructeur n° #{instructeur.id}"
|
||||||
else
|
else
|
||||||
instructeur.email.split('@').first
|
instructeur.email.split('@').first
|
||||||
|
|
|
@ -31,7 +31,6 @@ features = [
|
||||||
:expression_reguliere_type_de_champ,
|
:expression_reguliere_type_de_champ,
|
||||||
:gallery_demande,
|
:gallery_demande,
|
||||||
:groupe_instructeur_api_hack,
|
:groupe_instructeur_api_hack,
|
||||||
:hide_instructeur_email,
|
|
||||||
:sva,
|
:sva,
|
||||||
:switch_domain
|
:switch_domain
|
||||||
]
|
]
|
||||||
|
|
|
@ -669,6 +669,7 @@ Rails.application.routes.draw do
|
||||||
post 'create_simple_routing'
|
post 'create_simple_routing'
|
||||||
delete 'destroy_all_groups_but_defaut'
|
delete 'destroy_all_groups_but_defaut'
|
||||||
patch 'update_instructeurs_self_management_enabled'
|
patch 'update_instructeurs_self_management_enabled'
|
||||||
|
patch 'update_hide_instructeurs_email'
|
||||||
post 'import'
|
post 'import'
|
||||||
get 'export_groupe_instructeurs'
|
get 'export_groupe_instructeurs'
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AddHideInstructeurEmailToProcedures < ActiveRecord::Migration[7.0]
|
||||||
|
def change
|
||||||
|
add_column :procedures, :hide_instructeurs_email, :boolean, default: false, null: false
|
||||||
|
end
|
||||||
|
end
|
|
@ -942,6 +942,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_08_29_141049) do
|
||||||
t.boolean "for_tiers_enabled", default: true, null: false
|
t.boolean "for_tiers_enabled", default: true, null: false
|
||||||
t.datetime "hidden_at", precision: nil
|
t.datetime "hidden_at", precision: nil
|
||||||
t.datetime "hidden_at_as_template", precision: nil
|
t.datetime "hidden_at_as_template", precision: nil
|
||||||
|
t.boolean "hide_instructeurs_email", default: false, null: false
|
||||||
t.boolean "instructeurs_self_management_enabled", default: false
|
t.boolean "instructeurs_self_management_enabled", default: false
|
||||||
t.boolean "juridique_required", default: true
|
t.boolean "juridique_required", default: true
|
||||||
t.string "libelle"
|
t.string "libelle"
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
namespace :after_party do
|
||||||
|
desc 'Deployment task: backfill_hide_instructeurs_email'
|
||||||
|
task backfill_hide_instructeurs_email: :environment do
|
||||||
|
puts "Running deploy task 'backfill_hide_instructeurs_email'"
|
||||||
|
|
||||||
|
feature_name = "hide_instructeur_email"
|
||||||
|
feature = Flipper.feature(feature_name)
|
||||||
|
|
||||||
|
gates = Flipper::Adapters::ActiveRecord::Gate
|
||||||
|
.where(feature_key: feature.key, key: 'actors')
|
||||||
|
|
||||||
|
total_gates = gates.count
|
||||||
|
progress = ProgressReport.new(total_gates)
|
||||||
|
|
||||||
|
puts 'Collecte des démarches avec le feature flag'
|
||||||
|
|
||||||
|
procedure_ids = gates.ids
|
||||||
|
puts procedure_ids
|
||||||
|
|
||||||
|
progress.finish
|
||||||
|
|
||||||
|
puts progress
|
||||||
|
|
||||||
|
puts "Mise à jour des #{procedure_ids.size} démarches"
|
||||||
|
update_progress = ProgressReport.new(procedure_ids.size)
|
||||||
|
|
||||||
|
Procedure.where(id: procedure_ids).in_batches(of: 500) do |batch|
|
||||||
|
batch.update_all(hide_instructeurs_email: true)
|
||||||
|
update_progress.inc(batch.size)
|
||||||
|
puts update_progress
|
||||||
|
end
|
||||||
|
|
||||||
|
update_progress.finish
|
||||||
|
puts update_progress
|
||||||
|
|
||||||
|
puts "Suppression du feature flag '#{feature_name}'"
|
||||||
|
Flipper.remove(feature_name)
|
||||||
|
puts "Feature flag '#{feature_name}' supprimé avec succès"
|
||||||
|
|
||||||
|
AfterParty::TaskRecord
|
||||||
|
.create version: AfterParty::TaskRecorder.new(__FILE__).timestamp
|
||||||
|
end
|
||||||
|
end
|
|
@ -42,13 +42,11 @@ RSpec.describe Dossiers::MessageComponent, type: :component do
|
||||||
|
|
||||||
context 'with an instructeur message' do
|
context 'with an instructeur message' do
|
||||||
let(:instructeur) { create(:instructeur) }
|
let(:instructeur) { create(:instructeur) }
|
||||||
let(:procedure) { create(:procedure) }
|
let(:procedure) { create(:procedure, hide_instructeurs_email: true) }
|
||||||
let(:commentaire) { create(:commentaire, instructeur: instructeur, body: 'Second message') }
|
let(:commentaire) { create(:commentaire, instructeur: instructeur, body: 'Second message') }
|
||||||
let(:dossier) { create(:dossier, :en_construction, commentaires: [commentaire], procedure: procedure) }
|
let(:dossier) { create(:dossier, :en_construction, commentaires: [commentaire], procedure: procedure) }
|
||||||
|
|
||||||
context 'on a procedure with anonymous instructeurs' do
|
context 'on a procedure with anonymous instructeurs' do
|
||||||
before { Flipper.enable(:hide_instructeur_email, procedure) }
|
|
||||||
|
|
||||||
context 'redacts the instructeur email' do
|
context 'redacts the instructeur email' do
|
||||||
it { is_expected.to have_text(commentaire.body) }
|
it { is_expected.to have_text(commentaire.body) }
|
||||||
it { is_expected.to have_text("Instructeur n° #{instructeur.id}") }
|
it { is_expected.to have_text("Instructeur n° #{instructeur.id}") }
|
||||||
|
@ -57,7 +55,7 @@ RSpec.describe Dossiers::MessageComponent, type: :component do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'on a procedure where instructeurs names are not redacted' do
|
context 'on a procedure where instructeurs names are not redacted' do
|
||||||
before { Flipper.disable(:hide_instructeur_email, procedure) }
|
let(:procedure) { create(:procedure, hide_instructeurs_email: false) }
|
||||||
|
|
||||||
context 'redacts the instructeur email but keeps the name' do
|
context 'redacts the instructeur email but keeps the name' do
|
||||||
it { is_expected.to have_text(commentaire.body) }
|
it { is_expected.to have_text(commentaire.body) }
|
||||||
|
|
|
@ -995,4 +995,41 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
|
||||||
expect(gi_1_1.signature).to be_attached
|
expect(gi_1_1.signature).to be_attached
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#update_hide_instructeurs_email' do
|
||||||
|
let(:administrateur) { administrateurs(:default_admin) }
|
||||||
|
let(:procedure) { create(:procedure, administrateurs: [administrateur]) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
sign_in(administrateur.user)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when activating hide_instructeurs_email' do
|
||||||
|
it 'updates the procedure and redirects with correct notice' do
|
||||||
|
patch :update_hide_instructeurs_email, params: {
|
||||||
|
procedure_id: procedure.id,
|
||||||
|
procedure: { hide_instructeurs_email: "1" }
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(procedure.reload.hide_instructeurs_email).to be true
|
||||||
|
expect(response).to redirect_to(options_admin_procedure_groupe_instructeurs_path(procedure))
|
||||||
|
expect(flash[:notice]).to eq("L'anonymisation des instructeurs est activée.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when deactivating hide_instructeurs_email' do
|
||||||
|
let(:procedure) { create(:procedure, hide_instructeurs_email: true, administrateurs: [administrateur]) }
|
||||||
|
|
||||||
|
it 'updates the procedure and redirects with correct notice' do
|
||||||
|
patch :update_hide_instructeurs_email, params: {
|
||||||
|
procedure_id: procedure.id,
|
||||||
|
procedure: { hide_instructeurs_email: "0" }
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(procedure.reload.hide_instructeurs_email).to be false
|
||||||
|
expect(response).to redirect_to(options_admin_procedure_groupe_instructeurs_path(procedure))
|
||||||
|
expect(flash[:notice]).to eq("L'anonymisation des instructeurs est désactivée.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -51,7 +51,7 @@ describe Commentaire do
|
||||||
describe "#redacted_email" do
|
describe "#redacted_email" do
|
||||||
subject { commentaire.redacted_email }
|
subject { commentaire.redacted_email }
|
||||||
|
|
||||||
let(:procedure) { create(:procedure) }
|
let(:procedure) { create(:procedure, hide_instructeurs_email: false) }
|
||||||
let(:dossier) { create(:dossier, procedure: procedure) }
|
let(:dossier) { create(:dossier, procedure: procedure) }
|
||||||
|
|
||||||
context 'with a commentaire created by a instructeur' do
|
context 'with a commentaire created by a instructeur' do
|
||||||
|
@ -59,12 +59,11 @@ describe Commentaire do
|
||||||
let(:commentaire) { build :commentaire, instructeur: instructeur, dossier: dossier }
|
let(:commentaire) { build :commentaire, instructeur: instructeur, dossier: dossier }
|
||||||
|
|
||||||
context 'when the procedure shows instructeurs email' do
|
context 'when the procedure shows instructeurs email' do
|
||||||
before { Flipper.disable(:hide_instructeur_email, procedure) }
|
|
||||||
it { is_expected.to eq 'some_user' }
|
it { is_expected.to eq 'some_user' }
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the procedure hides instructeurs email' do
|
context 'when the procedure hides instructeurs email' do
|
||||||
before { Flipper.enable(:hide_instructeur_email, procedure) }
|
let(:procedure) { create(:procedure, hide_instructeurs_email: true) }
|
||||||
it { is_expected.to eq "Instructeur n° #{instructeur.id}" }
|
it { is_expected.to eq "Instructeur n° #{instructeur.id}" }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue