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