189 lines
8.6 KiB
Python
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é"
|