DW Deadline Tray

Application de monitoring des jobs avec interface système

Aperçu du projet

DW Deadline Tray est une application système de monitoring et de gestion des jobs Deadline. Elle offre une interface légère dans la barre système permettant aux utilisateurs d'accéder rapidement à l'état des rendus en cours et de recevoir des notifications en temps réel lors de changements de statut. Ce projet démontre une architecture logicielle robuste avec une séparation claire des responsabilités et une gestion efficace des tâches asynchrones.

Contexte de développement

Ce projet personnel a été créé pour résoudre un besoin spécifique : offrir une interface simplifiée pour le monitoring des jobs Deadline sans encombrer le poste de travail. L'application fonctionne en arrière-plan, se connecte régulièrement au service web Deadline, et notifie l'utilisateur dès qu'un job passe d'un état à un autre.

Le projet a été architecturé selon le pattern MVCS (Model-View-Controller-Service), garantissant une maintenance facile et une évolutivité future. Cette structure permet une séparation nette entre la logique métier, l'interface utilisateur et les appels externes.

Fonctionnalités clés

Notifications en temps réel

Monitoring continu de l'état des jobs avec alertes immédiates lors de changements de statut.

Interface système

Intégration élégante à la barre système pour un accès rapide sans interface intrusive.

Synchronisation périodique

Vérification régulière de l'état des rendus via le service web Deadline.

Affichage des détails

Consultation rapide des informations importantes des jobs (nom, progression, statut).

Actions rapides

Interface contexuelle pour effectuer des actions courantes sur les jobs sélectionnés.

Configuration flexible

Paramètres d'environnement pour adapter la connexion au service Deadline déployé.

Détails techniques

Technologies utilisées

Python PyQt5 REST API Threading Python-dotenv Requests

Architecture MVCS détaillée

L'application suit une architecture rigoureuse en couches qui sépare les responsabilités et facilite la maintenance :

  • Model (Modèle) : Composé de classes de modèle (Job, MainWindowModel, TreeModel, ModelAssembler) qui gèrent la logique métier et les données. Les entités Job représentent les rendus Deadline avec leurs propriétés (nom, statut, progression). Le ModelAssembler assemble les données brutes de l'API en objets domaine exploitables.
  • View (Vue) : Interface PyQt5 composée de MainWindow et de composants UI spécialisés (design_ui.py généré via Qt Designer). Chaque vue gère uniquement la présentation, sans logique métier, permettant des mises à jour indépendantes.
  • Controller (Contrôleur) : Deux contrôleurs spécialisés orchestrent les interactions :
    • ClipboardController : Gère les actions de copie/pâte pour faciliter l'interaction utilisateur
    • JobActionsController : Traite les actions métier sur les jobs (filtrage, sélection, actions contextuelles)
  • Service : JobMonitorService encapsule la logique de communication avec les systèmes externes. Il gère les requêtes HTTP asynchrones, les cycles de polling, la détection des changements d'état et la génération des notifications.

Patterns et principes de conception

  • Pattern Observer (Observateur) : L'application utilise le système de signaux/slots de PyQt5 pour communiquer entre composants sans couplage fort. Quand le service détecte un changement, les vues sont notifiées via signaux pour se mettre à jour.
  • Pattern Strategy : Les contrôleurs implémentent différentes stratégies pour manipuler les données (actions de clipboard, gestion d'événements).
  • Separation of Concerns : Chaque module a une responsabilité unique et bien définie, permettant une évolution indépendante.
  • Dependency Injection : Les services sont injectés dans les contrôleurs, favorisant la testabilité et la flexibilité.

Gestion asynchrone et concurrence

  • Threading : JobMonitorService s'exécute dans un thread dédié pour éviter les blocages UI lors des requêtes réseau longues
  • Signals PyQt5 : Communication thread-safe entre le thread de monitoring et le thread UI
  • Polling périodique : Vérification régulière de l'état via la Deadline API, configurable selon les besoins
  • File d'attente d'événements : Les changements d'état sont mis en queue pour traitement séquentiel et prévention des race conditions

Intégration Deadline Webservice

  • Communication REST via la librairie requests pour interroger l'API Deadline
  • Configuration externalisée via fichier .env (URL, port) pour adapter rapidement l'application à différents environnements
  • Parsing JSON des réponses et transformation en objets métier via ModelAssembler
  • Gestion robuste des erreurs réseau et timeouts avec retry logic et logging détaillé
  • Cache des données pour minimiser les appels API et améliorer la réactivité

Interface système et notifications

  • Intégration à la barre système (system tray) de l'OS via PyQt5 QSystemTrayIcon
  • Notifications natives du système d'exploitation pour alerter sans fenêtre intrusive
  • Persistance de l'état de l'application (position, visibilité) via paramètres sauvegardés
  • Gestion du cycle de vie : minimisation vers la zone de notification, restauration au clic

Défis et apprentissages

Ce projet m'a permis de développer mes compétences en :

  • Architecture logicielle : Conception et implémentation du pattern MVCS pour une application de taille non triviale
  • Programmation asynchrone : Gestion du threading et des requêtes réseau sans bloquer l'interface utilisateur
  • Intégration d'API externes : Communication fiable avec le service web Deadline via REST
  • Interface système : Développement d'applications légères intégrées à l'OS (system tray)
  • Gestion des erreurs : Anticiper et gérer les défaillances réseau ou de connexion

Installation et utilisation

Prérequis

  • Python 3.8+
  • Accès au service web Deadline

Configuration

  1. Créer un environnement virtuel : python -m venv .venv
  2. Activer l'environnement : .venv\Scripts\activate
  3. Installer les dépendances : pip install -r requirements.txt
  4. Créer un fichier .env avec :
    DL_WEBSERVICE_URL = "url_du_service_deadline"
    DL_WEBSERVICE_PORT = "port_du_service"
  5. Lancer l'application : python src/main.py