Commit 66a6f6b9 authored by Anthony Gautreau's avatar Anthony Gautreau
Browse files

Pegase : champs OCCAPI ELM (mode, activité, opportunité), length des...

Pegase : champs OCCAPI ELM (mode, activité, opportunité), length des programmes et syllabus (objectifs, prérequis, bibliographie, évaluation, enseignement, langue), PEGASE_ELM_TYPES_HEURE
parent 3727e9e3
Loading
Loading
Loading
Loading
+4 −0
Changes for .env.dist: 4 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -70,6 +70,10 @@ PEGASE_LANGUES=
# Dates des semestres, début et fin en mois-jour
PEGASE_SEMESTRE_1=09-01:01-31
PEGASE_SEMESTRE_2=01-15:06-30
# Type d'activité ELM des types d'heure propres à l'établissement (nomenclature TypeHeure), CM, TD et TP étant
# déjà connus : par exemple THE005:bf2e3a7bae (e-learning), THE013:bf5588ff84 (internship), THE008:a7e556215a
# (research). Codes ELM listés dans la section « Routes Pegase » du README (facultatif)
PEGASE_ELM_TYPES_HEURE=
# Limite mémoire PHP de l'import, qui croît avec le nombre de cours et de périodes : à augmenter si la mémoire
# affichée dans le bilan de l'import s'en approche (-1 pour aucune limite)
PEGASE_MEMOIRE=512M
+18 −4
Changes for README.md: 18 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -132,6 +132,10 @@ PEGASE_LANGUES=
# Dates des semestres, début et fin en mois-jour
PEGASE_SEMESTRE_1=09-01:01-31
PEGASE_SEMESTRE_2=01-15:06-30
# Type d'activité ELM des types d'heure propres à l'établissement (nomenclature TypeHeure), CM, TD et TP étant
# déjà connus : par exemple THE005:bf2e3a7bae (e-learning), THE013:bf5588ff84 (internship), THE008:a7e556215a
# (research). Codes ELM listés dans la section « Routes Pegase » du README (facultatif)
PEGASE_ELM_TYPES_HEURE=
# Limite mémoire PHP de l'import, qui croît avec le nombre de cours et de périodes : à augmenter si la mémoire
# affichée dans le bilan de l'import s'en approche (-1 pour aucune limite)
PEGASE_MEMOIRE=512M
@@ -295,17 +299,27 @@ Avec `PEGASE_ENABLED=true`, les données importées de Pegase sont servies dans
| `GET /courses`, `GET /courses/{code}` | cours ouverts à la mobilité, avec les valeurs de la période la plus récente |
| `GET /instances`, `GET /instances/{id}` | un cours sur une année universitaire et un semestre |

Les relations sont données en IRI (`"ounit": "/ounits/901"`). Une propriété sans valeur est omise de la réponse : c'est le cas de `ects` pour un cours sans crédits et d'`eqfLevelProvided` pour un diplôme hors cursus L, M, D, bien qu'ils soient obligatoires dans OCCAPI. Les libellés (`title`, `diplomaTitle`, `catalogueOunit`, `catalogueGroup`) sont multilingues, sous la forme `[{"string": "...", "lang": "fr"}]`, et `description` sous la forme `[{"multiline": "...", "lang": "fr"}]`.
Les relations sont données en IRI (`"ounit": "/ounits/901"`). Une propriété sans valeur est omise de la réponse : c'est le cas de `ects` pour un cours sans crédits et d'`eqfLevelProvided` pour un diplôme hors cursus L, M, D, bien qu'ils soient obligatoires dans OCCAPI. Les libellés (`title`, `diplomaTitle`, `catalogueOunit`, `catalogueGroup`) sont multilingues, sous la forme `[{"string": "...", "lang": "fr"}]`, et les textes du syllabus (`description`, `learningOutcomes`...) sous la forme `[{"multiline": "...", "lang": "fr"}]`.

| Ressource | Propriétés |
|---|---|
| ounit | `ounitId`, `ounitCode` (code de structure Pegase), `title`, `abbreviation`, `lastModified` |
| programme | `code`, `title`, `ects`, `eqfLevelProvided` (6, 7 ou 8), `languageOfInstruction`, `levelInDiploma` (niveau SISE), `diplomaCode` et `diplomaTitle` (formation), `ounit`, `lastModified` |
| course | `code`, `title`, `ects`, `languageOfInstruction`, `academicTerm` (`1/2`, `2/2`), `description`, `deprecated` (absent de la période la plus récente), `diplomaCode` et `diplomaTitle` (formation porteuse), `ounit`, `relatedProgramme`, `lastModified` |
| instance | `id` (`LAE112-2026-1`), `course`, `academicTermId` (`2026/2027-1/2`), `startDate`, `endDate`, `ects`, `languageOfInstruction`, `engagementHours`, `catalogueOunit` et `catalogueGroup` (composante et regroupement du catalogue), `lastModified` |
| programme | `code`, `title`, `ects`, `eqfLevelProvided` (6, 7 ou 8), `languageOfInstruction`, `description` et `learningOutcomes` (syllabus de l'année), `length` (`2/2`), `elmLearningOpportunityType`, `levelInDiploma` (niveau SISE), `diplomaCode` et `diplomaTitle` (formation), `ounit`, `lastModified` |
| course | `code`, `title`, `ects`, `languageOfInstruction`, `academicTerm` (`1/2`, `2/2`), `description`, `learningOutcomes`, `prerequisites`, `bibliography`, `assessmentMethod` et `teachingMethod` (syllabus), `elmModeOfLearning`, `elmLearningActivityType` et `elmLearningOpportunityType`, `deprecated` (absent de la période la plus récente), `diplomaCode` et `diplomaTitle` (formation porteuse), `ounit`, `relatedProgramme`, `lastModified` |
| instance | `id` (`LAE112-2026-1`), `course`, `academicTermId` (`2026/2027-1/2`), `startDate`, `endDate`, `ects`, `languageOfInstruction`, `elmModeOfLearning`, `elmLearningActivityType` et `elmLearningOpportunityType` (pour cette période), `engagementHours`, `catalogueOunit` et `catalogueGroup` (composante et regroupement du catalogue), `lastModified` |

`lastModified` est la date de l'import.

Les champs ELM sont des codes des [vocabulaires européens](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-activity/25831c2) :

- `elmModeOfLearning` : modalités des formats d'enseignement (`9191af2ed9` présentiel, `920fbb3cbe` à distance, `c_3a90b26d` hybride), à distance aussi pour un objet ouvert au télé-enseignement ;
- `elmLearningActivityType` : types d'heure des formats (CM et TD `ff436ea7c9`, TP `3c8bd58d62`, les autres par `PEGASE_ELM_TYPES_HEURE`), `bf5588ff84` pour un stage ;
- `elmLearningOpportunityType` : `05053c1cbe` (cours) ou `77b99de990` (stage), `79343569f3` pour un programme.

Codes acceptés dans `PEGASE_ELM_TYPES_HEURE` : `d46a826a39` apprentissage, `ff436ea7c9` cours en classe, `bf2e3a7bae` e-learning, `fd33e234ae` programme de formation, `bf5588ff84` stage, `4357e0e681` expérience professionnelle, `3c8bd58d62` TP, simulation, `c_5665a0ad` tutorat, `a7e556215a` recherche, `b660f5dcea` travail personnel, `59eaf34fab` bénévolat, `efff75e10a` atelier, séminaire ou conférence.

La langue d'enseignement du syllabus est retenue quand elle est écrite en balises BCP 47 à code de langue sur deux lettres (`en`, `fr, en-GB`), sinon la langue vient de `PEGASE_LANGUES` (cours) ou vaut `fr` (programme).

### Créer et supprimer des utilisateurs

Vous pouvez ajouter ou supprimer des utilisateurs avec les commandes `bin/console app:create-user` et `bin/console app:remove-user`.
+1 −0
Changes for api/config/services.yaml: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ parameters:
    env(PEGASE_LANGUES): ''
    env(PEGASE_SEMESTRE_1): '09-01:01-31'
    env(PEGASE_SEMESTRE_2): '01-15:06-30'
    env(PEGASE_ELM_TYPES_HEURE): ''
    env(PEGASE_MEMOIRE): '512M'

services:
+54 −0
Changes for api/migrations/Version20261008180957.php: 54 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

final class Version20261008180957 extends AbstractMigration
{
    public function getDescription(): string
    {
        return 'Pegase : syllabus, ELM et durée des programmes (OCCAPI)';
    }

    public function up(Schema $schema): void
    {
        $this->addSql('ALTER TABLE course ADD learning_outcomes JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course ADD prerequisites JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course ADD bibliography JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course ADD assessment_method JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course ADD teaching_method JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course ADD elm_mode_of_learning JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course ADD elm_learning_activity_type JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course ADD elm_learning_opportunity_type JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course_instance ADD elm_mode_of_learning JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course_instance ADD elm_learning_activity_type JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE course_instance ADD elm_learning_opportunity_type JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE programme ADD description JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE programme ADD learning_outcomes JSON DEFAULT NULL');
        $this->addSql('ALTER TABLE programme ADD length VARCHAR(255) DEFAULT NULL');
        $this->addSql('ALTER TABLE programme ADD elm_learning_opportunity_type JSON DEFAULT NULL');
    }

    public function down(Schema $schema): void
    {
        $this->addSql('ALTER TABLE course DROP learning_outcomes');
        $this->addSql('ALTER TABLE course DROP prerequisites');
        $this->addSql('ALTER TABLE course DROP bibliography');
        $this->addSql('ALTER TABLE course DROP assessment_method');
        $this->addSql('ALTER TABLE course DROP teaching_method');
        $this->addSql('ALTER TABLE course DROP elm_mode_of_learning');
        $this->addSql('ALTER TABLE course DROP elm_learning_activity_type');
        $this->addSql('ALTER TABLE course DROP elm_learning_opportunity_type');
        $this->addSql('ALTER TABLE course_instance DROP elm_mode_of_learning');
        $this->addSql('ALTER TABLE course_instance DROP elm_learning_activity_type');
        $this->addSql('ALTER TABLE course_instance DROP elm_learning_opportunity_type');
        $this->addSql('ALTER TABLE programme DROP description');
        $this->addSql('ALTER TABLE programme DROP learning_outcomes');
        $this->addSql('ALTER TABLE programme DROP length');
        $this->addSql('ALTER TABLE programme DROP elm_learning_opportunity_type');
    }
}
+32 −0
Changes for api/src/Entity/Course.php: 32 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -41,6 +41,38 @@ class Course
    #[ORM\Column(type: 'json', nullable: true)]
    public ?array $description = null;

    /** @var list<array{multiline: string, lang: string}>|null */
    #[ORM\Column(type: 'json', nullable: true)]
    public ?array $learningOutcomes = null;

    /** @var list<array{multiline: string, lang: string}>|null */
    #[ORM\Column(type: 'json', nullable: true)]
    public ?array $prerequisites = null;

    /** @var list<array{multiline: string, lang: string}>|null */
    #[ORM\Column(type: 'json', nullable: true)]
    public ?array $bibliography = null;

    /** @var list<array{multiline: string, lang: string}>|null */
    #[ORM\Column(type: 'json', nullable: true)]
    public ?array $assessmentMethod = null;

    /** @var list<array{multiline: string, lang: string}>|null */
    #[ORM\Column(type: 'json', nullable: true)]
    public ?array $teachingMethod = null;

    /** @var list<string>|null modes d'apprentissage ELM */
    #[ORM\Column(type: 'json', nullable: true)]
    public ?array $elmModeOfLearning = null;

    /** @var list<string>|null types d'activité ELM */
    #[ORM\Column(type: 'json', nullable: true)]
    public ?array $elmLearningActivityType = null;

    /** @var list<string>|null types d'opportunité ELM */
    #[ORM\Column(type: 'json', nullable: true)]
    public ?array $elmLearningOpportunityType = null;

    #[ORM\Column]
    public bool $deprecated = false;

Loading