# Atelier sur la première partie L'atelier suivant vous fait construire une structure où vous pouvez : - créer des bibliothèques - créer des livres - créer des utilisateurs Et avec ces objets, vous pouvez : - ajouter des livres à vos bibliothèques - emprunter et rendre des livres - voir les informations sur les emprunts - voir les informations sur les livres présents dans une bibliothèque - etc. L'exercice, qui peut vous prendre un peu de temps, vous permet de : - manipuler des objets, listes, dictionnaires - utiliser des f-strings pour afficher des informations en console - utiliser des méthodes et même découvrir la méthode `__str__` (faites une recherche Google) - structurer un peu votre code (concept limité par la taille de l'exercice) ## Organisation - un package `entities` contenant - un module `library` pour y mettre la classe `Library` - un module `book` pour y mettre la classe `Book` - un module `user` pour y mettre la classe `User` - un module `application` vous servant de point d'entrée L'organisation est simple, ceci dû à la taille du projet. Des projets grandissants impliquent souvent des réorganisations. ## Des bibliothèques 1. Créez une classe `Library` - Avec des attributs - `name` (`None`) - `is_open` (`True`) - `books` (`None`) - Avec des méthodes - `__init__(self, name=None, is_open=True)` qui initialise les attributs du nouvel objet. - `open(self, value=True)` pour changer l'état d'ouverture : - Ne fait rien si `value` a déjà la même valeur que `self.is_open` - `register_book(self, book)` qui ajoute un livre à l'attribut `.books` (le transforme d'abord en liste s'il est à `None`, puis ajoute le livre) - `show_books()` qui affiche la liste des livres enregistrés - `__str__(self)` qui renvoie le texte affiché si on fait `print()` sur l'objet - `get_book_avg_prices()` qui renvoie le prix moyen des livres de la bibliothèque ## Des livres 1. Créez une classe `Book` - Avec des attributs - `title` (`None`) - `author` (`None`) - `is_borrowed` (`False`) : le livre est-il emprunté - `borrower` (`None`) : personne qui a emprunté - `history` (`None`) : liste des opérations d'emprunt du livre - `price` (`0`) : prix de base - Avec des méthodes - `__init__(self, ...)` pour initialiser les attributs `title`, `price` et `author` - `borrow(self, user)` qui marque le livre comme emprunté, et modifie `borrower` : - Ne fait rien si le livre est déjà marqué emprunté, sinon : - `is_borrowed` devient `True` - `borrower` prend la référence de l'objet de la classe `User` - `history` *devient* une liste à laquelle on ajoute le dictionnaire `{"user": user, "when": datetime.now()}` - `return_borrow(self)` qui marque le livre comme rendu (non emprunté) - Ne fait rien si le livre est déjà marqué comme non emprunté, sinon : - `borrower` prend la valeur `None` - `show_history(self)` qui affiche l'historique formaté des emprunts - `show_status(self)` qui affiche le statut du livre : titre, emprunté etc. ## Des utilisateurs 1. Créez une classe `User` - Avec des attributs - `name` (`None`) - Avec des méthodes - `__init__(self, name=None)` qui initialise l'attribut de l'objet - `__str__ (self)` qui renvoie une chaîne `f"Utilisateur : {self.name}"`