Passed
Push — main ( fafd4d...2bc15d )
by Jochen
06:53
created

get_managed_tickets()   A

Complexity

Conditions 3

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 8.2077

Importance

Changes 0
Metric Value
cc 3
eloc 7
nop 2
dl 0
loc 9
ccs 1
cts 6
cp 0.1666
crap 8.2077
rs 10
c 0
b 0
f 0
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