Passed
Push — main ( 52c0ea...0cab68 )
by Jochen
04:36
created

byceps.services.shop.order.actions.ticket_bundle   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 99
Duplicated Lines 0 %

Test Coverage

Coverage 74.19%

Importance

Changes 0
Metric Value
eloc 59
dl 0
loc 99
ccs 23
cts 31
cp 0.7419
rs 10
c 0
b 0
f 0
wmc 6

4 Functions

Rating   Name   Duplication   Size   Complexity  
A _create_revocation_order_log_entry() 0 11 1
A _create_creation_order_log_entry() 0 13 1
A revoke_ticket_bundles() 0 10 2
A create_ticket_bundles() 0 34 2
1
"""
2
byceps.services.shop.order.actions.ticket_bundle
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2006-2022 Jochen Kupperschmidt
6
:License: Revised BSD (see `LICENSE` file for details)
7
"""
8
9 1
from .....typing import UserID
10
11 1
from ....ticketing.dbmodels.ticket_bundle import TicketBundle
12 1
from ....ticketing import (
13
    category_service as ticket_category_service,
14
    ticket_service,
15
    ticket_bundle_service,
16
)
17 1
from ....ticketing.transfer.models import TicketBundleID, TicketCategoryID
18
19 1
from .. import log_service
20 1
from ..transfer.order import Order, OrderID
21
22 1
from ._ticketing import create_tickets_sold_event, send_tickets_sold_event
23
24
25 1
def create_ticket_bundles(
26
    order: Order,
27
    ticket_category_id: TicketCategoryID,
28
    ticket_quantity_per_bundle: int,
29
    bundle_quantity: int,
30
    initiator_id: UserID,
31
) -> None:
32
    """Create ticket bundles."""
33 1
    owned_by_id = order.placed_by_id
34 1
    order_number = order.order_number
35
36 1
    ticket_category = ticket_category_service.get_category(ticket_category_id)
37
38 1
    for _ in range(bundle_quantity):
39 1
        bundle = ticket_bundle_service.create_bundle(
40
            ticket_category.party_id,
41
            ticket_category.id,
42
            ticket_quantity_per_bundle,
43
            owned_by_id,
44
            order_number=order_number,
45
            used_by_id=owned_by_id,
46
        )
47
48 1
        _create_creation_order_log_entry(order.id, bundle)
49
50 1
    total_quantity = ticket_quantity_per_bundle * bundle_quantity
51 1
    tickets_sold_event = create_tickets_sold_event(
52
        order.id,
53
        initiator_id,
54
        ticket_category_id,
55
        owned_by_id,
56
        total_quantity,
57
    )
58 1
    send_tickets_sold_event(tickets_sold_event)
59
60
61 1
def _create_creation_order_log_entry(
62
    order_id: OrderID, ticket_bundle: TicketBundle
63
) -> None:
64 1
    event_type = 'ticket-bundle-created'
65
66 1
    data = {
67
        'ticket_bundle_id': str(ticket_bundle.id),
68
        'ticket_bundle_category_id': str(ticket_bundle.ticket_category_id),
69
        'ticket_bundle_ticket_quantity': ticket_bundle.ticket_quantity,
70
        'ticket_bundle_owner_id': str(ticket_bundle.owned_by_id),
71
    }
72
73 1
    log_service.create_entry(event_type, order_id, data)
74
75
76 1
def revoke_ticket_bundles(order: Order, initiator_id: UserID) -> None:
77
    """Revoke all ticket bundles in this order."""
78
    # Fetch all tickets, bundled or not.
79
    tickets = ticket_service.find_tickets_created_by_order(order.order_number)
80
81
    bundle_ids = {t.bundle_id for t in tickets if t.bundle_id}
82
83
    for bundle_id in bundle_ids:
84
        ticket_bundle_service.revoke_bundle(bundle_id, initiator_id)
85
        _create_revocation_order_log_entry(order.id, bundle_id, initiator_id)
86
87
88 1
def _create_revocation_order_log_entry(
89
    order_id: OrderID, bundle_id: TicketBundleID, initiator_id: UserID
90
) -> None:
91
    event_type = 'ticket-bundle-revoked'
92
93
    data = {
94
        'ticket_bundle_id': str(bundle_id),
95
        'initiator_id': str(initiator_id),
96
    }
97
98
    log_service.create_entry(event_type, order_id, data)
99