Test Failed
Push — main ( 7a3e4b...2ac75e )
by Jochen
04:03
created

DbPayment.currency()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 3
nop 2
dl 0
loc 3
ccs 0
cts 0
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
"""
2
byceps.services.shop.order.dbmodels.payment
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2014-2022 Jochen Kupperschmidt
6
:License: Revised BSD (see `LICENSE` file for details)
7
"""
8
9 1
from datetime import datetime
10 1
from typing import TYPE_CHECKING
11
12 1
from moneyed import Currency, get_currency, Money
13
14 1
if TYPE_CHECKING:
15 1
    hybrid_property = property
16
else:
17
    from sqlalchemy.ext.hybrid import hybrid_property
18 1
19
from .....database import db, generate_uuid
20
21 1
from ..transfer.order import OrderID
22
from ..transfer.payment import AdditionalPaymentData
23 1
24 1
25
class DbPayment(db.Model):
26
    """A payment related to an order."""
27 1
28 1
    __tablename__ = 'shop_payments'
29 1
30 1
    id = db.Column(db.Uuid, default=generate_uuid, primary_key=True)
31
    order_id = db.Column(
32 1
        db.Uuid, db.ForeignKey('shop_orders.id'), index=True, nullable=False
33
    )
34
    created_at = db.Column(db.DateTime, nullable=False)
35
    method = db.Column(db.UnicodeText, nullable=True)
36
    amount = db.Column(db.Numeric(7, 2), nullable=False)
37
    _currency = db.Column('currency', db.UnicodeText, nullable=False)
38
    additional_data = db.Column(db.JSONB)
39
40 1
    def __init__(
41 1
        self,
42 1
        order_id: OrderID,
43 1
        created_at: datetime,
44 1
        method: str,
45
        amount: Money,
46
        additional_data: AdditionalPaymentData,
47
    ) -> None:
48
        self.order_id = order_id
49
        self.created_at = created_at
50
        self.method = method
51
        self.amount = amount.amount
52
        self.currency = amount.currency
53
        self.additional_data = additional_data
54
55
    @hybrid_property
56
    def currency(self) -> Currency:
57
        return get_currency(self._currency)
58
59
    @currency.setter
60
    def currency(self, currency: Currency) -> None:
61
        self._currency = currency.code
62