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:
Kara Diaby 2024-09-04 18:02:00 +00:00 committed by GitHub
commit 7bc43bd94b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 118 additions and 9 deletions

View file

@ -15,6 +15,17 @@
hint: "Lautogestion des instructeurs permet aux instructeurs de gérer eux-mêmes la liste des instructeurs de la démarche.#{ 'Nous recommandons de laisser lautogestion des instructeurs activée.' if @procedure.routing_enabled? }", hint: "Lautogestion des instructeurs permet aux instructeurs de gérer eux-mêmes la liste des instructeurs de la démarche.#{ 'Nous recommandons de laisser lautogestion 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')

View file

@ -320,6 +320,13 @@ module Administrateurs
notice: "Lautogestion des instructeurs est #{procedure.instructeurs_self_management_enabled? ? "activée" : "désactivée"}." notice: "Lautogestion 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

View file

@ -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

View file

@ -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
] ]

View file

@ -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

View file

@ -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

View file

@ -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"

View file

@ -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

View file

@ -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) }

View file

@ -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

View file

@ -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