#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Feb 24 16:36:32 2022 @author: antoine """ ################ ### UniSquat ### ################ # Une application pour afficher les salles libres dans les différents # départements de l'Université de Strasbourg. ### Fichier contenant diverses fonctions relatives à la date du jour et à l'heure ### # Modules : import datetime # Fonctions : def minutes_convert(time_min) : """ Convertit un temps en minute en un temps en heures:minutes. Parameters ---------- time_min : int Temps en minutes. Returns ------- tuple Temps en heures et en minutes. """ return int(time_min // 60), int(time_min % 60) def bissextile(year) : """ Indique si l'année 'year' est bissextile ou non. Parameters ---------- year : int Année dont on veut vérifier la bissextilité. Returns ------- bool 'True' si 'year' est bissextile, 'False' sinon. """ return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 def month_days(month, year) : """ Renvoie le nombre de jours dans le mois 'month'. Parameters ---------- month : int (between 1 and 12) Mois dont on veut connaître le nombre de jours. year : int Année, pour vérifier la bissextilité (cas du mois de février). Returns ------- int Nombre de jours dans 'month'. """ if month == 2 : if bissextile(year) : return 29 else : return 28 elif month in (4, 6, 9, 11) : return 30 else : return 31 def date_input() : """ Demande à l'utilisateur d'entrer une date (jour, mois, année, heure, minutes). Returns ------- datetime.datetime() Date entrée au format datetime. """ year = int(input("Entrer l'année.\n> ")) month = 0 while month not in range(1, 13) : month = int(input("Entrer le mois.\n> ")) mdays = month_days(month, year) day = 0 while day not in range(1, mdays + 1) : day = int(input("Entrer le jour.\n> ")) hour = -1 while hour not in range(0, 25) : hour = int(input("Entrer l'heure.\n> ")) minute = -1 while minute not in range(0, 60) : minute = int(input("Entrer les minutes.\n> ")) return datetime.datetime(year, month, day, hour, minute) def hour_disp(time) : """ Convertit une heure au format datetime en une chaîne de caractères. Parameters ---------- time : datetime.datetime Heure au format datetime. Returns ------- time_str : str Heure en chaîne de caractères. """ time_str = str(time.hour) + ":" if time.minute < 10 : # Ajout du zéro au début du nombre de minutes time_str += "0" + str(time.minute) else : time_str += str(time.minute) return time_str def remain_time(date, rdate) : """ Détermine le temps restant avant la fin/le début de disponibilité d'une salle. Parameters ---------- date : datetime.datetime Date choisie au format datetime. rdate : datetime.datetime Date de la salle au format datetime. Returns ------- remain_time_str : str Temps restant. """ deltasec = rdate.timestamp() - date.timestamp() if int(deltasec / 60 + 0.5) > 1 : remain_time_str = str(int(deltasec / 60 + 0.5)) + " minutes" else : remain_time_str = str(int(deltasec / 60 + 0.5)) + " minute" if deltasec / 60 + 0.5 >= 60 : # Conversion en heures:minutes si les minutes dépassent 60 deltasec = minutes_convert(deltasec / 60 + 0.5) if deltasec[0] > 1 : remain_time_str = str(deltasec[0]) + " heures" else : remain_time_str = str(deltasec[0]) + " heure" if deltasec[1] > 0 : remain_time_str += " " + str(deltasec[1]) + " minutes" return remain_time_str def check_date(date) : """ Vérifie que la date est correcte. Parameters ---------- date : list Date à vérifier. Returns ------- bool 'True' si la date est correcte, 'False' sinon. """ year = 1 month = 1 day = 1 if len(date) != 3 : return False try : year = int(date[0]) month = int(date[1]) day = int(date[2]) except ValueError : return False if year < 2 or month < 1 or day < 1 : return False if month > 12 : return False if day > month_days(month, year) : return False return True def check_time(time) : """ Vérifie que l'heure est correcte. Parameters ---------- time : list Heure à vérifier. Returns ------- bool 'True' si l'heure est correcte, 'False' sinon. """ hour = 0 minute = 0 if len(time) != 2 : return False try : hour = int(time[0]) minute = int(time[1]) except ValueError : return False if hour < 0 or minute < 0 : return False if hour > 23 : return False if minute > 59 : return False return True def d_t_format(d_t, t_mode) : """ Formate une date ou une heure récupérée depuis une URL sous la forme d'une liste. Parameters ---------- d_t : str Date ou heure à formater. t_mode : bool Indique si on est en mode heure. Returns ------- str Date formatée en liste avec jour, mois, année. """ sep = ":" if t_mode else "-" if d_t == "None" : return [""] else : return d_t.split(sep)