From c86ad15b8c50b7d301955fca6629545bc1bc0d03 Mon Sep 17 00:00:00 2001 From: Kara Diaby Date: Wed, 28 Aug 2024 12:40:16 +0000 Subject: [PATCH 1/2] Ajoute hide_instructeurs_identity sur Procedures et dans l'interface admin --- .../instructeurs_options_component.html.haml | 11 +++++ .../groupe_instructeurs_controller.rb | 11 +++++ config/routes.rb | 1 + ...dd_hide_instructeur_email_to_procedures.rb | 7 +++ db/schema.rb | 1 + ...2553_backfill_hide_instructeurs_email.rake | 45 +++++++++++++++++++ .../groupe_instructeurs_controller_spec.rb | 37 +++++++++++++++ 7 files changed, 113 insertions(+) create mode 100644 db/migrate/20240828101537_add_hide_instructeur_email_to_procedures.rb create mode 100644 lib/tasks/deployment/20240830192553_backfill_hide_instructeurs_email.rake diff --git a/app/components/procedure/instructeurs_options_component/instructeurs_options_component.html.haml b/app/components/procedure/instructeurs_options_component/instructeurs_options_component.html.haml index 903cf6e64..244b4bc98 100644 --- a/app/components/procedure/instructeurs_options_component/instructeurs_options_component.html.haml +++ b/app/components/procedure/instructeurs_options_component/instructeurs_options_component.html.haml @@ -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? }", 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 %p.fr-mt-2w Routage %p.fr-mt-2w= t('.routing_configuration_notice_1') diff --git a/app/controllers/administrateurs/groupe_instructeurs_controller.rb b/app/controllers/administrateurs/groupe_instructeurs_controller.rb index 61225de77..f7bdc59e7 100644 --- a/app/controllers/administrateurs/groupe_instructeurs_controller.rb +++ b/app/controllers/administrateurs/groupe_instructeurs_controller.rb @@ -320,6 +320,13 @@ module Administrateurs notice: "L’autogestion des instructeurs est #{procedure.instructeurs_self_management_enabled? ? "activée" : "désactivée"}." 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 if procedure.publiee_or_close? 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) end + def hide_instructeurs_email_params + params.require(:procedure).permit(:hide_instructeurs_email) + end + def routing_enabled_params { routing_enabled: params.require(:routing) == 'enable' } end diff --git a/config/routes.rb b/config/routes.rb index 06aecc577..cf08519cb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -669,6 +669,7 @@ Rails.application.routes.draw do post 'create_simple_routing' delete 'destroy_all_groups_but_defaut' patch 'update_instructeurs_self_management_enabled' + patch 'update_hide_instructeurs_email' post 'import' get 'export_groupe_instructeurs' end diff --git a/db/migrate/20240828101537_add_hide_instructeur_email_to_procedures.rb b/db/migrate/20240828101537_add_hide_instructeur_email_to_procedures.rb new file mode 100644 index 000000000..74ac10919 --- /dev/null +++ b/db/migrate/20240828101537_add_hide_instructeur_email_to_procedures.rb @@ -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 diff --git a/db/schema.rb b/db/schema.rb index bbef3938d..f99bd1102 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -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.datetime "hidden_at", 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 "juridique_required", default: true t.string "libelle" diff --git a/lib/tasks/deployment/20240830192553_backfill_hide_instructeurs_email.rake b/lib/tasks/deployment/20240830192553_backfill_hide_instructeurs_email.rake new file mode 100644 index 000000000..56f2fbb70 --- /dev/null +++ b/lib/tasks/deployment/20240830192553_backfill_hide_instructeurs_email.rake @@ -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 diff --git a/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb b/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb index 1269856da..2ab7037b1 100644 --- a/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb @@ -995,4 +995,41 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do expect(gi_1_1.signature).to be_attached 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 From 9cebac1d99ff20081c5739700561b377aff51ea2 Mon Sep 17 00:00:00 2001 From: Kara Diaby Date: Sat, 31 Aug 2024 19:04:32 +0000 Subject: [PATCH 2/2] =?UTF-8?q?Supprime=20la=20v=C3=A9rification=20par=20f?= =?UTF-8?q?eature=20flag=20et=20utilise=20la=20v=C3=A9rif=20par=20bool?= =?UTF-8?q?=C3=A9en=20au=20bool=C3=A9en?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/commentaire.rb | 2 +- config/initializers/flipper.rb | 1 - spec/components/dossiers/message_component_spec.rb | 6 ++---- spec/models/commentaire_spec.rb | 5 ++--- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app/models/commentaire.rb b/app/models/commentaire.rb index ccd4de283..6570c9094 100644 --- a/app/models/commentaire.rb +++ b/app/models/commentaire.rb @@ -39,7 +39,7 @@ class Commentaire < ApplicationRecord def redacted_email if sent_by_instructeur? - if dossier.procedure.feature_enabled?(:hide_instructeur_email) + if dossier.procedure.hide_instructeurs_email? "Instructeur n° #{instructeur.id}" else instructeur.email.split('@').first diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb index bf87cfae4..8595349bf 100644 --- a/config/initializers/flipper.rb +++ b/config/initializers/flipper.rb @@ -31,7 +31,6 @@ features = [ :expression_reguliere_type_de_champ, :gallery_demande, :groupe_instructeur_api_hack, - :hide_instructeur_email, :sva, :switch_domain ] diff --git a/spec/components/dossiers/message_component_spec.rb b/spec/components/dossiers/message_component_spec.rb index d62dd2489..8614988d6 100644 --- a/spec/components/dossiers/message_component_spec.rb +++ b/spec/components/dossiers/message_component_spec.rb @@ -42,13 +42,11 @@ RSpec.describe Dossiers::MessageComponent, type: :component do context 'with an instructeur message' do 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(:dossier) { create(:dossier, :en_construction, commentaires: [commentaire], procedure: procedure) } context 'on a procedure with anonymous instructeurs' do - before { Flipper.enable(:hide_instructeur_email, procedure) } - context 'redacts the instructeur email' do it { is_expected.to have_text(commentaire.body) } it { is_expected.to have_text("Instructeur n° #{instructeur.id}") } @@ -57,7 +55,7 @@ RSpec.describe Dossiers::MessageComponent, type: :component do end 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 it { is_expected.to have_text(commentaire.body) } diff --git a/spec/models/commentaire_spec.rb b/spec/models/commentaire_spec.rb index 0a32c59e6..0eda7103e 100644 --- a/spec/models/commentaire_spec.rb +++ b/spec/models/commentaire_spec.rb @@ -51,7 +51,7 @@ describe Commentaire do describe "#redacted_email" do subject { commentaire.redacted_email } - let(:procedure) { create(:procedure) } + let(:procedure) { create(:procedure, hide_instructeurs_email: false) } let(:dossier) { create(:dossier, procedure: procedure) } context 'with a commentaire created by a instructeur' do @@ -59,12 +59,11 @@ describe Commentaire do let(:commentaire) { build :commentaire, instructeur: instructeur, dossier: dossier } context 'when the procedure shows instructeurs email' do - before { Flipper.disable(:hide_instructeur_email, procedure) } it { is_expected.to eq 'some_user' } end 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}" } end end