Chapitre 16 : Seconde session.
Ce chapitre présente les consignes détaillées pour la seconde session de ce cours. Il vous sera demandé de produire un projet similaire à celui fait pendant l'année, mais seul·e, raison pour laquelle nous avons simplifié quelques étapes pour vous.
Vous devrez produire un site web gérant une base de données fournie et la visualisant à travers un graphe, le tester et enfin écrire un rapport. Le tout sera présenté oralement durant la seconde session.
L'utilisation de l'IA est interdite
Vous ne partez pas de zéro : un projet de base
Faites un issue sur https://forge.uclouvain.be/linfo1002/august-2026/-/issues avant le 1er Aout 2026 pour être assigné à un projet sur forge en veillant à bien tagguer le professeur (@tbarbette). Ce projet sera un clône de https://forge.uclouvain.be/linfo1002/august-2026. Vous pouvez déjà travailler sur cette base si vous le désirez mais le pipeline et la mise en ligne ne fonctionneront pas.
Ce projet contient :
La base de données (décrite ci-dessous), la connexion à la base de données et une requête pour lister les séries.
Un exemple de template pour la page principale
La base pour écrire vos propres tests unitaires
Un pipeline d'intégration continue (CI) pour vérifier que votre code est correct et que les tests passent. Il ne pourra fonctionner qu'après intervention d'un assistant.
Même si vous êtes seul·e, vous devez travailler avec Git et non uniquement sur votre machine. Faites une branche stable (toujours fonctionnelle) et des branches vous permettant de travailler sur les différentes fonctionnalités. Faites une merge request pour fusionner chaque fonctionnalité importante en la décrivant correctement. Forcément, comme vous travaillez seul, vous devrez la fusionner vous-même.
Vous devez utiliser le projet de base et repartir de zéro. Vous devez réimplémenter le code vous-même. Nous utiliserons des comparateurs de plagiat. Vous ne pouvez pas reprendre le code de votre ancien groupe.
Cloner le projet
Une fois votre projet assigné par le professeur (voir ci-dessus), clonez-le sur votre machine. Depuis la page de votre projet sur la Forge, copiez l'URL de clonage (bouton Clone → Clone with HTTPS), puis :
git clone https://forge.uclouvain.be/linfo1002/august-2026
cd august-2026
Attention : si vous avez fait l'issue bien à l'avance, vous aurez déjà l'URL finale de votre projet. Si vous voulez commencer directement, alors quand vous avez l'URL finale pour votre projet à vous, vous devrez faire git remote set-url origin <URL> pour que votre dépôt local pointe vers votre projet et non le projet de base.
Créez ensuite votre environnement virtuel :
python3 -m venv venv
source venv/bin/activate
Si vous avez des difficultés à mettre en place votre environnement, relisez le Chapitre 7 : Travaux Pratiques #3 : Un site Flask sans base de données.
Lancer le projet de base
Après avoir cloné le projet et activé votre environnement virtuel, installez les dépendances :
pip install -r requirements.txt
Puis lancez l'application Flask :
flask --app=series --debug run
Rendez-vous ensuite sur http://127.0.0.1:5000 dans votre navigateur.
Si vous avez des difficultés à lancer Flask, relisez le Chapitre 12 : Travaux Pratiques #4 : Flask avec une base de donnée.
La base de données
La base de données SQLite fournie contient trois tables :
platform — les plateformes de streaming
Colonne |
Type |
Description |
|---|---|---|
|
INTEGER |
Identifiant unique |
|
TEXT |
Nom de la plateforme |
Exemple de contenu :
id |
name |
|---|---|
1 |
Netflix |
2 |
HBO |
3 |
Amazon Prime Video |
4 |
Disney+ |
5 |
Apple TV+ |
genre — les genres de séries
Colonne |
Type |
Description |
|---|---|---|
|
INTEGER |
Identifiant unique |
|
TEXT |
Nom du genre |
Exemple de contenu :
id |
name |
|---|---|
1 |
Drame |
2 |
Comédie |
3 |
Science-Fiction |
4 |
Thriller |
5 |
Fantaisie |
6 |
Animation |
7 |
Crime |
8 |
Documentaire |
series — les séries
Colonne |
Type |
Description |
|---|---|---|
|
INTEGER |
Identifiant unique |
|
TEXT |
Titre de la série |
|
INTEGER |
Année de début de diffusion |
|
INTEGER |
Année de fin (NULL si toujours en cours) |
|
INTEGER |
Clé étrangère vers |
|
INTEGER |
Clé étrangère vers |
|
INTEGER |
Nombre de saisons |
|
REAL |
Note moyenne (0–10) |
|
INTEGER |
Nombre de votes ayant contribué à la note |
Exemple de contenu (extrait) :
id |
title |
year_start |
year_end |
genre_id |
platform_id |
nb_seasons |
rating |
nb_votes |
|---|---|---|---|---|---|---|---|---|
1 |
Breaking Bad |
2008 |
2013 |
7 |
1 |
5 |
9.5 |
2050000 |
2 |
Game of Thrones |
2011 |
2019 |
5 |
2 |
8 |
9.2 |
2300000 |
3 |
Chernobyl |
2019 |
2019 |
1 |
2 |
1 |
9.3 |
830000 |
5 |
Stranger Things |
2016 |
NULL |
3 |
1 |
4 |
8.7 |
1200000 |
… |
… |
… |
… |
… |
… |
… |
… |
… |
Plan proposé
Voici un plan indicatif pour organiser votre travail. Chaque étape correspond à une branche Git et une merge request.
Mise en place et page "À propos" — Forkez le projet, vérifiez qu'il tourne, créez votre page personnelle (nom + image). (Chapitre 3 : Phase 0 du projet, Chapitre 7 : Travaux Pratiques #3 : Un site Flask sans base de données)
Afficher les noms au lieu des IDs — Modifiez la requête SQL de la page principale pour afficher le nom de la plateforme et le nom du genre à la place de leurs identifiants numériques (voir ci-dessous). (Chapitre 12 : Travaux Pratiques #4 : Flask avec une base de donnée, Chapitre 11 : Les bases de donnée)
Premiers tests unitaires — Créez votre classe de tests et un schéma de base de données de test. (Chapitre 9 : Tests unitaires)
Calcul du score pondéré — Implémentez la fonction
weighted_scoredansseries/rating.pyet testez-la. (voir section ci-dessous)Graphique — Affichez le score pondéré moyen par plateforme, filtrable par genre. (Chapitre 14 : La visualisation de données)
Finalisation — Soignez le design, complétez la documentation et le rapport.
Fonctionnalités à implémenter
Vous devrez implémenter les fonctionnalités suivantes :
Afficher les noms de la plateforme et du genre sur la page principale (premier exercice, voir ci-dessous).
La capacité de calculer le score pondéré d'une série (voir ci-dessous). Cette fonctionnalité sera particulièrement testée avec des tests unitaires.
Un graphe unique : un graphe en barres affichant, pour chaque plateforme (Netflix, HBO, etc.), le score pondéré moyen de ses séries. L'axe X liste les plateformes, l'axe Y représente le score (0–10). Un menu déroulant permet à l'utilisateur de filtrer les séries par genre avant le calcul ; par défaut, toutes les séries sont incluses.
Nous vous rappelons que votre code Python devra être clair, documenté et accompagné de tests unitaires.
Premier exercice : afficher les noms de genre et de plateforme
Le projet de base affiche des identifiants numériques (genre_id, platform_id) dans la liste des séries.
Votre première tâche est de modifier la requête SQL dans series/models/series.py pour faire une jointure (JOIN) avec les tables genre et platform, et d'afficher les noms correspondants dans le template.
Relisez la section sur les jointures dans le Chapitre 11 : Les bases de donnée et le Chapitre 12 : Travaux Pratiques #4 : Flask avec une base de donnée pour vous rappeler comment intégrer une requête SQL avec plusieurs tables dans Flask.
Score pondéré
weighted_score(v: int, R: float, C: float) -> float : qui, étant donné le nombre de votes d'une série, sa note et la note moyenne de toutes les séries, retourne son score pondéré.
Les paramètres sont :
v: le nombre de votes (nb_votes) de la sérieR: la note de la série (rating, entre 0 et 10)C: la note moyenne de toutes les séries dans la base de données (calculable viaSELECT AVG(rating) FROM series)
La formule à utiliser est :
W = (v / (v + 1000)) * R + (1000 / (v + 1000)) * C
Interprétation : une série avec très peu de votes verra son score tiré vers la moyenne générale C. Plus une série a de votes, plus son score se rapproche de sa note réelle R. Le nombre 1000 est un seuil fixe qui représente le nombre de votes à partir duquel une série «mérite» d'être jugée sur sa propre note.
Vérification : avec v = 1000, R = 9.0 et C = 8.0, on obtient W = 8.5. Avec v = 0, peu importe R, on obtient W = C.
Vous implémenterez cette fonction dans un fichier series/rating.py. Vous ajouterez la valeure pondérée dans le tableau de la page principale.
Tests unitaires
On vous demande aussi de fournir une classe de tests qui testera la logique de ces différentes méthodes.
Pour ce faire, on vous demande d'utiliser le module unittest comme vu en LSINF1101 et/ou comme rappelé dans le Chapitre 9 : Tests unitaires.
Vous devrez créer vos fichiers de tests dans un sous-répertoire tests et ils devront respecter la nomenclature test_*.py pour que unittest les découvre automatiquement.
Un squelette d'une telle classe :
tests/test_rating.pyimport unittest import series.rating class WeightedScoreTestCase(unittest.TestCase): def test_equal_votes_and_threshold(self): # Avec v = 1000, le score doit être (R + C) / 2 actual = series.rating.weighted_score(1000, 9.0, 8.0) self.assertAlmostEqual(actual, 8.5, places=5) def test_no_votes_returns_mean(self): # Avec v = 0, le score doit être égal à C actual = series.rating.weighted_score(0, 10.0, 7.5) self.assertAlmostEqual(actual, 7.5, places=5) if __name__ == '__main__': unittest.main(verbosity=2)
Pour lancer vos tests, depuis la racine du projet :
python3 -m unittest discover -v -s ./tests
Pour mesurer le code coverage (voir Les tests unitaires dans Flask) :
coverage run --source ./series/ -m unittest discover -v -s ./tests
coverage report -m
Nous vous rappelons que votre projet entier doit être testé, et vous devez le faire petit à petit en utilisant git.
Ajoutez également des tests d'intégration pour les routes comme vu en cours.
Un graphique pour visualiser les données
Le graphique à produire est un graphe en barres (bar chart) construit avec Chart.js et intégré dans une page Flask. Il doit respecter les spécifications suivantes :
Une barre par plateforme (Netflix, HBO, Amazon Prime Video, Disney+, Apple TV+). Vous devez évidemment récupérer les plateformes depuis la base de données et non les coder en dur.
La hauteur de chaque barre représente le score pondéré moyen (
weighted_score) de toutes les séries de cette plateforme. L'axe Y va de 0 à 10.Un menu déroulant (
<select>) au-dessus du graphique permet de choisir un genre. Lorsqu'un genre est sélectionné, seules les séries de ce genre sont prises en compte dans le calcul. L'option par défaut «Tous les genres» inclut toutes les séries.Les axes sont clairement nommés : «Plateforme» en abscisse, «Score pondéré moyen» en ordonnée.
Pour calculer le score pondéré moyen d'une plateforme :
Récupérer via SQL toutes les séries de cette plateforme (filtrées par genre si nécessaire).
Calculer
C = AVG(rating)sur toutes les séries de la base (indépendamment du filtre de genre).Appliquer
weighted_score(nb_votes, rating, C)à chaque série de la plateforme.Faire la moyenne de ces scores pondérés : c'est la hauteur de la barre.
Vous trouverez les discussions à propos de la visualisation de données ainsi que l'utilisation de Chart.js et son intégration dans votre projet (Chapitre 14 : La visualisation de données).
Astuce: si c'est trop compliqué pour vous, commencez par produire une table qui affiche les données du graphe. Si vous n'arrivez pas à faire le graphe, vous aurrez plus de points avec une fonctionnalité partielle mais fonctionnelle qu'avec un graphe qui ne fonctionne pas, ou pire avec des données hardcodées, ou encore pire généré avec une IA générative.
Rapport et présentation
Pour terminer, vous remettrez via git pour LLN: le Mardi 11 août à 18H CRL: le Jeudi 20 à 18h et ULB: le Samedi 8 août à 18H, le code entier avec un tag "august", ainsi qu'un rapport écrit décrivant ce que vous avez fait, les difficultés que vous avez rencontrées et comment vous les avez surmontées. Il n'y aura pas de délai accordé. La non soumission en temps et en heure entraînera donc une note de zéro.
La présentation orale de votre projet se déroulera à la date prévue dans votre horaire d'examen éventuellement notée comme "examen oral". Vous devrez présenter en 5 minutes votre projet, et une démonstration de 3 minutes de votre site, suivie d'une session de questions-réponses de 5 minutes.
Critères d'évaluation
Fonctionnalités :
Page principale - noms : la liste des séries affiche le nom du genre et le nom de la plateforme (et non leurs identifiants numériques).
Page personnelle : une page «À propos» contenant au minimum votre nom et une image.
Fonction ``weighted_score`` : la fonction est implémentée dans
series/rating.py, retourne le bon résultat pour des cas simples (v=0→C,v=1000→(R+C)/2).Tests de ``weighted_score`` : au moins deux tests unitaires vérifiant la fonction, avec des cas limites.
Graphique : un graphe en barres Chart.js affichant le score pondéré moyen par plateforme, avec les axes nommés.
Filtre par genre : un menu déroulant permet de filtrer le graphique par genre ; l'option «Tous les genres» est disponible par défaut.
Rapport :
Le rapport est clair, complet mais concis.
Le rapport présente les fonctionnalités implémentées, en particulier il détaillera l'implémentation du graphique et les choix pour la représentation des données.
Le rapport détaille les tests ajoutés et décrit le code coverage.
Site :
Le site fonctionne en local et est en ligne.
Le design est soigné et l'interface cohérente.
Documentation du code :
Le code est commenté en utilisant des docstrings tels que présentés au cours (voir Documenter son code avec des docstrings).
Code :
Le code est correct.
Le code est vérifié par des tests (point important).
Le code est structuré. La nomenclature et l'organisation des modules et répertoires présentés dans l'énoncé sont respectées. Le site suit le schéma MVC.
Git :
Le code est effectué par petites étapes.
Chaque fonctionnalité a été implémentée dans des branches séparées, fusionnées avec des merge request.
Attention ! L'utilisation de git n'est pas seulement un critère "pour des points". Fusionner des fichiers complets qui semblent "venir d'ailleurs" d'un seul coup sera un indice de plagiat.
La présentation orale sert notamment à détecter l'utilisation d'IA. Si vous ne pouvez pas expliquer votre code, cela sera un indice de plagiat.
Présentation
Vous devrez présenter votre site web ainsi que ces fonctionnalités lors d'une présentation orale pour laquelle vous vous inscrivez sur l'activité Moodle prévue à cet effet.
La présentation comportera une partie sur le projet, l'architecture du code (avec des diapositives en support) de 5 minutes, une démonstration de 3 minutes et un Q&A d'environ 5 minutes. Prévoyez une vidéo de secours pour la démonstration.
Dans votre présentation vous devez présenter votre projet et l'architecture du code, montrer qu'il est bien organisé (MVC, etc). Vous devez présenter comme si vous vous adressiez à des informaticiens externes au projet.
N'oubliez pas de :
Vous présenter
Expliquer l'objectif global du projet
Présenter les grandes fonctionnalités du site, et particulièrement votre fonctionnalité personnalisée
Avoir une conclusion
Avoir une présentation sans fautes et attractive
Avoir une bonne prestance et une bonne élocution
Vérifier le timing de votre présentation (5 minutes) et de votre démo (3 minutes)