Passed
Push — main ( 57d628...c66ff9 )
by Jochen
04:13
created

get_line_items_for_article()   A

Complexity

Conditions 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1.2963

Importance

Changes 0
Metric Value
cc 1
eloc 6
nop 1
dl 0
loc 9
ccs 1
cts 3
cp 0.3333
crap 1.2963
rs 10
c 0
b 0
f 0
1
"""
2
byceps.services.shop.order.ordered_articles_service
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2006-2021 Jochen Kupperschmidt
6
:License: Revised BSD (see `LICENSE` file for details)
7
"""
8
9 1
from __future__ import annotations
10 1
from collections import Counter
11 1
from typing import Sequence
12
13 1
from ....database import db
14
15 1
from ..article.transfer.models import ArticleNumber
16
17 1
from .dbmodels.line_item import LineItem as DbLineItem
18 1
from .service import line_item_to_transfer_object
19 1
from .transfer.models import LineItem, PaymentState
20
21
22 1
def count_ordered_articles(
23
    article_number: ArticleNumber,
24
) -> dict[PaymentState, int]:
25
    """Count how often the article has been ordered, grouped by the
26
    order's payment state.
27
    """
28 1
    line_items = DbLineItem.query \
29
        .filter_by(article_number=article_number) \
30
        .options(
31
            db.joinedload(DbLineItem.order),
32
            db.joinedload(DbLineItem.article),
33
        ) \
34
        .all()
35
36
    # Ensure every payment state is present in the resulting dictionary,
37
    # even if no orders of the corresponding payment state exist for the
38
    # article.
39 1
    counter = Counter({state: 0 for state in PaymentState})
40
41 1
    for line_item in line_items:
42 1
        counter[line_item.order.payment_state] += line_item.quantity
43
44 1
    return dict(counter)
45
46
47 1
def get_line_items_for_article(
48
    article_number: ArticleNumber,
49
) -> Sequence[LineItem]:
50
    """Return all line items for that article."""
51
    line_items = DbLineItem.query \
52
        .filter_by(article_number=article_number) \
53
        .all()
54
55
    return list(map(line_item_to_transfer_object, line_items))
56