feat(GroupeInstructeurs.closed): add closed option to GroupeInstructeur in order to prevent usagers to submit dossier

This commit is contained in:
Martin 2022-06-20 16:14:27 +02:00
parent 511c646b46
commit ab4d4c83a8
9 changed files with 54 additions and 20 deletions

View file

@ -32,16 +32,16 @@ module Administrateurs
def create
@groupe_instructeur = procedure
.groupe_instructeurs
.new(label: label, instructeurs: [current_administrateur.instructeur])
.new({ instructeurs: [current_administrateur.instructeur] }.merge(groupe_instructeur_params))
if @groupe_instructeur.save
redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
notice: "Le groupe dinstructeurs « #{label} » a été créé."
notice: "Le groupe dinstructeurs « #{@groupe_instructeur.label} » a été créé."
else
@procedure = procedure
@groupes_instructeurs = paginated_groupe_instructeurs
flash[:alert] = "le nom « #{label} » est déjà pris par un autre groupe."
flash[:alert] = "le nom « #{@groupe_instructeur.label} » est déjà pris par un autre groupe."
render :index
end
end
@ -49,28 +49,29 @@ module Administrateurs
def update
@groupe_instructeur = groupe_instructeur
if @groupe_instructeur.update(label: label)
if @groupe_instructeur.update(groupe_instructeur_params)
redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur),
notice: "Le nom est à présent « #{label} »."
notice: "Le nom est à présent « #{@groupe_instructeur.label} »."
else
@procedure = procedure
@instructeurs = paginated_instructeurs
@available_instructeur_emails = available_instructeur_emails
flash[:alert] = "le nom « #{label} » est déjà pris par un autre groupe."
flash[:alert] = "le nom « #{@groupe_instructeur.label} » est déjà pris par un autre groupe."
render :show
end
end
def destroy
if !groupe_instructeur.dossiers.empty?
@groupe_instructeur = groupe_instructeur
if !@groupe_instructeur.dossiers.empty?
flash[:alert] = "Impossible de supprimer un groupe avec des dossiers. Il faut le réaffecter avant"
elsif procedure.groupe_instructeurs.one?
flash[:alert] = "Suppression impossible : il doit y avoir au moins un groupe instructeur sur chaque procédure"
else
label = groupe_instructeur.label
groupe_instructeur.destroy!
flash[:notice] = "le groupe « #{label} » a été supprimé."
@groupe_instructeur.destroy!
flash[:notice] = "le groupe « #{@groupe_instructeur.label} » a été supprimé."
end
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
end
@ -198,7 +199,7 @@ module Administrateurs
redirect_to admin_procedure_groupe_instructeurs_path(procedure),
notice: "Le routage est #{procedure.routing_enabled? ? "activée" : "désactivée"}."
end
end
def update_instructeurs_self_management_enabled
procedure.update!(instructeurs_self_management_enabled_params)
@ -288,8 +289,8 @@ module Administrateurs
params[:instructeur][:id]
end
def label
params[:groupe_instructeur][:label]
def groupe_instructeur_params
params.require(:groupe_instructeur).permit(:label, :closed)
end
def paginated_groupe_instructeurs

View file

@ -3,6 +3,7 @@
# Table name: groupe_instructeurs
#
# id :bigint not null, primary key
# closed :boolean default(FALSE)
# label :text not null
# created_at :datetime not null
# updated_at :datetime not null

View file

@ -6,4 +6,11 @@
= f.label :label, 'Nom du groupe'
= f.text_field :label, placeholder: 'Ville de Bordeaux', required: true
= f.submit 'Renommer', class: 'button primary send'
.editable-champ.editable-champ-checkbox
= f.label :closed, 'Groupe inactif'
.notice
%p Si cette option est activé les usagers ne pourront plus séléctionné ce groupe d'instructeur
= f.check_box :closed
%br
= f.submit 'Valider', class: 'button primary send'

View file

@ -28,7 +28,7 @@
= dossier.procedure.routing_criteria_name
%span.mandatory *
= f.select :groupe_instructeur_id,
dossier.procedure.groupe_instructeurs.order(:label).map { |gi| [gi.label, gi.id] },
dossier.procedure.groupe_instructeurs.where(closed: false).order(:label).map { |gi| [gi.label, gi.id] },
{ include_blank: dossier.brouillon? }
- dossier.champs.each do |champ|

View file

@ -0,0 +1,5 @@
class AddColumnClosedToGroupeInstructeurs < ActiveRecord::Migration[6.1]
def change
add_column :groupe_instructeurs, :closed, :boolean, default: false
end
end

View file

@ -0,0 +1,7 @@
class AddIndexOnProcedureIdAndClosedToGroupeInstructeurs < ActiveRecord::Migration[6.1]
include Database::MigrationHelpers
disable_ddl_transaction!
def up
add_concurrent_index :groupe_instructeurs, [:closed, :procedure_id]
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2022_06_17_142759) do
ActiveRecord::Schema.define(version: 2022_06_20_141238) do
# These are extensions that must be enabled in order to support this database
enable_extension "pgcrypto"
@ -510,10 +510,12 @@ ActiveRecord::Schema.define(version: 2022_06_17_142759) do
end
create_table "groupe_instructeurs", force: :cascade do |t|
t.boolean "closed", default: false
t.datetime "created_at", null: false
t.text "label", null: false
t.bigint "procedure_id", null: false
t.datetime "updated_at", null: false
t.index ["closed", "procedure_id"], name: "index_groupe_instructeurs_on_closed_and_procedure_id"
t.index ["procedure_id", "label"], name: "index_groupe_instructeurs_on_procedure_id_and_label", unique: true
t.index ["procedure_id"], name: "index_groupe_instructeurs_on_procedure_id"
end

View file

@ -188,19 +188,21 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
params: {
procedure_id: procedure.id,
id: gi_1_1.id,
groupe_instructeur: { label: new_name }
groupe_instructeur: { label: new_name, closed: true }
}
gi_1_1.reload
end
it { expect(gi_1_1.reload.label).to eq(new_name) }
it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1)) }
it { expect(gi_1_1.label).to eq(new_name) }
it { expect(gi_1_1.closed).to eq(true) }
it { expect(flash.notice).to be_present }
context 'when the name is already taken' do
let!(:gi_1_2) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 2') }
let(:new_name) { gi_1_2.label }
it { expect(gi_1_1.reload.label).not_to eq(new_name) }
it { expect(gi_1_1.label).not_to eq(new_name) }
it { expect(flash.alert).to be_present }
end
end

View file

@ -25,7 +25,7 @@ describe 'The routing', js: true do
# rename defaut groupe to littéraire
click_on 'voir'
fill_in 'Nom du groupe', with: 'littéraire'
click_on 'Renommer'
click_on 'Valider'
expect(page).to have_text('Le nom est à présent « littéraire ».')
expect(page).to have_field('Nom du groupe', with: 'littéraire')
@ -43,6 +43,13 @@ describe 'The routing', js: true do
superwoman = User.find_by(email: 'superwoman@inst.com').instructeur
# add inactive groupe
click_on 'Groupes dinstructeurs'
fill_in 'Ajouter un groupe', with: 'non visible car inactif'
click_on 'Ajouter le groupe'
check "Groupe inactif"
click_on 'Valider'
# add scientifique groupe
click_on 'Groupes dinstructeurs'
fill_in 'Ajouter un groupe', with: 'scientifique'
@ -203,6 +210,8 @@ describe 'The routing', js: true do
visit dossiers_path
click_on user.dossiers.first.id.to_s
click_on "Modifier mon dossier"
expect(page).to have_selector("option", text: "scientifique")
expect(page).not_to have_selector("option", text: "Groupe inactif")
select(new_group, from: 'dossier_groupe_instructeur_id')
click_on "Enregistrer les modifications du dossier"