-
Notifications
You must be signed in to change notification settings - Fork 4
/
check_validity.py
142 lines (113 loc) · 4.08 KB
/
check_validity.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/usr/bin/env python3
# coding: utf-8
# filename: check_validity.py
"""
Module de vérification du status de l'article
- multiple time_converters:
- (date <-> datetime)
- (date,datetime <-> str)
- (epoch<-> datetime)
- time_delta: définition de nouvelle dates à partir d'un nombre année
- check validity: module qui définit le status de l'article en fonction d'une plage temporelle
"""
from datetime import datetime
import datetime
from dateutil.relativedelta import relativedelta
### TIME CONVERSION UTILS
def convert_date_to_datetime(date):
return datetime.datetime.fromordinal(date.toordinal())
def convert_datetime_to_date(date_time):
date_time.replace(hour=0, minute=0, second=0)
return date_time
def convert_epoch_to_datetime(epoch):
"""convert epoch (seconds till 01/01/1970) to date"""
return datetime.datetime.utcfromtimestamp(epoch / 1000)
def convert_datetime_to_epoch(date_time):
"""convert datetime to epoch"""
epoch = datetime.datetime.utcfromtimestamp(0)
# return date_time - epoch
return (date_time - epoch).total_seconds() * 1000
def convert_date_to_str(date_time):
"""convert datetime into string format"""
return datetime.datetime.strftime(date_time[:4], "%d/%m/%Y")
def convert_datetime_to_str(date_time):
"""convert datetime into string format"""
return datetime.datetime.strftime(date_time, "%d/%m/%Y %H:%M:%S")
def convert_str_to_datetime(date_time):
'''
convert string format into datetime
Arguments:
date_str: string representation of a date
Returns:
date_time: datetime
'''
return datetime.datetime.strptime(date_time, "%d/%m/%Y %H:%M:%S")
### SPECIALS: plage de temps + status de l'article
def time_delta(operator, year_nb):
"""
Calculer le différentiel de date selon l'opérator et le nombre d'années
Arguments
----------
operator: str
chaine de caractère qui représente l'opérateur: - ou +
year_nb: int
entier qui représente le nombre d'années
Return
-------
datetime_delta: datetime
objet datetime représentant la nouvelle date
"""
if operator not in ["-", "+"]:
raise ValueError("Wrong operator")
if not isinstance(year_nb, int):
raise TypeError("Year must be an integer")
today = datetime.date.today()
if operator == "-":
return convert_date_to_datetime(today.replace(year=today.year - year_nb))
else:
return convert_date_to_datetime(today.replace(year=today.year + year_nb))
def time_delta_to_epoch(operator, year_nb):
"""
Calculer le différentiel de date selon l'opérator et le nombre d'années
Arguments
----------
operator: str
chaine de caractère qui représente l'opérateur: - ou +
year_nb: int
entier qui représente le nombre d'années
Return
-------
epoch_delta: int
timestamp/epoch représentant la nouvelle date
"""
return convert_datetime_to_epoch(time_delta(operator, year_nb))
def get_validity_status(start, end, year_before, year_after):
"""
Verifier la validité de l'article à partir d'une plage de temps
Arguments
---------
year_before: int
Nombre d'année avant aujourd'hui
start: datetime
Date de création de l'article
year_after:int
Nombre d'année après aujourd'hui
end: datetime
Date d'expiration de l'article
Returns
--------
status_code: int
Un code de status qui s'inspire d'HTTP
response: str
Un message de status
color: str
Couleur CSS du status: green, yellow, orange, red
"""
past_boundary = time_delta("-", year_before)
future_boundary = time_delta("+", year_after)
if start > past_boundary:
return (301, "Modifié le {}".format(convert_datetime_to_str(start).split(" ")[0]), "yellow")
if end < future_boundary:
return (302, "Valable jusqu'au {}".format(convert_datetime_to_str(end).split(" ")[0]), "orange")
if start < past_boundary and end > future_boundary:
return (204, "Pas de modification", "green")