L. JSON & Base de données - uha-fr/endyear_2025_gr11_back GitHub Wiki

1. JSON

Deadlines (Échéances)

"IM_deadlines": [
    { "event_date": "2025-01-07", "event_time": "17:00", "description": "TD1" },
    { "event_date": "2025-03-14", "event_time": "18:00", "description": "TD2" }
  ],

Cet objet contient un ensemble d'échéances organisées par filière et par type de projet.

  • IM_deadlines : regroupe les dates limites spécifiques à la filière Informatique et Management (IM) pour des événements comme les Travaux Dirigés (TD).
  • MIAGE_deadlines : contient les dates limites pour la filière Méthodes Informatiques Appliquées à la Gestion des Entreprises (MIAGE), incluant des échéances pour les TD et des projets spécifiques.
  • project_deadlines : liste les dates importantes et les heures pour les projets finaux et les soutenances de projets, communes à toutes les filières.

Groups (Groupes)

{ "name": "2", "year": 2024, "members": [{ "nom": "SMITH", "prenom": "Bob" }, { "nom": "IDIRI", "prenom": "Yassine" }] }

Cet objet représente l'organisation des étudiants en groupes de travail pour différentes années universitaires.

  • Chaque objet groupe possède un nom, une année (year) et une liste de membres.
  • Les membres sont identifiés par leur nom (nom) et leur prénom (prenom), permettant de les lier aux informations détaillées dans l'objet students.
  • Un groupe est spécifique à une année académique, et les membres qui y sont assignés doivent être inscrits pour cette même année.

Repositories (Dépôts Git)

{"name": "archiweb_2024_tds_gr2_yassine.idiri", "owner": "uha-fr", "repo_url": "https://github.com/uha-fr/archiweb_2024_tds_gr2_yassine.idiri", "linked_student": {"name": "Yassine", "surname": "IDIRI"}}

Cet objet répertorie les dépôts Git associés aux projets ou aux travaux des étudiants et des groupes.

  • Chaque dépôt (repo) inclut un nom de dépôt, le propriétaire (owner) du dépôt (généralement "uha-fr" ou le nom d'utilisateur GitHub d'un étudiant), et l'URL du dépôt.
  • Un dépôt peut être lié soit à un objet étudiant (linked_student) par son nom et prénom, soit à un objet groupe (linked_group) par son nom et son année. Cela permet de tracer la propriété et le contexte du dépôt.

Students (Étudiants)

{ "surname": "DOE", "name": "Alice", "no_etudiant": "12345678", "class": "MIAGE-FI", "git_usernames": ["alice.doe"], "years": [2023, 2024] }

Cet objet fournit des informations détaillées sur chaque étudiant.

  • Chaque objet étudiant est décrit par son nom (name), son prénom (surname), son numéro d'étudiant unique (no_etudiant), et sa classe ou filière (class, ex: "MIAGE-FI", "IM", "MIAGE-FA").
  • Le champ git_usernames liste les noms d'utilisateur GitHub associés à l'étudiant, facilitant le suivi des contributions aux dépôts.
  • Le champ years indique les années académiques pendant lesquelles l'étudiant est inscrit, ce qui est crucial pour les assignations aux groupes comme mentionné précédemment.

2. Structure de la Base de Données

La base de données, nommée gitanalyser, est conçue pour stocker les informations relatives aux étudiants, aux groupes, à leurs affectations, aux dépôts Git et aux échéances configurables. Voici un aperçu des tables principales et de leurs relations :

  • students: Contient les informations de base sur chaque étudiant (nom, prénom, numéro d'étudiant unique, filière).
  • years: Liste les années académiques.
  • years_students: Table de liaison pour associer un étudiant à une ou plusieurs années académiques.
  • student_git_accounts: Stocke les noms d'utilisateur Git pour chaque étudiant, permettant plusieurs comptes Git par étudiant.
  • groups: Définit les groupes de travail, incluant leur nom et l'année académique à laquelle ils appartiennent.
  • groups_students: Table de liaison pour assigner des étudiants à des groupes. Un déclencheur (TRIGGER) check_group_student_year_consistency assure qu'un étudiant ne peut être ajouté à un groupe que s'il est inscrit pour la même année académique que le groupe.
  • repositories: Liste les dépôts Git, avec leur nom, propriétaire et URL.
  • repositories_students: Associe les dépôts aux étudiants (typiquement pour les Travaux Dirigés - TD). Un déclencheur met à jour la category du dépôt à 'TD' lors de l'insertion.
  • repositories_groups: Associe les dépôts aux groupes (typiquement pour les projets). Un déclencheur met à jour la category du dépôt à 'projet' lors de l'insertion.
  • configurable_deadlines: Contient les dates limites configurables, classées par type (IM, MIAGE, PROJECT) avec leur date, heure et description.

Les relations entre ces tables sont gérées par des clés étrangères (FOREIGN KEY) et des clés primaires composées (PRIMARY KEY) pour maintenir l'intégrité référentielle et garantir la cohérence des données.


3. Processus d'Importation des Données JSON

L'importation des données est gérée par la classe Python JSONToDB située dans backend/app/utils.json_to_db.py. Ce script suit une séquence logique pour insérer les données dans la base de données, en respectant les dépendances entre les tables. Étapes Clés de l'Importation

Chargement des Fichiers JSON:

Le script commence par charger les données des fichiers JSON suivants depuis le répertoire data/ : students.json groups.json repositories.json deadlines.json

Connexion Robuste à la Base de Données:

Une tentative de connexion à la base de données MySQL est effectuée avec une stratégie de réessais (retries). Cela garantit que le script peut attendre que le service de base de données soit disponible, ce qui est particulièrement utile dans les environnements conteneurisés (par exemple, Docker Compose) où les services peuvent ne pas démarrer simultanément.

Importation Ordonnée des Données:

L'ordre d'insertion est crucial pour gérer les dépendances des clés étrangères. Le script procède comme suit :

  • Importation des Années (_import_years): Les années académiques sont extraites des données students.json et groups.json et insérées en premier dans la table years. Cela crée les références nécessaires avant l'insertion des étudiants et des groupes.

  • Importation des Étudiants (_import_students): Chaque étudiant est inséré dans la table students. Les noms d'utilisateur Git (git_usernames) et les années d'inscription (years) associées à chaque étudiant sont ensuite ajoutés aux tables de liaison student_git_accounts et years_students respectivement. Un mapping entre le no_etudiant et l'ID de la base de données est conservé pour les étapes suivantes.

  • Importation des Groupes (_import_groups): Les groupes sont insérés dans la table groups. Les membres de chaque groupe sont ensuite liés via la table groups_students en utilisant le mapping des IDs des étudiants.

  • Importation des Dépôts (_import_repositories): Les dépôts sont insérés dans la table repositories. Le script tente ensuite de lier chaque dépôt à un étudiant ou à un groupe en suivant une logique de priorité :

    ** Priorité 1: Liens explicites dans le JSON: Si les champs linked_student ou linked_group sont présents dans le JSON du dépôt, ces liens sont utilisés en premier.

    ** Priorité 2: Inférence par propriétaire (owner): Si aucun lien explicite n'est trouvé, le script tente de lier le dépôt à un étudiant en utilisant le champ owner (qui est généralement un nom d'utilisateur Git) et en le faisant correspondre avec les comptes Git des étudiants déjà importés.

    ** Priorité 3: Inférence par nom de dépôt: Enfin, si aucune des méthodes précédentes ne fonctionne, le script essaie d'inférer le lien en cherchant des noms de groupe ou des noms d'utilisateur Git dans le nom du dépôt. Les déclencheurs SQL (trg_repo_group_insert, trg_repo_student_insert) se chargent de définir automatiquement la category ('projet' ou 'TD') du dépôt lors de l'insertion.

  • Importation des Échéances Configurables (_import_deadlines): Les différentes échéances (IM, MIAGE, PROJECT) sont insérées dans la table configurable_deadlines.