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
|
# Copyright (C) 2018 Alban Gruin
#
# celcatsanitizer is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# celcatsanitizer is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with celcatsanitizer. If not, see <http://www.gnu.org/licenses/>.
from datetime import timedelta
from django import forms
from django.forms.widgets import DateInput, TimeInput
from .utils import tz_now
class QSJPSForm(forms.Form):
day = forms.DateField(label="Jour",
widget=DateInput(attrs={"type": "date"}))
# Ces champs n’acceptent pas les secondes
begin = forms.TimeField(label="Heure de début", input_formats=("%H:%M",),
widget=TimeInput(attrs={"type": "time"}))
end = forms.TimeField(label="Heure de fin", input_formats=("%H:%M",),
widget=TimeInput(attrs={"type": "time"}))
def __init__(self, *args, **kwargs):
super(QSJPSForm, self).__init__(*args, **kwargs)
# On définit les valeurs par défaut de cette manière pour
# éviter les mauvaises surprises. On retire les secondes des
# heures de début et de fin.
now = tz_now()
self.fields["day"].initial = now.strftime("%Y-%m-%d")
self.fields["begin"].initial = now.strftime("%H:%M")
# Si il est 23h passé, 23h + 1h revient à minuit passé, et ne
# respecte pas le critère de la recherche (début < fin). La
# valeur par défaut de la fin devient automatiquement 23:59.
if now.hour == 23:
# Cela ne marche toujours pas à 23h59.
# TODO trouver une solution plus pérenne.
self.fields["end"].initial = "23:59"
else:
self.fields["end"].initial = (now + timedelta(hours=1)) \
.strftime("%H:%M")
def clean(self):
form_data = self.cleaned_data
# On vérifie que les valeurs de début et de fin sont correctes
# (si ce n’est pas le cas, elles ne se trouvent pas dans le
# dictionnaire), et, le cas échéant, on vérifie que l’heure de
# début est strictement inférieure à l’heure de fin.
if "begin" in form_data and "end" in form_data and \
form_data["begin"] >= form_data["end"]:
# Si l’heure de fin est plus petite ou égale, on affiche
# une erreur.
self.add_error("end", "L’heure de début doit être "
"supérieure à celle de fin.")
return form_data
|