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
|
|
|
|