Merge pull request #5030 from betagouv/dev

2020-04-09-03
This commit is contained in:
Pierre de La Morinerie 2020-04-09 15:05:28 +02:00 committed by GitHub
commit 85540901c4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 70 additions and 8 deletions

View file

@ -254,7 +254,7 @@ module Instructeurs
private private
def assign_to_params def assign_to_params
params.require(:assign_to).permit(:daily_email_notifications_enabled, :weekly_email_notifications_enabled) params.require(:assign_to).permit(:instant_email_message_notifications_enabled, :daily_email_notifications_enabled, :weekly_email_notifications_enabled)
end end
def assign_exports def assign_exports

View file

@ -197,6 +197,11 @@ module Users
@commentaire = CommentaireService.build(current_user, dossier, commentaire_params) @commentaire = CommentaireService.build(current_user, dossier, commentaire_params)
if @commentaire.save if @commentaire.save
dossier.followers_instructeurs
.with_instant_email_message_notifications
.each do |instructeur|
DossierMailer.notify_new_commentaire_to_instructeur(dossier, instructeur.email).deliver_later
end
flash.notice = "Votre message a bien été envoyé à linstructeur en charge de votre dossier." flash.notice = "Votre message a bien été envoyé à linstructeur en charge de votre dossier."
redirect_to messagerie_dossier_path(dossier) redirect_to messagerie_dossier_path(dossier)
else else

View file

@ -15,10 +15,10 @@ export default class Uploader {
this.progressBar.start(); this.progressBar.start();
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.directUpload.create((error, attributes) => { this.directUpload.create((errorMsg, attributes) => {
if (error) { if (errorMsg) {
this.progressBar.error(error); this.progressBar.error(errorMsg);
reject(error); reject(new Error(errorMsg));
} else { } else {
resolve(attributes.signed_id); resolve(attributes.signed_id);
} }

View file

@ -29,6 +29,12 @@ class DossierMailer < ApplicationMailer
end end
end end
def notify_new_commentaire_to_instructeur(dossier, instructeur_email)
@dossier = dossier
@subject = default_i18n_subject(dossier_id: dossier.id, libelle_demarche: dossier.procedure.libelle)
mail(from: NO_REPLY_EMAIL, to: instructeur_email, subject: @subject)
end
def notify_revert_to_instruction(dossier) def notify_revert_to_instruction(dossier)
@dossier = dossier @dossier = dossier
@service = dossier.procedure.service @service = dossier.procedure.service

View file

@ -19,6 +19,10 @@ class Instructeur < ApplicationRecord
has_one :user, dependent: :nullify has_one :user, dependent: :nullify
scope :with_instant_email_message_notifications, -> {
includes(:assign_to).where(assign_tos: { instant_email_message_notifications_enabled: true })
}
default_scope { eager_load(:user) } default_scope { eager_load(:user) }
def self.by_email(email) def self.by_email(email)

View file

@ -25,7 +25,7 @@
%td= link_to(try_format_datetime(procedure.created_at), admin_procedure_href) %td= link_to(try_format_datetime(procedure.created_at), admin_procedure_href)
%td %td
= link_to('Cloner', admin_procedure_clone_path(procedure.id), data: { method: :put }, class: 'btn-sm btn-primary clone-btn') = link_to('Cloner', admin_procedure_clone_path(procedure.id), data: { method: :put }, class: 'btn-sm btn-primary clone-btn')
- if !procedure.can_be_deleted_by_administrateur? - if procedure.can_be_deleted_by_administrateur?
= link_to('X', url_for(controller: 'admin/procedures', action: :destroy, id: procedure.id), data: { method: :delete, confirm: "Confirmez-vous la suppression de la démarche ? \n\n Attention : toute suppression est définitive et sappliquera aux éventuels autres administrateurs de cette démarche !" }, class: 'btn-sm btn-danger') = link_to('X', url_for(controller: 'admin/procedures', action: :destroy, id: procedure.id), data: { method: :delete, confirm: "Confirmez-vous la suppression de la démarche ? \n\n Attention : toute suppression est définitive et sappliquera aux éventuels autres administrateurs de cette démarche !" }, class: 'btn-sm btn-danger')
= smart_listing.paginate = smart_listing.paginate

View file

@ -0,0 +1,10 @@
- content_for(:title, "#{@subject}")
%p
Bonjour,
%p
= t('.body', dossier_id: @dossier.id, libelle_demarche: @dossier.procedure.libelle)
%p= link_to("Messagerie du dossier n°#{@dossier.id}", messagerie_instructeur_dossier_url(procedure_id: @dossier.procedure.id, dossier_id: @dossier.id))
= render partial: "layouts/mailers/signature"

View file

@ -11,6 +11,22 @@
.explication .explication
Configurez sur cette page les notifications que vous souhaitez recevoir par email pour cette démarche. Configurez sur cette page les notifications que vous souhaitez recevoir par email pour cette démarche.
= form.label :email_notification, "Recevoir une notification à chaque message déposé"
%p.notice
Cet email vous signale le dépôt d'un nouveau message sur vos dossiers suivis.
%p.notice
Il est envoyé à chaque fois qu'un usager dépose un message.
.radios
%label
= form.radio_button :instant_email_message_notifications_enabled, true
Oui
%label
= form.radio_button :instant_email_message_notifications_enabled, false
Non
= form.label :email_notification, "Recevoir une notification quotidienne" = form.label :email_notification, "Recevoir une notification quotidienne"
%p.notice %p.notice

View file

@ -0,0 +1,5 @@
fr:
dossier_mailer:
notify_new_commentaire_to_instructeur:
subject: Nouveau commentaire déposé sur le dossier n°%{dossier_id}
body: Un nouveau commentaire a été déposé par l'usager sur le dossier n° %{dossier_id} de la démarche %{libelle_demarche}

View file

@ -0,0 +1,5 @@
class AddInstantEmailMessageNotificationsToAssignTos < ActiveRecord::Migration[5.2]
def change
add_column :assign_tos, :instant_email_message_notifications_enabled, :boolean, default: false, null: false
end
end

View file

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2020_03_19_103836) do ActiveRecord::Schema.define(version: 2020_04_07_135256) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -103,6 +103,7 @@ ActiveRecord::Schema.define(version: 2020_03_19_103836) do
t.bigint "groupe_instructeur_id" t.bigint "groupe_instructeur_id"
t.boolean "weekly_email_notifications_enabled", default: true, null: false t.boolean "weekly_email_notifications_enabled", default: true, null: false
t.boolean "daily_email_notifications_enabled", default: false, null: false t.boolean "daily_email_notifications_enabled", default: false, null: false
t.boolean "instant_email_message_notifications_enabled", default: false, null: false
t.index ["groupe_instructeur_id", "instructeur_id"], name: "unique_couple_groupe_instructeur_instructeur", unique: true t.index ["groupe_instructeur_id", "instructeur_id"], name: "unique_couple_groupe_instructeur_instructeur", unique: true
t.index ["groupe_instructeur_id"], name: "index_assign_tos_on_groupe_instructeur_id" t.index ["groupe_instructeur_id"], name: "index_assign_tos_on_groupe_instructeur_id"
t.index ["instructeur_id", "procedure_id"], name: "index_assign_tos_on_instructeur_id_and_procedure_id", unique: true t.index ["instructeur_id", "procedure_id"], name: "index_assign_tos_on_instructeur_id_and_procedure_id", unique: true

View file

@ -783,7 +783,10 @@ describe Users::DossiersController, type: :controller do
end end
describe "#create_commentaire" do describe "#create_commentaire" do
let(:dossier) { create(:dossier, :en_construction, user: user) } let(:instructeur_with_instant_message) { create(:instructeur) }
let(:instructeur_without_instant_message) { create(:instructeur) }
let(:procedure) { create(:procedure, :published) }
let(:dossier) { create(:dossier, :en_construction, procedure: procedure, user: user) }
let(:saved_commentaire) { dossier.commentaires.first } let(:saved_commentaire) { dossier.commentaires.first }
let(:body) { "avant\napres" } let(:body) { "avant\napres" }
let(:file) { Rack::Test::UploadedFile.new("./spec/fixtures/files/piece_justificative_0.pdf", 'application/pdf') } let(:file) { Rack::Test::UploadedFile.new("./spec/fixtures/files/piece_justificative_0.pdf", 'application/pdf') }
@ -802,12 +805,19 @@ describe Users::DossiersController, type: :controller do
before do before do
sign_in(user) sign_in(user)
allow(ClamavService).to receive(:safe_file?).and_return(scan_result) allow(ClamavService).to receive(:safe_file?).and_return(scan_result)
allow(DossierMailer).to receive(:notify_new_commentaire_to_instructeur).and_return(double(deliver_later: nil))
instructeur_with_instant_message.follow(dossier)
instructeur_without_instant_message.follow(dossier)
create(:assign_to, instructeur: instructeur_with_instant_message, procedure: procedure, instant_email_message_notifications_enabled: true, groupe_instructeur: procedure.defaut_groupe_instructeur)
create(:assign_to, instructeur: instructeur_without_instant_message, procedure: procedure, instant_email_message_notifications_enabled: false, groupe_instructeur: procedure.defaut_groupe_instructeur)
end end
it "creates a commentaire" do it "creates a commentaire" do
expect { subject }.to change(Commentaire, :count).by(1) expect { subject }.to change(Commentaire, :count).by(1)
expect(response).to redirect_to(messagerie_dossier_path(dossier)) expect(response).to redirect_to(messagerie_dossier_path(dossier))
expect(DossierMailer).to have_received(:notify_new_commentaire_to_instructeur).with(dossier, instructeur_with_instant_message.email)
expect(DossierMailer).not_to have_received(:notify_new_commentaire_to_instructeur).with(dossier, instructeur_without_instant_message.email)
expect(flash.notice).to be_present expect(flash.notice).to be_present
end end
end end