commit
3100b065db
7 changed files with 52 additions and 32 deletions
|
@ -4,8 +4,8 @@
|
||||||
#
|
#
|
||||||
# created_at :datetime
|
# created_at :datetime
|
||||||
# updated_at :datetime
|
# updated_at :datetime
|
||||||
# administrateur_id :integer
|
# administrateur_id :integer not null
|
||||||
# instructeur_id :integer
|
# instructeur_id :integer not null
|
||||||
#
|
#
|
||||||
class AdministrateursInstructeur < ApplicationRecord
|
class AdministrateursInstructeur < ApplicationRecord
|
||||||
belongs_to :administrateur
|
belongs_to :administrateur
|
||||||
|
|
|
@ -148,7 +148,7 @@ Devise.setup do |config|
|
||||||
# Email regex used to validate email formats. It simply asserts that
|
# Email regex used to validate email formats. It simply asserts that
|
||||||
# one (and only one) @ exists in the given string. This is mainly
|
# one (and only one) @ exists in the given string. This is mainly
|
||||||
# to give user feedback and not to assert the e-mail validity.
|
# to give user feedback and not to assert the e-mail validity.
|
||||||
# config.email_regexp = /\A[^@]+@[^@]+\z/
|
config.email_regexp = URI::MailTo::EMAIL_REGEXP
|
||||||
|
|
||||||
# ==> Configuration for :timeoutable
|
# ==> Configuration for :timeoutable
|
||||||
# The time you want to timeout the user session without activity. After this
|
# The time you want to timeout the user session without activity. After this
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
class AddNotNullConstraintsToAdministrateursInstructeur < ActiveRecord::Migration[6.1]
|
||||||
|
def change
|
||||||
|
# We ignore strong_migrations safety warnings, because those tables are relatively small, and the null check
|
||||||
|
# will be very fast.
|
||||||
|
safety_assured do
|
||||||
|
change_column_null :administrateurs_instructeurs, :administrateur_id, false
|
||||||
|
change_column_null :administrateurs_instructeurs, :instructeur_id, false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -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: 2022_03_15_113510) do
|
ActiveRecord::Schema.define(version: 2022_03_22_110900) 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"
|
||||||
|
@ -64,9 +64,9 @@ ActiveRecord::Schema.define(version: 2022_03_15_113510) do
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "administrateurs_instructeurs", id: false, force: :cascade do |t|
|
create_table "administrateurs_instructeurs", id: false, force: :cascade do |t|
|
||||||
t.integer "administrateur_id"
|
t.integer "administrateur_id", null: false
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.integer "instructeur_id"
|
t.integer "instructeur_id", null: false
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.index ["administrateur_id"], name: "index_administrateurs_instructeurs_on_administrateur_id"
|
t.index ["administrateur_id"], name: "index_administrateurs_instructeurs_on_administrateur_id"
|
||||||
t.index ["instructeur_id", "administrateur_id"], name: "unique_couple_administrateur_instructeur", unique: true
|
t.index ["instructeur_id", "administrateur_id"], name: "unique_couple_administrateur_instructeur", unique: true
|
||||||
|
|
|
@ -5,21 +5,26 @@ namespace :after_party do
|
||||||
|
|
||||||
Procedure.with_discarded.where(aasm_state: :brouillon).where.not(published_revision_id: nil).update_all(published_revision_id: nil)
|
Procedure.with_discarded.where(aasm_state: :brouillon).where.not(published_revision_id: nil).update_all(published_revision_id: nil)
|
||||||
|
|
||||||
types_de_champ = TypeDeChamp.joins(:revision).where('types_de_champ.procedure_id != procedure_revisions.procedure_id')
|
begin
|
||||||
progress = ProgressReport.new(types_de_champ.count)
|
types_de_champ = TypeDeChamp.joins(:revision).where('types_de_champ.procedure_id != procedure_revisions.procedure_id')
|
||||||
|
progress = ProgressReport.new(types_de_champ.count)
|
||||||
|
|
||||||
types_de_champ.find_each do |type_de_champ|
|
types_de_champ.find_each do |type_de_champ|
|
||||||
procedure = type_de_champ.procedure ? type_de_champ.procedure : Procedure.with_discarded.find(type_de_champ.procedure_id)
|
procedure = type_de_champ.procedure ? type_de_champ.procedure : Procedure.with_discarded.find(type_de_champ.procedure_id)
|
||||||
revision_id = procedure.published_revision_id || procedure.draft_revision_id
|
revision_id = procedure.published_revision_id || procedure.draft_revision_id
|
||||||
type_de_champ.update_column(:revision_id, revision_id)
|
type_de_champ.update_column(:revision_id, revision_id)
|
||||||
progress.inc
|
progress.inc
|
||||||
|
end
|
||||||
|
|
||||||
|
progress.finish
|
||||||
|
rescue ActiveRecord::StatementInvalid, PG::UndefinedColumn => e
|
||||||
|
warn e.message
|
||||||
|
puts "Skip deploy task."
|
||||||
|
ensure
|
||||||
|
# Update task as completed. If you remove the line below, the task will
|
||||||
|
# run with every deploy (or every time you call after_party:run).
|
||||||
|
AfterParty::TaskRecord
|
||||||
|
.create version: AfterParty::TaskRecorder.new(__FILE__).timestamp
|
||||||
end
|
end
|
||||||
|
|
||||||
progress.finish
|
|
||||||
|
|
||||||
# Update task as completed. If you remove the line below, the task will
|
|
||||||
# run with every deploy (or every time you call after_party:run).
|
|
||||||
AfterParty::TaskRecord
|
|
||||||
.create version: AfterParty::TaskRecorder.new(__FILE__).timestamp
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -34,17 +34,17 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
|
||||||
|
|
||||||
context 'when the routage is not activated on the procedure' do
|
context 'when the routage is not activated on the procedure' do
|
||||||
let(:procedure) { create :procedure, administrateur: admin, instructeurs: [instructeur_assigned_1, instructeur_assigned_2] }
|
let(:procedure) { create :procedure, administrateur: admin, instructeurs: [instructeur_assigned_1, instructeur_assigned_2] }
|
||||||
let!(:instructeur_assigned_1) { create :instructeur, email: 'instructeur_1@ministere_a.gouv.fr', administrateurs: [admin] }
|
let!(:instructeur_assigned_1) { create :instructeur, email: 'instructeur_1@ministere-a.gouv.fr', administrateurs: [admin] }
|
||||||
let!(:instructeur_assigned_2) { create :instructeur, email: 'instructeur_2@ministere_b.gouv.fr', administrateurs: [admin] }
|
let!(:instructeur_assigned_2) { create :instructeur, email: 'instructeur_2@ministere-b.gouv.fr', administrateurs: [admin] }
|
||||||
let!(:instructeur_not_assigned_1) { create :instructeur, email: 'instructeur_3@ministere_a.gouv.fr', administrateurs: [admin] }
|
let!(:instructeur_not_assigned_1) { create :instructeur, email: 'instructeur_3@ministere-a.gouv.fr', administrateurs: [admin] }
|
||||||
let!(:instructeur_not_assigned_2) { create :instructeur, email: 'instructeur_4@ministere_b.gouv.fr', administrateurs: [admin] }
|
let!(:instructeur_not_assigned_2) { create :instructeur, email: 'instructeur_4@ministere-b.gouv.fr', administrateurs: [admin] }
|
||||||
subject! { get :show, params: { procedure_id: procedure.id, id: gi_1_1.id } }
|
subject! { get :show, params: { procedure_id: procedure.id, id: gi_1_1.id } }
|
||||||
|
|
||||||
it { expect(response.status).to eq(200) }
|
it { expect(response.status).to eq(200) }
|
||||||
|
|
||||||
it 'sets the assigned and not assigned instructeurs' do
|
it 'sets the assigned and not assigned instructeurs' do
|
||||||
expect(assigns(:instructeurs)).to match_array([instructeur_assigned_1, instructeur_assigned_2])
|
expect(assigns(:instructeurs)).to match_array([instructeur_assigned_1, instructeur_assigned_2])
|
||||||
expect(assigns(:available_instructeur_emails)).to match_array(['instructeur_3@ministere_a.gouv.fr', 'instructeur_4@ministere_b.gouv.fr'])
|
expect(assigns(:available_instructeur_emails)).to match_array(['instructeur_3@ministere-a.gouv.fr', 'instructeur_4@ministere-b.gouv.fr'])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -324,9 +324,9 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
|
||||||
|
|
||||||
describe '#remove_instructeur_procedure_non_routee' do
|
describe '#remove_instructeur_procedure_non_routee' do
|
||||||
let(:procedure) { create :procedure, administrateur: admin, instructeurs: [instructeur_assigned_1, instructeur_assigned_2] }
|
let(:procedure) { create :procedure, administrateur: admin, instructeurs: [instructeur_assigned_1, instructeur_assigned_2] }
|
||||||
let!(:instructeur_assigned_1) { create :instructeur, email: 'instructeur_1@ministere_a.gouv.fr', administrateurs: [admin] }
|
let!(:instructeur_assigned_1) { create :instructeur, email: 'instructeur_1@ministere-a.gouv.fr', administrateurs: [admin] }
|
||||||
let!(:instructeur_assigned_2) { create :instructeur, email: 'instructeur_2@ministere_b.gouv.fr', administrateurs: [admin] }
|
let!(:instructeur_assigned_2) { create :instructeur, email: 'instructeur_2@ministere-b.gouv.fr', administrateurs: [admin] }
|
||||||
let!(:instructeur_assigned_3) { create :instructeur, email: 'instructeur_3@ministere_a.gouv.fr', administrateurs: [admin] }
|
let!(:instructeur_assigned_3) { create :instructeur, email: 'instructeur_3@ministere-a.gouv.fr', administrateurs: [admin] }
|
||||||
subject! { get :show, params: { procedure_id: procedure.id, id: gi_1_1.id } }
|
subject! { get :show, params: { procedure_id: procedure.id, id: gi_1_1.id } }
|
||||||
it 'sets the assigned instructeurs' do
|
it 'sets the assigned instructeurs' do
|
||||||
expect(assigns(:instructeurs)).to match_array([instructeur_assigned_1, instructeur_assigned_2])
|
expect(assigns(:instructeurs)).to match_array([instructeur_assigned_1, instructeur_assigned_2])
|
||||||
|
@ -418,8 +418,8 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
|
||||||
describe '#export_groupe_instructeurs' do
|
describe '#export_groupe_instructeurs' do
|
||||||
let(:procedure) { create(:procedure, :published) }
|
let(:procedure) { create(:procedure, :published) }
|
||||||
let(:gi_1_2) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 1 2') }
|
let(:gi_1_2) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 1 2') }
|
||||||
let(:instructeur_assigned_1) { create :instructeur, email: 'instructeur_1@ministere_a.gouv.fr', administrateurs: [admin] }
|
let(:instructeur_assigned_1) { create :instructeur, email: 'instructeur_1@ministere-a.gouv.fr', administrateurs: [admin] }
|
||||||
let(:instructeur_assigned_2) { create :instructeur, email: 'instructeur_2@ministere_b.gouv.fr', administrateurs: [admin] }
|
let(:instructeur_assigned_2) { create :instructeur, email: 'instructeur_2@ministere-b.gouv.fr', administrateurs: [admin] }
|
||||||
|
|
||||||
subject do
|
subject do
|
||||||
get :export_groupe_instructeurs, params: { procedure_id: procedure.id, format: :csv }
|
get :export_groupe_instructeurs, params: { procedure_id: procedure.id, format: :csv }
|
||||||
|
|
|
@ -234,9 +234,14 @@ describe Users::SessionsController, type: :controller do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the email is evil' do
|
context 'when the email is evil' do
|
||||||
let(:link_email) { 'Hello, I am an evil email' }
|
[
|
||||||
|
'Hello, I am an evil email',
|
||||||
|
'a@a%C2%A0evil%C2%A0text%C2%A0with%C2%A0spaces'
|
||||||
|
].each do |evil_attempt|
|
||||||
|
let(:link_email) { evil_attempt }
|
||||||
|
|
||||||
it { expect(response).to redirect_to(root_path) }
|
it { expect(response).to redirect_to(root_path) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue