aboutsummaryrefslogtreecommitdiff
path: root/forms.py
blob: b1a30528a3d50b5c1e0b4c625e43f46102b11565 (plain)
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