OrderStateFilter.find()   B
last analyzed

Complexity

Conditions 8

Size

Total Lines 25
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 8

Importance

Changes 0
Metric Value
cc 8
eloc 19
nop 4
dl 0
loc 25
ccs 8
cts 8
cp 1
crap 8
rs 7.3333
c 0
b 0
f 0
1
"""
2
byceps.blueprints.admin.shop.order.models
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2014-2024 Jochen Kupperschmidt
6
:License: Revised BSD (see `LICENSE` file for details)
7
"""
8
9 1
from __future__ import annotations
10
11 1
from enum import Enum
12
13 1
from byceps.services.shop.order.models.order import PaymentState
14 1
from byceps.util import iterables
15
16
17 1
IGNORED = None
18 1
NOT_YET_PROCESSED = False
19 1
OVERDUE = True
20 1
PROCESSED = True
21
22
23 1
class OrderStateFilter(Enum):
24
    # fmt: off
25 1
    none                               = (None,                              IGNORED, IGNORED)
26 1
    payment_state_open_and_overdue     = (PaymentState.open,                 OVERDUE, IGNORED)
27 1
    payment_state_open                 = (PaymentState.open,                 IGNORED, IGNORED)
28 1
    payment_state_canceled_before_paid = (PaymentState.canceled_before_paid, IGNORED, IGNORED)
29 1
    payment_state_paid                 = (PaymentState.paid,                 IGNORED, IGNORED)
30 1
    payment_state_canceled_after_paid  = (PaymentState.canceled_after_paid,  IGNORED, IGNORED)
31 1
    waiting_for_processing             = (None,                              IGNORED, NOT_YET_PROCESSED)
32
    # fmt: on
33 1
34
    def __init__(
35
        self,
36
        payment_state: PaymentState | None,
37
        overdue: bool | None,
38
        processed: bool | None,
39 1
    ) -> None:
40 1
        self.payment_state = payment_state
41 1
        self.overdue = overdue
42
        self.processed = processed
43 1
44 1
    @classmethod
45
    def find(
46
        cls,
47
        only_payment_state: PaymentState | None,
48
        only_overdue: bool | None,
49
        only_processed: bool | None,
50 1
    ) -> OrderStateFilter:
51
        if (only_payment_state == PaymentState.open) and (
52
            only_overdue is not None
53 1
        ):
54
            return (
55
                cls.payment_state_open_and_overdue
56
                if only_overdue
57
                else cls.payment_state_open
58 1
            )
59
        elif (only_payment_state == PaymentState.paid) and (
60
            only_processed is not None
61 1
        ):
62
            return (
63
                cls.waiting_for_processing if not only_processed else cls.none
64 1
            )
65 1
        elif only_payment_state is not None:
66
            return cls.find_for_payment_state(only_payment_state) or cls.none
67 1
        else:
68
            return cls.none
69 1
70 1
    @classmethod
71
    def find_for_payment_state(
72
        cls, payment_state: PaymentState
73 1
    ) -> OrderStateFilter | None:
74 1
        def match(order_state_filter):
75
            return (
76
                order_state_filter.payment_state == payment_state
77
                and order_state_filter.overdue is None
78
                and order_state_filter.processed is None
79
            )
80 1
81
        return iterables.find(cls, match)
82