diff --git a/app/controllers/academic/users_controller.rb b/app/controllers/academic/users_controller.rb new file mode 100644 index 000000000..7c94598f3 --- /dev/null +++ b/app/controllers/academic/users_controller.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Academic + class UsersController < ApplicationController + before_action :infer_page_title + + def select_academy + @academic_user = current_user + end + end +end diff --git a/app/controllers/concerns/developer_oidc.rb b/app/controllers/concerns/developer_oidc.rb index e6665f5ed..573adebcd 100644 --- a/app/controllers/concerns/developer_oidc.rb +++ b/app/controllers/concerns/developer_oidc.rb @@ -51,9 +51,12 @@ def provider_info(attrs) end def extra_info(attrs) - uai = attrs["info"]["uai"] - - info = role(attrs) == :dir ? responsibility_hash(attrs, uai) : authorised_hash(attrs, uai) + if attrs["info"]["uai"].nil? + info = { AplyproAcademieResp: attrs["info"]["academy_code"] } + else + uai = attrs["info"]["uai"] + info = role(attrs) == :dir ? responsibility_hash(attrs, uai) : authorised_hash(attrs, uai) + end { extra: { diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index 3e0b0f676..f2fa0e71c 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -47,7 +47,7 @@ def oidc choose_redirect_page! end - def academic + def academic # rubocop:disable Metrics/AbcSize parse_identity @academic_login = true @@ -55,11 +55,19 @@ def academic add_auth_breadcrumb(data: { user_id: @academic_user.id }, message: "Successfully parsed academic user") - raise IdentityMappers::Errors::NoLimitedAccessError if @mapper.attributes["AplyproAcademieResp"].nil? + @academies = @mapper.aplypro_academies + + raise IdentityMappers::Errors::NoLimitedAccessError if @academies.empty? sign_in(:academic_user, @academic_user) - redirect_to academic_home_path + if @academies.many? + redirect_to academic_user_select_path(@academic_user) + else + @academic_user.update!(selected_academy: @academies.first) + + redirect_to academic_home_path, notice: t("auth.success") + end end def asp diff --git a/app/models/academic/user.rb b/app/models/academic/user.rb index 781e033b6..8f165a639 100644 --- a/app/models/academic/user.rb +++ b/app/models/academic/user.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module Academic - class User < ApplicationRecord + class User < User devise :authenticatable validates :uid, :provider, :name, :email, presence: true @@ -21,6 +21,10 @@ def from_oidc(attrs) end end + def academies + establishments.distinct.pluck(:academy_code) + end + def to_s name end diff --git a/app/models/concerns/identity_mappers/fim.rb b/app/models/concerns/identity_mappers/fim.rb index 96412be27..ce3cd0f60 100644 --- a/app/models/concerns/identity_mappers/fim.rb +++ b/app/models/concerns/identity_mappers/fim.rb @@ -17,5 +17,9 @@ def responsibility_uais def aplypro_responsibilities Array(attributes["AplyproResp"]).compact end + + def aplypro_academies + Array(attributes["AplyproAcademieResp"]).compact + end end end diff --git a/app/views/academic/users/select_academy.html.haml b/app/views/academic/users/select_academy.html.haml new file mode 100644 index 000000000..74de0fb9e --- /dev/null +++ b/app/views/academic/users/select_academy.html.haml @@ -0,0 +1,12 @@ +.fr-grid-row + .fr-col-md-7 + %p + Veuillez sélectionner l'académie que vous désirez piloter dans la liste ci-dessous. + + .fr-select-group.fr-col-md-7 + = form_with url: academic_user_select_academy_path, builder: DsfrFormBuilder do |form| + .fr-input-group + = form.label :selected_academy, "Académie", class: 'fr-label' + = form.select :selected_academy, @academic_user.academies, {}, { class: 'fr-select' } + + = form.submit "Continuez avec cette académie", class: 'fr-btn' diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index fc3d5b690..a368a1d33 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -21,7 +21,7 @@ provider :developer, name: :academic_developer, path_prefix: "/auth", - fields: %i[uai email] + fields: %i[academy_code email] end provider :openid_connect, { diff --git a/config/locales/fr.yml b/config/locales/fr.yml index c3bfeb9a1..f3484453d 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -168,6 +168,8 @@ fr: application: login: Connexion à APLyPro home : Accueil + users: + select_academy: Choix de l'académie stats: index: Statistiques school_years: diff --git a/config/routes.rb b/config/routes.rb index c7af5bac1..629ecc099 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -23,6 +23,10 @@ namespace :academic do get "home", to: "application#home" + resources :users, only: [] do + get "select_academy" + end + devise_for :users, skip: :all, class_name: "Academic::User" end diff --git a/db/migrate/20250214124041_add_selected_academy_to_users.rb b/db/migrate/20250214124041_add_selected_academy_to_users.rb new file mode 100644 index 000000000..65659525a --- /dev/null +++ b/db/migrate/20250214124041_add_selected_academy_to_users.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddSelectedAcademyToUsers < ActiveRecord::Migration[8.0] + def change + add_column :users, :selected_academy, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 1acede148..38f61d224 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_01_27_092313) do +ActiveRecord::Schema[8.0].define(version: 2025_02_14_124041) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" enable_extension "unaccent" @@ -292,6 +292,7 @@ t.bigint "selected_establishment_id" t.boolean "welcomed", default: false, null: false t.jsonb "oidc_attributes" + t.string "selected_academy" t.index ["email", "provider"], name: "index_users_on_email_and_provider", unique: true t.index ["selected_establishment_id"], name: "index_users_on_selected_establishment_id" t.index ["uid", "provider"], name: "index_users_on_uid_and_provider", unique: true