diff --git a/app/models/university/person/involvement.rb b/app/models/university/person/involvement.rb index ca3eab7e03ccf593ae57d5e1bdbf225014828fe0..83c1b444a5dc914519773f8f35a3c593cf96ea18 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 5c263ac580a529f4588d66dba8cbb79abec8d946..d63eb7041925492af796c72c6b8585b4f7140ce6 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 f58d40d832546f8721b09277cef6e8ad8d30074d..4c6d8d6f55404c228906938887e82b78e06867a8 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 7882b1afab2410acebdea1bb686e865848ba5751..0e862f5d679e6e5f6ed78b930a645e03915d1316 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