Source code for feriennet.exports.booking

from onegov.activity import Activity, Attendee, Booking, Occasion
from onegov.core.security import Secret
from onegov.feriennet import FeriennetApp, _
from onegov.feriennet.forms import PeriodExportForm
from onegov.feriennet.exports.base import FeriennetExport
from onegov.user import User
from sqlalchemy.orm import contains_eager, undefer


from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
    from collections.abc import Iterator
    from onegov.activity.models import Period
    from sqlalchemy.orm import Query, Session


@FeriennetApp.export(
    id='buchungen',
    form_class=PeriodExportForm,
    permission=Secret,
    title=_('Wishlist / Bookings'),
    explanation=_(
        'Exports wishlists or bookings, depending on the '
        'current state of the given period.'
    ),
)
[docs] class BookingExport(FeriennetExport):
[docs] def run( self, form: PeriodExportForm, # type:ignore[override] session: 'Session' ) -> 'Iterator[Iterator[tuple[str, Any]]]': assert form.selected_period is not None self.users = { user.username: user for user in session.query(User).options(undefer('*')) } return self.rows(session, form.selected_period)
[docs] def query(self, session: 'Session', period: 'Period') -> 'Query[Booking]': q = session.query(Booking) q = q.filter(Booking.period_id == period.id) q = q.join(Occasion) q = q.join(Activity) q = q.join(Attendee) q = q.join(User) q = q.options(undefer('*')) q = q.options( contains_eager(Booking.attendee).contains_eager(Attendee.user)) q = q.options( contains_eager(Booking.occasion).contains_eager(Occasion.activity)) q = q.order_by( Activity.order, Occasion.order, Attendee.name, User.username, Booking.priority ) return q
[docs] def rows( self, session: 'Session', period: 'Period' ) -> 'Iterator[Iterator[tuple[str, Any]]]': for booking in self.query(session, period): yield ((k, v) for k, v in self.fields(period, booking))
[docs] def fields( self, period: 'Period', booking: Booking ) -> 'Iterator[tuple[str, Any]]': yield from self.booking_fields(booking) yield from self.activity_fields(booking.occasion.activity) yield from self.occasion_fields(booking.occasion) yield from self.attendee_fields(booking.attendee) yield from self.invoice_attendee_fields(booking.attendee) yield from self.user_fields(booking.attendee.user) yield from self.organiser_fields( self.users[booking.occasion.activity.username])