fix(dossier): an invited user can remove (leave) a dossier
This commit is contained in:
parent
cd74ea46cc
commit
0864666d0a
8 changed files with 35 additions and 16 deletions
|
@ -6,7 +6,7 @@ module Users
|
||||||
layout 'procedure_context', only: [:identite, :update_identite, :siret, :update_siret]
|
layout 'procedure_context', only: [:identite, :update_identite, :siret, :update_siret]
|
||||||
|
|
||||||
ACTIONS_ALLOWED_TO_ANY_USER = [:index, :recherche, :new, :transferer_all]
|
ACTIONS_ALLOWED_TO_ANY_USER = [:index, :recherche, :new, :transferer_all]
|
||||||
ACTIONS_ALLOWED_TO_OWNER_OR_INVITE = [:show, :demande, :messagerie, :brouillon, :update_brouillon, :submit_brouillon, :modifier, :update, :create_commentaire, :papertrail, :restore]
|
ACTIONS_ALLOWED_TO_OWNER_OR_INVITE = [:show, :destroy, :demande, :messagerie, :brouillon, :update_brouillon, :submit_brouillon, :modifier, :update, :create_commentaire, :papertrail, :restore]
|
||||||
|
|
||||||
before_action :ensure_ownership!, except: ACTIONS_ALLOWED_TO_ANY_USER + ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
before_action :ensure_ownership!, except: ACTIONS_ALLOWED_TO_ANY_USER + ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
||||||
before_action :ensure_ownership_or_invitation!, only: ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
before_action :ensure_ownership_or_invitation!, only: ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
||||||
|
@ -244,9 +244,13 @@ module Users
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_dossier
|
def destroy
|
||||||
if dossier.can_be_deleted_by_user?
|
if dossier.can_be_deleted_by_user?
|
||||||
dossier.hide_and_keep_track!(current_user, :user_request)
|
if current_user.owns?(dossier)
|
||||||
|
dossier.hide_and_keep_track!(current_user, :user_request)
|
||||||
|
elsif current_user.invite?(dossier)
|
||||||
|
current_user.invites.where(dossier:).destroy_all
|
||||||
|
end
|
||||||
flash.notice = t('users.dossiers.ask_deletion.soft_deleted_dossier')
|
flash.notice = t('users.dossiers.ask_deletion.soft_deleted_dossier')
|
||||||
redirect_to dossiers_path
|
redirect_to dossiers_path
|
||||||
else
|
else
|
||||||
|
|
|
@ -94,12 +94,12 @@ class User < ApplicationRecord
|
||||||
dossier.user_id == id
|
dossier.user_id == id
|
||||||
end
|
end
|
||||||
|
|
||||||
def invite?(dossier_id)
|
def invite?(dossier)
|
||||||
invites.pluck(:dossier_id).include?(dossier_id.to_i)
|
invites.pluck(:dossier_id).include?(dossier.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def owns_or_invite?(dossier)
|
def owns_or_invite?(dossier)
|
||||||
owns?(dossier) || invite?(dossier.id)
|
owns?(dossier) || invite?(dossier)
|
||||||
end
|
end
|
||||||
|
|
||||||
def invite!
|
def invite!
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
|
|
||||||
- if has_delete_action
|
- if has_delete_action
|
||||||
- menu.with_item(class: 'danger') do
|
- menu.with_item(class: 'danger') do
|
||||||
= link_to(delete_dossier_dossier_path(dossier), role: 'menuitem', method: :patch, data: { disable: true, confirm: "En continuant, vous allez supprimer ce dossier ainsi que les informations qu’il contient. Toute suppression entraîne l’annulation de la démarche en cours.\n\nConfirmer la suppression ?" }) do
|
= link_to(dossier_path(dossier), role: 'menuitem', method: :delete, data: { disable: true, confirm: "En continuant, vous allez supprimer ce dossier ainsi que les informations qu’il contient. Toute suppression entraîne l’annulation de la démarche en cours.\n\nConfirmer la suppression ?" }) do
|
||||||
|
|
||||||
%span.icon.delete
|
%span.icon.delete
|
||||||
.dropdown-description
|
.dropdown-description
|
||||||
|
|
|
@ -306,7 +306,7 @@ Rails.application.routes.draw do
|
||||||
get '/:path/france_connect', action: 'france_connect', as: :france_connect
|
get '/:path/france_connect', action: 'france_connect', as: :france_connect
|
||||||
end
|
end
|
||||||
|
|
||||||
resources :dossiers, only: [:index, :show, :new] do
|
resources :dossiers, only: [:index, :show, :destroy, :new] do
|
||||||
member do
|
member do
|
||||||
get 'identite'
|
get 'identite'
|
||||||
patch 'update_identite'
|
patch 'update_identite'
|
||||||
|
@ -323,7 +323,6 @@ Rails.application.routes.draw do
|
||||||
get 'demande'
|
get 'demande'
|
||||||
get 'messagerie'
|
get 'messagerie'
|
||||||
post 'commentaire' => 'dossiers#create_commentaire'
|
post 'commentaire' => 'dossiers#create_commentaire'
|
||||||
patch 'delete_dossier'
|
|
||||||
patch 'restore', to: 'dossiers#restore'
|
patch 'restore', to: 'dossiers#restore'
|
||||||
get 'attestation'
|
get 'attestation'
|
||||||
get 'transferer', to: 'dossiers#transferer'
|
get 'transferer', to: 'dossiers#transferer'
|
||||||
|
|
|
@ -958,10 +958,10 @@ describe Users::DossiersController, type: :controller do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#delete_dossier' do
|
describe '#destroy' do
|
||||||
before { sign_in(user) }
|
before { sign_in(user) }
|
||||||
|
|
||||||
subject { patch :delete_dossier, params: { id: dossier.id } }
|
subject { delete :destroy, params: { id: dossier.id } }
|
||||||
|
|
||||||
shared_examples_for "the dossier can not be deleted" do
|
shared_examples_for "the dossier can not be deleted" do
|
||||||
it "doesn’t notify the deletion" do
|
it "doesn’t notify the deletion" do
|
||||||
|
@ -1015,6 +1015,22 @@ describe Users::DossiersController, type: :controller do
|
||||||
|
|
||||||
it_behaves_like "the dossier can not be deleted"
|
it_behaves_like "the dossier can not be deleted"
|
||||||
it { is_expected.to redirect_to(root_path) }
|
it { is_expected.to redirect_to(root_path) }
|
||||||
|
|
||||||
|
context 'but user is invited' do
|
||||||
|
before { dossier.invites.create(user:, email: user.email, message: 'Salut', email_sender: user2.email) }
|
||||||
|
|
||||||
|
it do
|
||||||
|
procedure = dossier.procedure
|
||||||
|
dossier_id = dossier.id
|
||||||
|
|
||||||
|
expect(user.invite?(dossier)).to be_truthy
|
||||||
|
is_expected.to redirect_to(dossiers_path)
|
||||||
|
expect(Dossier.find_by(id: dossier_id)).to be_present
|
||||||
|
expect(Dossier.find_by(id: dossier_id).hidden_by_user_at).to be_nil
|
||||||
|
expect(procedure.deleted_dossiers.count).to eq(0)
|
||||||
|
expect(user.invite?(dossier)).to be_falsy
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ describe User, type: :model do
|
||||||
let(:dossier) { create :dossier }
|
let(:dossier) { create :dossier }
|
||||||
let(:user) { dossier.user }
|
let(:user) { dossier.user }
|
||||||
|
|
||||||
subject { user.invite? dossier.id }
|
subject { user.invite? dossier }
|
||||||
|
|
||||||
context 'when user is invite at the dossier' do
|
context 'when user is invite at the dossier' do
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -62,9 +62,9 @@ describe 'user access to the list of their dossiers', js: true do
|
||||||
|
|
||||||
describe 'deletion' do
|
describe 'deletion' do
|
||||||
it 'should have links to delete dossiers' do
|
it 'should have links to delete dossiers' do
|
||||||
expect(page).to have_link(nil, href: delete_dossier_dossier_path(dossier_brouillon))
|
expect(page).to have_link('Supprimer le dossier', href: dossier_path(dossier_brouillon))
|
||||||
expect(page).to have_link(nil, href: delete_dossier_dossier_path(dossier_en_construction))
|
expect(page).to have_link('Supprimer le dossier', href: dossier_path(dossier_en_construction))
|
||||||
expect(page).not_to have_link(nil, href: delete_dossier_dossier_path(dossier_en_instruction))
|
expect(page).not_to have_link('Supprimer le dossier', href: dossier_path(dossier_en_instruction))
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when user clicks on delete button', js: true do
|
context 'when user clicks on delete button', js: true do
|
||||||
|
|
|
@ -6,7 +6,7 @@ describe 'users/dossiers/dossier_actions.html.haml', type: :view do
|
||||||
subject { render 'users/dossiers/dossier_actions.html.haml', dossier: dossier, current_user: user }
|
subject { render 'users/dossiers/dossier_actions.html.haml', dossier: dossier, current_user: user }
|
||||||
|
|
||||||
it { is_expected.to have_link('Commencer un autre dossier', href: commencer_url(path: procedure.path)) }
|
it { is_expected.to have_link('Commencer un autre dossier', href: commencer_url(path: procedure.path)) }
|
||||||
it { is_expected.to have_link('Supprimer le dossier', href: delete_dossier_dossier_path(dossier)) }
|
it { is_expected.to have_link('Supprimer le dossier', href: dossier_path(dossier)) }
|
||||||
it { is_expected.to have_link('Transférer le dossier', href: transferer_dossier_path(dossier)) }
|
it { is_expected.to have_link('Transférer le dossier', href: transferer_dossier_path(dossier)) }
|
||||||
|
|
||||||
context 'when the dossier is termine' do
|
context 'when the dossier is termine' do
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue