byceps/byceps

View on GitHub
scripts/occupy_seat_group.py

Summary

Maintainability
A
0 mins
Test Coverage
#!/usr/bin/env python

"""Occupy a seat group with a ticket bundle.

:Copyright: 2014-2024 Jochen Kupperschmidt
:License: Revised BSD (see `LICENSE` file for details)
"""

from uuid import UUID

from _util import call_with_app_context
import click

from byceps.services.seating import seat_group_service
from byceps.services.seating.dbmodels.seat_group import DbSeatGroup
from byceps.services.seating.models import SeatGroupID
from byceps.services.ticketing import ticket_bundle_service
from byceps.services.ticketing.dbmodels.ticket_bundle import DbTicketBundle
from byceps.services.ticketing.models.ticket import TicketBundleID


def validate_seat_group(ctx, param, seat_group_id_value: str) -> DbSeatGroup:
    try:
        seat_group_id = SeatGroupID(UUID(seat_group_id_value))
    except ValueError as exc:
        raise click.BadParameter(
            f'Invalid seat group ID "{seat_group_id_value}": {exc}'
        ) from exc

    seat_group = seat_group_service.find_seat_group(seat_group_id)

    if not seat_group:
        raise click.BadParameter(f'Unknown seat group ID "{seat_group_id}".')

    return seat_group


def validate_ticket_bundle(
    ctx, param, ticket_bundle_id_value: str
) -> DbTicketBundle:
    try:
        ticket_bundle_id = TicketBundleID(UUID(ticket_bundle_id_value))
    except ValueError as exc:
        raise click.BadParameter(
            f'Invalid ticket bundle ID "{ticket_bundle_id_value}": {exc}'
        ) from exc

    ticket_bundle = ticket_bundle_service.find_bundle(ticket_bundle_id)

    if not ticket_bundle:
        raise click.BadParameter(
            f'Unknown ticket bundle ID "{ticket_bundle_id}".'
        )

    return ticket_bundle


@click.command()
@click.argument('seat_group', callback=validate_seat_group)
@click.argument('ticket_bundle', callback=validate_ticket_bundle)
def execute(seat_group, ticket_bundle) -> None:
    seat_group_service.occupy_seat_group(seat_group, ticket_bundle)

    click.secho('Done.', fg='green')


if __name__ == '__main__':
    call_with_app_context(execute)