Merge pull request #1891 from betagouv/fix_1855_sense_of_shame

[fix #1855] Gestionnaire: are now invited to create their password
This commit is contained in:
gregoirenovel 2018-04-27 14:43:51 +02:00 committed by GitHub
commit 4ed5b42de9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 101 additions and 24 deletions

View file

@ -23,7 +23,7 @@ class Admin::GestionnairesController < AdminController
procedure_id = params[:procedure_id] procedure_id = params[:procedure_id]
if @gestionnaire.nil? if @gestionnaire.nil?
new_gestionnaire! invite_gestionnaire(params[:gestionnaire][:email])
else else
assign_gestionnaire! assign_gestionnaire!
end end
@ -42,22 +42,23 @@ class Admin::GestionnairesController < AdminController
private private
def new_gestionnaire! def invite_gestionnaire(email)
attributes = params.require(:gestionnaire).permit(:email) password = SecureRandom.hex
.merge(password: SecureRandom.hex(5))
@gestionnaire = Gestionnaire.create( @gestionnaire = Gestionnaire.create(
attributes.merge( email: email,
administrateurs: [current_administrateur] password: password,
) password_confirmation: password,
administrateurs: [current_administrateur]
) )
if @gestionnaire.errors.messages.empty? if @gestionnaire.errors.messages.empty?
@gestionnaire.invite!
if User.exists?(email: @gestionnaire.email) if User.exists?(email: @gestionnaire.email)
GestionnaireMailer.user_to_gestionnaire(@gestionnaire.email).deliver_now! GestionnaireMailer.user_to_gestionnaire(@gestionnaire.email).deliver_now!
else else
User.create(attributes) User.create(email: email, password: password)
GestionnaireMailer.new_gestionnaire(@gestionnaire.email, @gestionnaire.password).deliver_now!
end end
flash.notice = 'Accompagnateur ajouté' flash.notice = 'Accompagnateur ajouté'
else else

View file

@ -0,0 +1,47 @@
class Gestionnaires::ActivateController < ApplicationController
layout "new_application"
def new
@gestionnaire = Gestionnaire.with_reset_password_token(params[:token])
if !@gestionnaire
flash.alert = "Le lien de validation du compte accompagnateur a expiré, contactez-nous à contact@demarches-simplifiees.fr pour obtenir un nouveau lien."
redirect_to root_path
end
end
def create
password = create_gestionnaire_params[:password]
gestionnaire = Gestionnaire.reset_password_by_token({
password: password,
password_confirmation: password,
reset_password_token: create_gestionnaire_params[:reset_password_token]
})
if gestionnaire && gestionnaire.errors.empty?
sign_in(gestionnaire, scope: :gestionnaire)
try_to_authenticate(User, gestionnaire.email, password)
try_to_authenticate(Administrateur, gestionnaire.email, password)
flash.notice = "Mot de passe enregistré"
redirect_to gestionnaire_procedures_path
else
flash.alert = gestionnaire.errors.full_messages
redirect_to gestionnaire_activate_path(token: create_gestionnaire_params[:reset_password_token])
end
end
private
def create_gestionnaire_params
params.require(:gestionnaire).permit(:reset_password_token, :password)
end
def try_to_authenticate(klass, email, password)
resource = klass.find_for_database_authentication(email: email)
if resource&.valid_password?(password)
sign_in resource
resource.force_sync_credentials
end
end
end

View file

@ -1,8 +1,12 @@
class GestionnaireMailer < ApplicationMailer class GestionnaireMailer < ApplicationMailer
layout 'mailers/layout' layout 'mailers/layout'
def new_gestionnaire(email, password) def invite_gestionnaire(gestionnaire, reset_password_token)
send_mail(email, password, "Vous avez été nommé accompagnateur sur demarches-simplifiees.fr") @reset_password_token = reset_password_token
@gestionnaire = gestionnaire
mail(to: gestionnaire.email,
subject: "demarches-simplifiees.fr - Activez votre compte accompagnateur",
reply_to: "contact@demarches-simplifiees.fr")
end end
def user_to_gestionnaire(email) def user_to_gestionnaire(email)

View file

@ -144,6 +144,12 @@ class Gestionnaire < ApplicationRecord
Follow.where(gestionnaire: self, dossier: dossier).update_all(attributes) Follow.where(gestionnaire: self, dossier: dossier).update_all(attributes)
end end
def invite!
reset_password_token = set_reset_password_token
GestionnaireMailer.invite_gestionnaire(self, reset_password_token).deliver_now!
end
private private
def valid_couple_table_attr?(table, column) def valid_couple_table_attr?(table, column)

View file

@ -0,0 +1,19 @@
- content_for(:title, 'Activation de votre compte accompagnateur')
Bonjour,
%br
%br
Vous venez d'être nommé accompagnateur sur demarches-simplifiees.fr.
%br
Votre compte a été créé pour l'adresse email #{@gestionnaire.email}. Pour lactiver, je vous invite à cliquer sur le lien suivant : 
= link_to(gestionnaire_activate_url(token: @reset_password_token), gestionnaire_activate_url(token: @reset_password_token))
%br
%br
Par ailleurs, notre site de documentation qui regroupe l'ensemble des informations relatives à demarches-simplifiees.fr ainsi que des tutoriels dutilisation est à votre disposition : 
= link_to('https://demarches-simplifiees.gitbook.io/demarches-simplifiees/', 'https://demarches-simplifiees.gitbook.io/demarches-simplifiees/')
%br
%br
Bonne journée,
%br
%br
L'équipe demarches-simplifiees.fr

View file

@ -1,11 +0,0 @@
Bienvenue sur demarches-simplifiees.fr,
Vous venez d'être nommé accompagnateur sur demarches-simplifiees.fr. Pour mémoire, voici quelques informations utiles :
URL : <%= new_gestionnaire_session_url %>
Login : <%= @email %>
Mot de passe : <%= @args %>
Bonne journée,
L'équipe demarches-simplifiees.fr

View file

@ -0,0 +1,7 @@
.container
= form_for @gestionnaire, url: { controller: 'gestionnaires/activate', action: :create }, html: { class: "form" } do |f|
%br
%h1= @gestionnaire.email
= f.password_field :password, placeholder: 'Mot de passe'
= f.hidden_field :reset_password_token, value: params[:token]
= f.submit 'Définir le mot de passe', class: 'button large primary expand'

View file

@ -115,6 +115,11 @@ Rails.application.routes.draw do
resource :dossiers resource :dossiers
end end
namespace :gestionnaire do
get 'activate' => '/gestionnaires/activate#new'
patch 'activate' => '/gestionnaires/activate#create'
end
namespace :admin do namespace :admin do
get 'activate' => '/administrateurs/activate#new' get 'activate' => '/administrateurs/activate#new'
patch 'activate' => '/administrateurs/activate#create' patch 'activate' => '/administrateurs/activate#create'

View file

@ -149,8 +149,7 @@ describe Admin::GestionnairesController, type: :controller do
context 'Email notification' do context 'Email notification' do
it 'Notification email is sent when accompagnateur is create' do it 'Notification email is sent when accompagnateur is create' do
expect(GestionnaireMailer).to receive(:new_gestionnaire).and_return(GestionnaireMailer) expect_any_instance_of(Gestionnaire).to receive(:invite!)
expect(GestionnaireMailer).to receive(:deliver_now!)
subject subject
end end
end end