Menu
Coddy logo textTech

Interface d'administration

Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 59 sur 64.

challenge icon

Défi

Moyen

Dans ce défi, vous allez implémenter des fonctions administratives pour un système de gestion de bibliothèque.

Vous devrez modifier le fichier library.py pour ajouter une méthode get_statistics à la classe Library qui retourne un dictionnaire avec des statistiques clés sur l'état de la bibliothèque. Les détails de l'implémentation sont fournis dans les commentaires TODO à l'intérieur du fichier.

Les statistiques doivent inclure :

  • Le nombre total de livres
  • Le nombre de livres disponibles
  • Le nombre de livres empruntés
  • Le nombre total d'utilisateurs
  • Le nombre d'utilisateurs ayant des livres empruntés

Les fichiers book.py et user.py contiennent des classes pré-implémentées avec lesquelles votre solution interagira. Bien que vous puissiez consulter ces fichiers pour comprendre la structure du système, votre implémentation doit se concentrer sur le fichier library.py.

Aide-mémoire

Ce défi se concentre sur l'implémentation des statistiques d'un système de gestion de bibliothèque sans fournir de contenu de leçon spécifique. La tâche consiste à créer une méthode get_statistics qui renvoie un dictionnaire contenant des mesures de la bibliothèque telles que le nombre total de livres, les livres disponibles, les livres empruntés, le nombre total d'utilisateurs et les utilisateurs ayant des livres empruntés.

Essayez vous-même

from book import Book
from user import User
from library import Library

# Gestionnaire de cas de test
test_case = input()

if test_case == "empty_library":
    library = Library("Empty Library")
    stats = library.get_statistics()
    
    print(f"Total Books: {stats['total_books']}")
    print(f"Available Books: {stats['available_books']}")
    print(f"Borrowed Books: {stats['borrowed_books']}")
    print(f"Total Users: {stats['total_users']}")
    print(f"Users with Books: {stats['users_with_books']}")

elif test_case == "with_borrowed_books":
    library = Library("Community Library")
    
    # Ajouter des livres et des utilisateurs
    library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
    library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
    library.add_book(Book("1984", "George Orwell", "345678"))
    
    library.add_user(User("U001", "Alice"))
    library.add_user(User("U002", "Bob"))
    library.add_user(User("U003", "Charlie"))
    
    # Emprunter quelques livres
    library.borrow_book("123456", "U001")
    library.borrow_book("789012", "U001") # Alice emprunte 2 livres
    library.borrow_book("345678", "U002") # Bob emprunte 1 livre
    
    stats = library.get_statistics()
    print(f"Total Books: {stats['total_books']}")
    print(f"Available Books: {stats['available_books']}")
    print(f"Borrowed Books: {stats['borrowed_books']}")
    print(f"Total Users: {stats['total_users']}")
    print(f"Users with Books: {stats['users_with_books']}")

elif test_case == "return_books":
    library = Library("Return Test Library")
    
    # Ajouter des livres et des utilisateurs
    library.add_book(Book("Python Programming", "John Smith", "111222"))
    library.add_book(Book("Data Structures", "Jane Doe", "333444"))
    
    library.add_user(User("U101", "David"))
    library.add_user(User("U102", "Emma"))
    
    # Emprunter un livre
    library.borrow_book("111222", "U101")
    
    # Obtenir les statistiques avant le retour
    stats_before = library.get_statistics()
    print("Before returning:")
    print(f"Total Books: {stats_before['total_books']}")
    print(f"Available Books: {stats_before['available_books']}")
    print(f"Borrowed Books: {stats_before['borrowed_books']}")
    print(f"Users with Books: {stats_before['users_with_books']}")
    
    # Implémentation du retour de livre (serait dans la classe Library)
    book = next((book for book in library.books if book.isbn == "111222"), None)
    user = next((user for user in library.users if user.user_id == "U101"), None)
    
    if book and user:
        book.available = True
        book.borrower = None
        user.books_borrowed.remove(book)
        print("Book returned successfully")
    
    # Obtenir les statistiques après le retour
    stats_after = library.get_statistics()
    print("\
After returning:")
    print(f"Total Books: {stats_after['total_books']}")
    print(f"Available Books: {stats_after['available_books']}")
    print(f"Borrowed Books: {stats_after['borrowed_books']}")
    print(f"Users with Books: {stats_after['users_with_books']}")

elif test_case == "edge_cases":
    # Bibliothèque vide
    empty_library = Library("Empty Library")
    empty_stats = empty_library.get_statistics()
    print("Empty library statistics:")
    print(f"Total Books: {empty_stats['total_books']}")
    print(f"Available Books: {empty_stats['available_books']}")
    print(f"Borrowed Books: {empty_stats['borrowed_books']}")
    print(f"Total Users: {empty_stats['total_users']}")
    print(f"Users with Books: {empty_stats['users_with_books']}")
    
    # Livres mais pas d'utilisateurs
    books_only = Library("Books Only")
    books_only.add_book(Book("Book 1", "Author 1", "B001"))
    books_only.add_book(Book("Book 2", "Author 2", "B002"))
    books_stats = books_only.get_statistics()
    print("\
Library with books but no users:")
    print(f"Total Books: {books_stats['total_books']}")
    print(f"Available Books: {books_stats['available_books']}")
    print(f"Total Users: {books_stats['total_users']}")
    print(f"Users with Books: {books_stats['users_with_books']}")
    
    # Utilisateurs mais pas de livres
    users_only = Library("Users Only")
    users_only.add_user(User("U201", "User 1"))
    users_only.add_user(User("U202", "User 2"))
    users_stats = users_only.get_statistics()
    print("\
Library with users but no books:")
    print(f"Total Books: {users_stats['total_books']}")
    print(f"Available Books: {users_stats['available_books']}")
    print(f"Total Users: {users_stats['total_users']}")
    print(f"Users with Books: {users_stats['users_with_books']}")
    
    # Cas d'erreur
    error_library = Library("Error Test")
    error_library.add_book(Book("Error Book", "Error Author", "E001"))
    error_library.add_user(User("E101", "Error User"))
    
    print("\
Error cases:")
    print(f"Borrow non-existent book: {error_library.borrow_book('NONEXISTENT', 'E101')}")
    print(f"Borrow with non-existent user: {error_library.borrow_book('E001', 'NONEXISTENT')}")

elif test_case == "large_library":
    large_library = Library("Large Library")
    
    # Ajouter 100 livres
    for i in range(1, 101):
        large_library.add_book(Book(f"Book {i}", f"Author {i}", f"ISBN{i:06d}"))
    
    # Ajouter 100 utilisateurs
    for i in range(1, 101):
        large_library.add_user(User(f"U{i:03d}", f"User {i}"))
    
    # Faire en sorte que 50 utilisateurs empruntent des livres
    for i in range(1, 51):
        large_library.borrow_book(f"ISBN{i:06d}", f"U{i:03d}")
    
    # Faire en sorte que certains utilisateurs empruntent plusieurs livres
    for i in range(1, 11):
        large_library.borrow_book(f"ISBN{i+50:06d}", f"U{i:03d}")
    
    stats = large_library.get_statistics()
    print("Large library statistics:")
    print(f"Total Books: {stats['total_books']}")
    print(f"Available Books: {stats['available_books']}")
    print(f"Borrowed Books: {stats['borrowed_books']}")
    print(f"Total Users: {stats['total_users']}")
    print(f"Users with Books: {stats['users_with_books']}")
    
    # Vérifier les calculs
    print("\
Verification:")
    print(f"Total books should be 100: {stats['total_books'] == 100}")
    print(f"Borrowed books should be 60: {stats['borrowed_books'] == 60}")
    print(f"Available books should be 40: {stats['available_books'] == 40}")
    print(f"Users with books should be 50: {stats['users_with_books'] == 50}")

elif test_case == "statistics_accuracy":
    accuracy_library = Library("Accuracy Test")
    
    # Ajouter exactement 10 livres
    for i in range(1, 11):
        accuracy_library.add_book(Book(f"Book {i}", f"Author {i}", f"A{i:03d}"))
    
    # Ajouter exactement 5 utilisateurs
    for i in range(1, 6):
        accuracy_library.add_user(User(f"AU{i}", f"Accuracy User {i}"))
    
    # Aucun livre emprunté pour le moment
    stats1 = accuracy_library.get_statistics()
    print("Initial state:")
    print(f"Total Books: {stats1['total_books']} (Expected: 10)")
    print(f"Available Books: {stats1['available_books']} (Expected: 10)")
    print(f"Borrowed Books: {stats1['borrowed_books']} (Expected: 0)")
    print(f"Total Users: {stats1['total_users']} (Expected: 5)")
    print(f"Users with Books: {stats1['users_with_books']} (Expected: 0)")
    
    # Faire en sorte que 3 utilisateurs empruntent des livres
    accuracy_library.borrow_book("A001", "AU1")
    accuracy_library.borrow_book("A002", "AU1")  # L'utilisateur 1 emprunte 2 livres
    accuracy_library.borrow_book("A003", "AU2")  # L'utilisateur 2 emprunte 1 livre
    accuracy_library.borrow_book("A004", "AU3")  # L'utilisateur 3 emprunte 1 livre
    
    stats2 = accuracy_library.get_statistics()
    print("\
After borrowing:")
    print(f"Total Books: {stats2['total_books']} (Expected: 10)")
    print(f"Available Books: {stats2['available_books']} (Expected: 6)")
    print(f"Borrowed Books: {stats2['borrowed_books']} (Expected: 4)")
    print(f"Total Users: {stats2['total_users']} (Expected: 5)")
    print(f"Users with Books: {stats2['users_with_books']} (Expected: 3)")

Toutes les leçons de Object Oriented Programming