254 lines
5.1 KiB
Python
254 lines
5.1 KiB
Python
#!/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 |