Gestion d’un laboratoire de recherche

FULLSTACK : Algorithmique et programmation

Xavier Crégut <prenom.nom@enseeiht.fr>

1 Introduction

L’objectif de ce sujet est de proposer un outil de gestion pour un laboratoire de recherche, et plus précisément les personnels et le bureau qu’ils occupent. Cet outil pourra avoir plusieurs interfaces utilisateurs :

Pour simplifier, nous considérons que nous ne gérons qu’un seul laboratoire.

Ces multiplies interfaces utilisateurs possibles conduiront à bien isoler la partie gestion du laboratoire (sans interactions avec l’utilisateur) dans un module spécifique qui ne fait aucune interaction avec l’utilisateur.

2 Travail à réaliser

2.1 Version initiale

Dans un premier temps, on veut simplement recenser les personnes qui travaillent dans le laboratoire et, plus précisément, savoir quel bureau elles occupent.

On sait que :

  1. Chaque personne occupe un et un seul bureau.
  2. Un même bureau peut accueillir plusieurs personnes.
  3. Une personne est caractérisée par son seul nom. On suppose qu’il n’y a pas d’homonymes.

On veut donc pouvoir :

  1. enregistrer l’arrivée d’une nouvelle personne. On précise le nom de la personne et le bureau qu’elle occupe. Une exception PresentException signalera la tentative d’enregistrer une personne déjà connue du laboratoire.
  2. enregistrer le départ d’une personne. On indique le nom de la personne qui quitte le laboratoire (et donc libère son bureau). On lèvera une exception AbsentException si la personne est inconnue.
  3. modifier le bureau occupé par une personne. On indique le nom de la personne et son nouveau bureau.
  4. changer le nom d’une personne du laboratoire (en cas de mauvaise orthographe, marriage, divorce, etc.).
  5. savoir si une personne est membre du laboratoire.
  6. obtenir le bureau d’une personne.
  7. produire le listing de tous les personnels avec le bureau occupé.

Un menu textuel doit donner accès à ces différentes possibilités.

  1. Donner l’architecture de l’application (premiers niveaux de raffinage et modules)
  2. Indiquer les données manipulées et leur type
  3. Indiquer quels sous-programmes constitueront cette application et dans quels modules ils seront.
  4. Programmer l’application. On utilisera pytest pour tester au fur et à mesure suivant le principe suivant : on traite les fonctionnalités les unes après les autres et pour chaque fonctionnalité, on :
    1. la spécifie dans le module idoine avec un code qui ne fait rien (pass)
    2. on écrit un ou plusieurs programmes de test pour cette fonctionnalité (on les exécute, ils échouent)
    3. on implante la fonctionnalité et on exécute les tests (ils doivent passer sinon on corrige)
    4. on valide les modifications
    5. on complète l’application avec le menu (nouvelle entrée dans le menu)
    6. on valide les modifications
    7. on peut faire évoluer un scénario qui correspond à une exécution particulière
    8. on valide les modifications

On définira comme suit les exceptions susmentionnées :

class LaboException(Exception):
    """ Généralise les exceptions du laboratoire."""
    pass


class AbsentException(LaboException):
    pass


class PresentException(LaboException):
    pass

2.2 Occupation des bureaux

Une nouvelle fonctionnalité est demandée : la possibilité d’afficher l’occupation des bureaux.

  1. On affichera d’abord d’occupation des bureaux en mode texte. Voici le type d’affichage attendu :

    F305:
    - Marc
    - Xavier
    F307:
    - Aurélie
  2. On produira l’occupation des bureaux sous la forme d’une page HTML

  3. On affichera les bureaux et leurs occupnants dans l’ordre lexicographique

2.3 Amélioration des menus

Interrongeons nous sur les menus que nous avons définis.

  1. Est-ce que les menus utilisés sont pratiques ?
    1. Peut-on facilement changer l’ordre des entrées dans le menu ?
    2. Peut-on facilement ajouter une nouvelle entrée ?…
  2. Si nous devons écrire une autre application qui utilise aussi des menus textuels, que pouvons nous réutiliser de ceux que nous venons de définir ?

Proposer une nouvelle implantation des menus réutilisables.

2.4 Gestion de la persistence

Entre deux exécutions de l’application, on veut conserver les informations déjà renseignées. Pour ce faire un sauvegardera dans un ou plusieurs fichiers texte les informations de manière à pouvoir les charger à chaque lancement de l’application.

On pourra utiliser le format JSON et le module json de Python.

On veut aussi pouvoir importer dans le laboratoire des données au format csv. Voici un exemple d’un tel fichier (la première ligne contient le titre des colonnes).

Nom, Bureau
Aurélie, F307
Xavier, F305
Marc, F305

On utilisera le module csv et en particulier DictReader. On affichera à la fin un rapport pour indiquer les personnes du fichiers csv déjà enregistrées mais avec un numéro de bureau différent.

3 Compléments optionnels

3.1 Vérification de cohérence

Pour vérifier la cohérence des informations données, en l’occurrence le numéro de bureau, on définira tous les bureaux possibles et on s’assurera que l’information saisie pour le numéro de bureau est cohérente.

3.2 Informations supplémentaires sur un personnel

On veut pouvoir aussi enregistrer les informations suivantes sur un personnel :

Modifier l’application en conséquence

3.3 Script d’administration

Écrire des scripts de gestion du laboratoire qui ne fonctionnent que grâce aux arguments de la ligne de commande (donc non interactifs). On aura alors un script par fonctionnalité attendu. Par exemple, un script ‘arrivée’ qui prend en argument le laboratoire, le nom du nouvel arrivant et son numéro de bureau.

On peut le faire directement en manipulant la variable argv du module os ou en utilisant le module argparse spécialisé dans le traitement des arguments de la ligne de commande.

3.4 Gestion des équipes de recherche

Les personnels du laboratoire sont généralement attachés à une équipe de recherche. Il faut pouvoir de :

3.5 Responsables d’équipe

Chaque équipe a un responsable qui fait l’interface entre son équipe et le directeur du laboratoire. Il est demandé de gérer ces responsables et de pouvoir lister tous les responsables avec l’équipe dont ils sont responsables.

On souhaite disposer d’un organigramme graphique en utilisant graphviz/dot.