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

build_presence_create_form()   B

Complexity

Conditions 7

Size

Total Lines 74
Code Lines 52

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 50.1221

Importance

Changes 0
Metric Value
cc 7
eloc 52
nop 1
dl 0
loc 74
ccs 1
cts 24
cp 0.0417
crap 50.1221
rs 7.1709
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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