1
|
|
|
""" |
2
|
|
|
byceps.blueprints.admin.orga_presence.forms |
3
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
4
|
|
|
|
5
|
|
|
:Copyright: 2006-2021 Jochen Kupperschmidt |
6
|
|
|
:License: Revised BSD (see `LICENSE` file for details) |
7
|
|
|
""" |
8
|
|
|
|
9
|
1 |
|
from datetime import datetime |
10
|
|
|
|
11
|
1 |
|
from flask_babel import gettext, lazy_gettext |
12
|
1 |
|
from wtforms.fields.html5 import DateField, TimeField |
13
|
1 |
|
from wtforms.validators import InputRequired, ValidationError |
14
|
|
|
|
15
|
1 |
|
from ....util.datetime.range import DateTimeRange |
16
|
1 |
|
from ....util.datetime.timezone import local_tz_to_utc, utc_to_local_tz |
17
|
1 |
|
from ....util.l10n import LocalizedForm |
18
|
|
|
|
19
|
|
|
|
20
|
1 |
|
def build_presence_create_form(dt_range: DateTimeRange): |
21
|
|
|
|
22
|
|
|
dt_range = dt_range._replace( |
23
|
|
|
start=utc_to_local_tz(dt_range.start).replace(tzinfo=None), |
24
|
|
|
end=utc_to_local_tz(dt_range.end).replace(tzinfo=None), |
25
|
|
|
) |
26
|
|
|
|
27
|
|
|
class CreateForm(LocalizedForm): |
28
|
|
|
starts_on = DateField( |
29
|
|
|
lazy_gettext('Start date'), |
30
|
|
|
default=dt_range.start.date, |
31
|
|
|
validators=[InputRequired()], |
32
|
|
|
) |
33
|
|
|
starts_at = TimeField( |
34
|
|
|
lazy_gettext('Start time'), |
35
|
|
|
default=dt_range.start.time, |
36
|
|
|
validators=[InputRequired()], |
37
|
|
|
) |
38
|
|
|
ends_on = DateField( |
39
|
|
|
lazy_gettext('End date'), |
40
|
|
|
default=dt_range.end.date, |
41
|
|
|
validators=[InputRequired()], |
42
|
|
|
) |
43
|
|
|
ends_at = TimeField( |
44
|
|
|
lazy_gettext('End time'), |
45
|
|
|
default=dt_range.end.time, |
46
|
|
|
validators=[InputRequired()], |
47
|
|
|
) |
48
|
|
|
|
49
|
|
|
def validate(self) -> bool: |
50
|
|
|
if not super().validate(): |
51
|
|
|
return False |
52
|
|
|
|
53
|
|
|
valid = True |
54
|
|
|
|
55
|
|
|
starts_at = local_tz_to_utc( |
56
|
|
|
datetime.combine( |
57
|
|
|
self.starts_on.data, |
58
|
|
|
self.starts_at.data, |
59
|
|
|
) |
60
|
|
|
) |
61
|
|
|
ends_at = local_tz_to_utc( |
62
|
|
|
datetime.combine( |
63
|
|
|
self.ends_on.data, |
64
|
|
|
self.ends_at.data, |
65
|
|
|
) |
66
|
|
|
) |
67
|
|
|
|
68
|
|
|
for dt, field_date, field_time in [ |
69
|
|
|
(starts_at, self.starts_on, self.starts_at), |
70
|
|
|
(ends_at, self.ends_on, self.ends_at), |
71
|
|
|
]: |
72
|
|
|
if dt not in dt_range: |
73
|
|
|
for field in field_date, field_time: |
74
|
|
|
field.errors.append( |
75
|
|
|
gettext('Value must be in valid range.') |
76
|
|
|
) |
77
|
|
|
valid = False |
78
|
|
|
|
79
|
|
|
if starts_at >= ends_at: |
80
|
|
|
for field in ( |
81
|
|
|
self.starts_on, |
82
|
|
|
self.starts_at, |
83
|
|
|
self.ends_on, |
84
|
|
|
self.ends_at, |
85
|
|
|
): |
86
|
|
|
field.errors.append( |
87
|
|
|
gettext('Start value must be before end value.') |
88
|
|
|
) |
89
|
|
|
valid = False |
90
|
|
|
|
91
|
|
|
return valid |
92
|
|
|
|
93
|
|
|
return CreateForm |
94
|
|
|
|