gestt/Views/quickTask.py

189 lines
8.6 KiB
Python

# -*-coding:utf8 -*
"""Fenêtre de rapide : Vue"""
#TODO: Rajouter une checkbox pour ajout d'une entrée de temps manuel (sans chrono)
#TODO: Passer toutes les vérifications des champs dans le controleur
import sys
import os
from tkinter import *
from datetime import datetime, timedelta
DOSSIER_COURRANT = os.path.dirname(os.path.abspath(__file__))
DOSSIER_PARENT = os.path.dirname(DOSSIER_COURRANT)
sys.path.append(DOSSIER_PARENT)
from DB.dbLink import DBLink as db
from Controllers.TasksController import TasksController as TasksCont
class QuickTask:
"""Fenêtre d'ajout rapide de tâche"""
def __init__(self, mother, project_name='Sélectionner...', activate=False):
#Initialisation des variables
QuickTask.activate = activate
link = db() #On aura besoin de la BDD pour récupérer projets et types
QuickTask.fenetre = Toplevel(mother)
QuickTask.fenetre.title("Tâche rapide")
###Titre
Label(QuickTask.fenetre, text="Ajout d'une tâche").pack()
self.msg = Label(QuickTask.fenetre, text='')
self.msg.pack()
###Champ de projet
Label(QuickTask.fenetre, text="Nom du projet :").pack()
# Create a Tkinter variable
QuickTask.project = StringVar(QuickTask.fenetre)
self.proj_choices = dict()
#Récupération des types et insertion comme options
# Attention : si deux projets ouverts ont le même intitulé,
# seul le plus récent sera pris en compte
projects = link.query("SELECT IDProj, Intitulé FROM projet WHERE IDStat = 1", []).fetchall()
for elem in projects:
self.proj_choices[elem[1]] = elem[0]
QuickTask.project.set(project_name) # set the default option
OptionMenu(QuickTask.fenetre, QuickTask.project, *self.proj_choices).pack()
###Champ de type
# Create a Tkinter variable
QuickTask.type_value = StringVar(QuickTask.fenetre)
self.ty_choices = dict()
#Récupération des types et insertion comme options
types = link.query("SELECT * FROM type ", []).fetchall()
for elem in types:
self.ty_choices[elem[1]] = elem[0]
QuickTask.type_value.set("Sélectionner...") # set the default option
Label(QuickTask.fenetre, text="Type de tâche :").pack()
OptionMenu(QuickTask.fenetre, QuickTask.type_value, *self.ty_choices).pack()
###Champ de description
Label(QuickTask.fenetre, text="Description :").pack()
QuickTask.input_desc = Entry(QuickTask.fenetre)
QuickTask.input_desc.pack()
###Champ de commentaire
Label(QuickTask.fenetre, text="Commentaire :").pack()
QuickTask.input_comm = Text(QuickTask.fenetre, width=25, height=3)
QuickTask.input_comm.pack()
###Minutes de décalage pour le bouton démarrer/arrêter
Label(QuickTask.fenetre, text="Décalage : ").pack()
self.min_label = Label(QuickTask.fenetre, text="Tâche commencée il y a ")
self.min_label.pack()
QuickTask.input_min = Entry(QuickTask.fenetre)
QuickTask.input_min.insert(0, 0)
QuickTask.input_min.pack()
Label(QuickTask.fenetre, text="minute(s)").pack()
###Champs heures de début/fin
Label(QuickTask.fenetre, text="Heure de début : ").pack()
QuickTask.heure_debut = Entry(QuickTask.fenetre, state=DISABLED)
QuickTask.heure_debut.pack()
Label(QuickTask.fenetre, text="Heure de fin : ").pack()
QuickTask.heure_fin = Entry(QuickTask.fenetre, state=DISABLED)
QuickTask.heure_fin.pack()
###Bouton démarrer/arrêter
QuickTask.start_stop = Button(QuickTask.fenetre, text="Démarrer", command=self.timer)
QuickTask.start_stop.pack()
#Bouton annuler
QuickTask.cancel = Button(QuickTask.fenetre, command=self.stop, text="Annuler", state=DISABLED)
QuickTask.cancel.pack()
def timer(self):
"""Actions à engager lorsqu'on débute/arrête une tâche"""
#Prise en compte du décalage de temps et remise à zéro du compteur
decalage = int(QuickTask.input_min.get())
#Action à déclencher en fonction de si on démarre ou finit l'enregistrement
if not QuickTask.activate: #Si on démarre l'enregistrement
#Gestion de l'heure de départ
QuickTask.h_debut_value = datetime.now() - timedelta(minutes=decalage)
QuickTask.heure_debut['state'] = NORMAL
QuickTask.heure_debut.insert(0, QuickTask.h_debut_value.strftime('%H:%M'))
QuickTask.heure_debut['state'] = DISABLED
#Modification des labels
QuickTask.start_stop['text'] = "Terminer"
self.min_label['text'] = "Tâche terminée il y a "
#On change le statut du bouton, on active l'annulation, on vide le champ décalage
QuickTask.activate = not QuickTask.activate
QuickTask.cancel['state'] = NORMAL
QuickTask.input_min.delete(0, 'end')
QuickTask.input_min.insert(0, 0)
else: #Si on le finit
#Vérifions que les champs sont bien remplis
if QuickTask.project.get() != 'Sélectionner...' \
and QuickTask.type_value.get() != 'Sélectionner...' \
and QuickTask.input_desc.get() != '':
#On gère l'heure de fin
QuickTask.h_fin_value = datetime.now() - timedelta(minutes=decalage)
#Et on vérifie que l'heure de début est inférieure à celle de fin
ecart_temps = QuickTask.h_fin_value - QuickTask.h_debut_value
if QuickTask.h_fin_value > QuickTask.h_debut_value \
and ecart_temps.seconds > 60:
#tout est ok ? on va enregistrer
#On modifie le champ d'heure de fin
QuickTask.heure_fin['state'] = NORMAL
QuickTask.heure_fin.insert(0, QuickTask.h_fin_value.strftime('%H:%M'))
QuickTask.heure_fin['state'] = DISABLED
#Et les labels
QuickTask.start_stop['text'] = "Démarrer"
self.min_label['text'] = "Tâche commencée il y a "
# appel à la fonction controleur enregistrant la tâche en BDD
controller = TasksCont()
controller.register(QuickTask.heure_debut.get(), QuickTask.heure_fin.get(),
QuickTask.input_comm.get('1.0', 'end'),
self.proj_choices[QuickTask.project.get()],
QuickTask.input_desc.get(),
self.ty_choices[QuickTask.type_value.get()])
#On change le statut du bouton et on vide les champs
QuickTask.activate = not QuickTask.activate
QuickTask.heure_debut['state'] = NORMAL
QuickTask.heure_debut.delete(0, 'end')
QuickTask.heure_debut['state'] = DISABLED
QuickTask.heure_fin['state'] = NORMAL
QuickTask.heure_fin.delete(0, 'end')
QuickTask.heure_fin['state'] = DISABLED
QuickTask.input_comm.delete('1.0', 'end')
QuickTask.input_min.delete(0, 'end')
QuickTask.input_min.insert(0, 0)
#Désactivation du bouton annuler et vidage de champs
QuickTask.cancel['state'] = DISABLED
QuickTask.input_desc.delete(0, 'end')
#On affiche un message disant OK
self.msg['text'] = "Tâche enregistrée"
else:
self.msg['text'] = "L'heure de fin doit être supérieure ou égale à l'heure de début"
else:
#non ? on affiche un message et on valide rien du tout, namého
self.msg['text'] = "Tous les champs doivent êtres remplis pour enregistrer la tâche"
def stop(self):
"""Annulation d'une tâche démarrée"""
#Gestion des labels
QuickTask.start_stop['text'] = "Démarrer"
self.min_label['text'] = "Tâche commencée il y a "
#On change le statut du bouton et on vide les champs
QuickTask.activate = not QuickTask.activate
QuickTask.heure_debut['state'] = NORMAL
QuickTask.heure_debut.delete(0, 'end')
QuickTask.heure_debut['state'] = DISABLED
#Désactivation du bouton annuler
QuickTask.cancel['state'] = DISABLED
#AFfichage du message
self.msg['text'] = "Enregistrement de la tâche annulé"