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

byceps.services.shop.order.ordered_articles_service   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 56
Duplicated Lines 0 %

Test Coverage

Coverage 88.24%

Importance

Changes 0
Metric Value
eloc 27
dl 0
loc 56
ccs 15
cts 17
cp 0.8824
rs 10
c 0
b 0
f 0
wmc 3

2 Functions

Rating   Name   Duplication   Size   Complexity  
A count_ordered_articles() 0 23 2
A get_line_items_for_article() 0 9 1
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