From d1263d7cf5a30b27a7f318618f414b2410371da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com> Date: Mon, 24 Jan 2022 17:53:52 +0100 Subject: [PATCH] doc + models + app:fix --- app/models/university/person/involvement.rb | 8 ++++ app/models/university/role.rb | 8 ++++ docs/university/role.md | 41 +++++++++++++++++++ lib/tasks/app.rake | 44 +++++++++++++++++++++ 4 files changed, 101 insertions(+) diff --git a/app/models/university/person/involvement.rb b/app/models/university/person/involvement.rb index ca3eab7e0..83c1b444a 100644 --- a/app/models/university/person/involvement.rb +++ b/app/models/university/person/involvement.rb @@ -25,9 +25,17 @@ # fk_rails_... (university_id => universities.id) # class University::Person::Involvement < ApplicationRecord + include WithPosition + belongs_to :university belongs_to :person belongs_to :target, polymorphic: true enum kind: { administrator: 10, researcher: 20, teacher: 30 } + + protected + + def last_ordered_element + self.class.unscoped.where(university_id: university_id, target: target).ordered.last + end end diff --git a/app/models/university/role.rb b/app/models/university/role.rb index 5c263ac58..d63eb7041 100644 --- a/app/models/university/role.rb +++ b/app/models/university/role.rb @@ -21,6 +21,14 @@ # fk_rails_... (university_id => universities.id) # class University::Role < ApplicationRecord + include WithPosition + belongs_to :university belongs_to :target, polymorphic: true, optional: true + + protected + + def last_ordered_element + self.class.unscoped.where(university_id: university_id, target: target).ordered.last + end end diff --git a/docs/university/role.md b/docs/university/role.md index f58d40d83..4c6d8d6f5 100644 --- a/docs/university/role.md +++ b/docs/university/role.md @@ -17,3 +17,44 @@ Ce modèle permet de lier une personne à une cible polymorphique. On définit a Ce modèle sert pour les liens non intrinsèques. On crée un rôle au niveau d'une cible polymorphique, description et position, et possiblement un rôle parent pour définir la hiérarchie au sein d'un organigramme. Ensuite, on connecte une personne à ce rôle en utilisant le modèle Involvement avec pour target, le rôle en question. + +### Exemples + +Soient : +- `mmi_program` : l'objet `Education::Program` représentant le BUT MMI +- `teacher` : l'objet `University::Person` représentant un enseignant +- `director` : l'objet `University::Person` représentant la cheffe de département +- `program_manager` : l'objet `University::Person` représentant le directeur des études +- `secretary` : l'objet `University::Person` représentant le secrétaire + +Pour l'enseignant on crée un objet `University::Person::Involvement`: +- target: `mmi_program` +- person: `teacher` +- kind: teacher + +Pour la cheffe de département on crée : +- Un objet `University::Role`, qu'on nomme `director_role` + - target: `mmi_program` + - description: "Cheffe de département" +- Un objet `University::Person::Involvement` + - target: `director_role` + - person: `director` + - kind: administrator + +Pour le directeur des études on crée : +- Un objet `University::Role`, qu'on nomme `program_manager_role` + - target: `mmi_program` + - description: "Directeur des études" +- Un objet `University::Person::Involvement` + - target: `program_manager_role` + - person: `program_manager` + - kind: administrator + +Pour le secrétaire on crée : +- Un objet `University::Role`, qu'on nomme `secretary_role` + - target: `mmi_program` + - description: "Secrétaire" +- Un objet `University::Person::Involvement` + - target: `secretary_role` + - person: `secretary` + - kind: administrator diff --git a/lib/tasks/app.rake b/lib/tasks/app.rake index 7882b1afa..0e862f5d6 100644 --- a/lib/tasks/app.rake +++ b/lib/tasks/app.rake @@ -40,6 +40,50 @@ namespace :app do imported_post.post&.update_column :published_at, imported_post.published_at end end + + Education::Program::Teacher.find_each { |teacher| + involvement = University::Person::Involvement.where( + kind: 'teacher', + target: teacher.program, + person_id: teacher.person_id, + university_id: teacher.person.university_id + ).first_or_create + involvement.update_column(:description, teacher.description) + } + + Education::Program::Role.find_each { |program_role| + university_role = University::Role.where( + description: program_role.description, + target: program_role.program, + position: program_role.position, + university_id: program_role.university_id + ).first_or_create + + program_role.people.find_each { |role_person| + University::Person::Involvement.where( + kind: 'administrator', + target: university_role, + person_id: role_person.person_id, + position: role_person.position, + university_id: program_role.university_id + ).first_or_create + } + } + + Education::School::Administrator.find_each { |administrator| + university_role = University::Role.where( + description: administrator.description, + target: administrator.school, + university_id: administrator.person.university_id + ).first_or_create + + University::Person::Involvement.where( + kind: 'administrator', + target: university_role, + person_id: administrator.person_id, + university_id: administrator.person.university_id + ).first_or_create + } end namespace :db do -- GitLab