Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion _formations/oop/0_installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,15 @@ visible: true
type: formation
---

# Installation
# Installation de PyCharm

Pour ce cours, nous allons utiliser PyCharm, un environnement de développement intégré (IDE) pour Python.

Téléchargez PyCharm Community Edition sur le site officiel de JetBrains ([lien ici](https://www.jetbrains.com/fr-fr/pycharm/download/?section=windows)). :warning: **Attention** : assurez-vous de télécharger la version **Community Edition**, qui est gratuite et non la version PyCharm Professional, qui est payante.

{% include figure.liquid loading="eager" path="assets/img/oop/install-pycharm.png" title="Install PyCharm" class="img-fluid rounded z-depth-1" %}

# Utilisation de PyCharm

> TO DO: Ajouter des instructions pour l'utilisation de PyCharm
{: .block-danger }
37 changes: 16 additions & 21 deletions _formations/oop/6_examen_fa.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ type: formation

> #### :exclamation: Consignes
>
> L'accès à Internet est autorisé pour **consulter la documentation Python**. Il est **interdit de communiquer** avec d'autres personnes ou d'**utiliser des outils d'Intelligence Artificielle** tels que ChatGPT. **En cas de triche, la note de 0 sera attribuée.**
> L'accès à Internet est autorisé pour **consulter la documentation Python**. Il est **interdit de communiquer** avec d'autres personnes ou d'**utiliser des outils d'Intelligence Artificielle** tels que ChatGPT ou les auto-complétions de code. **En cas de triche, la note de 0 sera attribuée.**
>
{: .block-danger }

Expand All @@ -48,7 +48,7 @@ StreamFlix propose deux types d'abonnements :
Vous devez concevoir et implémenter un système orienté objet qui permettra de :

1. Gérer différents types de contenus (films et séries)
2. Gérer les abonnements des utilisateurs
2. Gérer les abonnements des utilisateurs
3. Gérer les visionnages
4. Implémenter des tests unitaires

Expand All @@ -57,8 +57,8 @@ classDiagram
class Content {
- id : int
+ title : str
+ genre : str
+ year : int
+ genre : str
+ year : int
# ratings : list[int]
+ duration : int
+ __init__(id, title, genre, year, duration)
Expand All @@ -68,14 +68,14 @@ classDiagram
+ add_rating(rating: int) void
+__eq__(other) bool
}

class Movie {
+ __init__(id, title, genre, year, duration)
+ is_long_movie() bool
+ __str__()
+__eq__(other) bool
}

class Series {
+ num_seasons int
+ episodes_per_season list~int~
Expand All @@ -85,7 +85,7 @@ classDiagram
+ __str__()
+ __lt__(other: Series)
}

class Subscription {
<<abstract>>
# viewed_time int
Expand All @@ -95,22 +95,21 @@ classDiagram
+ __init__(type: str, monthly_price: float, quality: str)
+ can_watch(content: Content) bool
+ add_viewed_time(duration: int) void
+ show_advertisement() void
+ is_premium() bool
}

class FreeSubscription {
+ can_watch(content: Content) bool
+ add_viewed_time(duration: int) void
+ show_advertisement() void
+ is_premium() bool
}

class PremiumSubscription {
+ can_watch(content: Content) bool
+ is_premium() bool
}

class User {
+ id int
+ username str
Expand All @@ -120,15 +119,15 @@ classDiagram
+ __init__(id, username, email, subscription)
+ watch(content: Content)
}

class WatchHistory {
+ history : dict
+ __init__()
+ add_entry(user_id, content, timestamp)
+ get_history(user_id)
+ most_watched_genre(user_id)
}

Content <|-- Movie
Content <|-- Series
Subscription <|-- FreeSubscription
Expand All @@ -145,9 +144,9 @@ classDiagram
|----------------------------------------------|----------------------------------------------------|
| `id` | Identifiant du film |
| `title` | Titre du contenu |
| `genre` | Genre du contenu.
| `year` | Année de sortie. |
| `ratings` | Liste des évaluations du contenu. |
| `genre` | Genre du contenu.
| `year` | Année de sortie. |
| `ratings` | Liste des évaluations du contenu. |
| `duration` | Durée du contenu en minutes. |
| `__init__(id, title, genre, year, duration)` | Constructeur de la classe Content. |
| `get_id()` | Retourne l'identifiant du contenu. |
Expand Down Expand Up @@ -194,7 +193,6 @@ La classe `Subscription` définit les méthodes et attributs communs à tous les
| `__init__()` | Constructeur initialisant le temps de visionnage à 0 |
| `can_watch(content: Content) -> bool` | Méthode abstraite déterminant si un média peut être visionné |
| `add_viewing_time(duration: int)` | Méthode ajoutant du temps au compteur de visionnage |
| `show_advertisement()` | Méthode gérant l'affichage des publicités |
| `is_premium() -> bool` | Méthode abstraite indiquant si l'abonnement est premium |

---
Expand All @@ -220,7 +218,6 @@ La classe `PremiumSubscription` définit les méthodes et attributs spécifiques
|------------------|-------------|
| `can_watch(content: Content) -> bool` | Retourne toujours `True` car aucune limite de temps pour les abonnés premium |
| `add_viewing_time(duration: int)` | Ne fait rien car pas de limite de temps pour les abonnements premium |
| `show_advertisement()` | Ne fait rien car pas de publicités pour les abonnements premium |
| `is_premium() -> bool` | Retourne toujours `True` car c'est un abonnement premium |

---
Expand Down Expand Up @@ -313,7 +310,7 @@ Créer un fichier main avec :

### Tests unitaires

Vous devez écrire des tests unitaires pour les classes `Movie`, `Series`, `User` et `WatchHistory`. Les tests doivent couvrir les cas normaux et les cas limites.
Vous devez écrire des tests unitaires pour les classes `Movie`, `Series`, `User` et `WatchHistory`. Les tests doivent couvrir les cas normaux et les cas limites.

<!--

Expand Down Expand Up @@ -667,5 +664,3 @@ classDiagram
Series ..> Actor : uses
```
-->


23 changes: 15 additions & 8 deletions _formations/oop/6_examen_fi.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ layout: page
title: TP6
description: >
TP noté
importance: 7
importance: 8
category: BUT 2 - Programmation Orientée Objet
mermaid:
enabled: true
zoomable: true
permalink: /oop/exam/
permalink: /oop/exam/fi/
visible: false
type: formation
---
Expand All @@ -21,10 +21,17 @@ type: formation

L'objectif de ce TP est de mobiliser les notions abordées lors des TPs.

L'accès à Internet est autorisé pour consulter la documentation Python, mais il est interdit de communiquer avec d'autres personnes ou d'utiliser des outils d'IA ou des chatbots tels que ChatGPT. En cas de triche, la note de 0 sera attribuée.

:warning: Les conventions de nommage ainsi que toutes les règles de bonnes pratiques seront prises en compte dans la notation. Au moins, une classe doit être documentée.

> #### :exclamation: Consignes
>
> L'accès à Internet est autorisé pour **consulter la documentation Python**. Il est **interdit de communiquer** avec d'autres personnes ou d'**utiliser des outils d'Intelligence Artificielle** tels que ChatGPT ou les auto-complétions de code. **En cas de triche, la note de 0 sera attribuée.**
>
{: .block-danger }

> #### :information_source: Barème
>
> Les conventions de nommage ainsi que toutes les règles de bonnes pratiques seront prises en compte dans la notation. Au moins une classe doit être complètement documentée.
>
{: .block-warning }
---

### :notes: Gestion d'un système de musique et de podcasts
Expand Down Expand Up @@ -143,10 +150,10 @@ classDiagram

<b><u>Méthodes</u></b>
- `__str__()` : une méthode spéciale permettant d'afficher les informations du podcast au format suivant `Podcast title by host_name has number_episodes (duration seconds)` par exemple `Y'a plus de saisons by Swann Périssé has 12 episodes (92501 seconds)`.
- `play(seconds: int)` : une méthode permettant de lire le podcast
- `play(seconds: int)` : une méthode permettant de lire le podcast
- Si `seconds` est spécifié par l'utilisateur, ajouter `seconds` à `current`.
- Sinon ajouter 10 minutes à la variable `current` (10 minutes = 600 secondes)
- `rate_podcast(rating: int)` : permet de noter (entre 1 et 5) le podcast.
- `rate_podcast(rating: int)` : permet de noter (entre 1 et 5) le podcast.
- Ajoute une note (`rating`) dans la liste de notes (`ratings`).
- Si la note est inférieure à 1 ou supérieure à 5, une exception `InvalidRatingError` doit être levée.
- `average_rating()` : retourne la note moyenne du podcast, vous pouvez utiliser la méthode `mean` du module `statistics`.
Expand Down