Passed
Push — main ( 4dce73...0d6f99 )
by Jochen
04:31
created

byceps.blueprints.admin.orga_presence.forms   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 94
Duplicated Lines 0 %

Test Coverage

Coverage 25.81%

Importance

Changes 0
Metric Value
eloc 61
dl 0
loc 94
ccs 8
cts 31
cp 0.2581
rs 10
c 0
b 0
f 0
wmc 7

1 Function

Rating   Name   Duplication   Size   Complexity  
B build_presence_create_form() 0 74 7
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