1
|
|
|
""" |
2
|
|
|
byceps.services.seating.seating_area_tickets_service |
3
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
4
|
|
|
|
5
|
|
|
:Copyright: 2014-2023 Jochen Kupperschmidt |
6
|
|
|
:License: Revised BSD (see `LICENSE` file for details) |
7
|
|
|
""" |
8
|
|
|
|
9
|
1 |
|
from dataclasses import dataclass |
10
|
1 |
|
from itertools import chain |
11
|
1 |
|
from typing import Iterable, Iterator, Optional |
12
|
|
|
|
13
|
1 |
|
from ...typing import UserID |
14
|
|
|
|
15
|
1 |
|
from ..ticketing.dbmodels.ticket import DbTicket |
16
|
1 |
|
from ..ticketing.models.ticket import TicketCode, TicketID |
17
|
1 |
|
from ..user.models.user import User |
18
|
1 |
|
from ..user import user_service |
19
|
|
|
|
20
|
1 |
|
from .models import Seat |
21
|
|
|
|
22
|
|
|
|
23
|
1 |
|
@dataclass(frozen=True) |
24
|
1 |
|
class SeatTicket: |
25
|
1 |
|
id: TicketID |
26
|
1 |
|
code: TicketCode |
27
|
1 |
|
category_label: str |
28
|
1 |
|
user: Optional[User] |
29
|
|
|
|
30
|
|
|
|
31
|
1 |
|
def get_users( |
32
|
|
|
seats_with_tickets: Iterable[tuple[Seat, DbTicket]], |
33
|
|
|
managed_tickets: Iterable[DbTicket], |
34
|
|
|
) -> dict[UserID, User]: |
35
|
|
|
seat_tickets = _get_seat_tickets(seats_with_tickets) |
36
|
|
|
tickets = chain(seat_tickets, managed_tickets) |
37
|
|
|
|
38
|
|
|
return _get_ticket_users_by_id(tickets) |
39
|
|
|
|
40
|
|
|
|
41
|
1 |
|
def _get_seat_tickets( |
42
|
|
|
seats_with_tickets: Iterable[tuple[Seat, DbTicket]] |
43
|
|
|
) -> Iterator[DbTicket]: |
44
|
|
|
for seat, ticket in seats_with_tickets: |
45
|
|
|
if (ticket is not None) and (ticket.used_by_id is not None): |
46
|
|
|
yield ticket |
47
|
|
|
|
48
|
|
|
|
49
|
1 |
|
def _get_ticket_users_by_id(tickets: Iterable[DbTicket]) -> dict[UserID, User]: |
50
|
|
|
user_ids = set(_get_ticket_user_ids(tickets)) |
51
|
|
|
users = user_service.get_users(user_ids, include_avatars=True) |
52
|
|
|
return user_service.index_users_by_id(users) |
53
|
|
|
|
54
|
|
|
|
55
|
1 |
|
def _get_ticket_user_ids(tickets: Iterable[DbTicket]) -> Iterator[UserID]: |
56
|
|
|
for ticket in tickets: |
57
|
|
|
user_id = ticket.used_by_id |
58
|
|
|
if user_id is not None: |
59
|
|
|
yield user_id |
60
|
|
|
|
61
|
|
|
|
62
|
1 |
|
def get_seats_and_tickets( |
63
|
|
|
seats_with_tickets: Iterable[tuple[Seat, DbTicket]], |
64
|
|
|
users_by_id: dict[UserID, User], |
65
|
|
|
) -> Iterator[tuple[Seat, Optional[SeatTicket]]]: |
66
|
|
|
for seat, ticket in seats_with_tickets: |
67
|
|
|
if ticket is not None: |
68
|
|
|
seat_ticket = _build_seat_ticket(ticket, users_by_id) |
69
|
|
|
else: |
70
|
|
|
seat_ticket = None |
71
|
|
|
|
72
|
|
|
yield seat, seat_ticket |
73
|
|
|
|
74
|
|
|
|
75
|
1 |
|
def get_managed_tickets( |
76
|
|
|
tickets: Iterable[DbTicket], users_by_id: dict[UserID, User] |
77
|
|
|
) -> Iterator[tuple[SeatTicket, bool, Optional[str]]]: |
78
|
|
|
for ticket in tickets: |
79
|
|
|
managed_ticket = _build_seat_ticket(ticket, users_by_id) |
80
|
|
|
occupies_seat = ticket.occupied_seat_id is not None |
81
|
|
|
seat_label = ticket.occupied_seat.label if occupies_seat else None |
82
|
|
|
|
83
|
|
|
yield managed_ticket, occupies_seat, seat_label |
84
|
|
|
|
85
|
|
|
|
86
|
1 |
|
def _build_seat_ticket( |
87
|
|
|
ticket: DbTicket, users_by_id: dict[UserID, User] |
88
|
|
|
) -> SeatTicket: |
89
|
|
|
user: Optional[User] |
90
|
|
|
if ticket.used_by_id is not None: |
91
|
|
|
user = users_by_id[ticket.used_by_id] |
92
|
|
|
else: |
93
|
|
|
user = None |
94
|
|
|
|
95
|
|
|
return SeatTicket( |
96
|
|
|
id=ticket.id, |
97
|
|
|
code=ticket.code, |
98
|
|
|
category_label=ticket.category.title, |
99
|
|
|
user=user, |
100
|
|
|
) |
101
|
|
|
|