from __future__ import annotations
from onegov.activity import (ActivityInvoiceItem, Attendee, AttendeeCollection,
BookingCollection)
from onegov.core.security import Personal
from onegov.feriennet import FeriennetApp, _
from onegov.feriennet.forms import AttendeeForm, AttendeeLimitForm
from onegov.feriennet.layout import BookingCollectionLayout
from onegov.org.elements import Link
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from onegov.core.types import RenderData
from onegov.feriennet.request import FeriennetRequest
from webob import Response
@FeriennetApp.form(
model=Attendee,
form=AttendeeForm,
permission=Personal,
template='form.pt')
[docs]
def edit_attendee(
self: Attendee,
request: FeriennetRequest,
form: AttendeeForm
) -> RenderData | Response:
# note: attendees are added in the views/occasion.py file
assert request.is_admin or self.username == request.current_username
bookings = BookingCollection(request.session)
bookings = bookings.for_username(self.username)
if form.submitted(request):
form.populate_obj(self)
request.success(_('Your changes were saved'))
return request.redirect(request.link(bookings))
elif not request.POST:
form.process(obj=self)
title = _('Edit Attendee')
layout = BookingCollectionLayout(bookings, request, self.user)
layout.breadcrumbs.append(Link(title, request.link(self)))
layout.edit_mode = True
return {
'form': form,
'layout': layout,
'title': title,
}
@FeriennetApp.form(
model=Attendee,
form=AttendeeLimitForm,
name='limit',
permission=Personal,
template='form.pt')
[docs]
def edit_attendee_limit(
self: Attendee,
request: FeriennetRequest,
form: AttendeeLimitForm
) -> RenderData | Response:
assert request.is_admin or self.username == request.current_username
bookings = BookingCollection(request.session)
bookings = bookings.for_username(self.username)
if form.submitted(request):
form.populate_obj(self)
request.success(_('Your changes were saved'))
return request.redirect(request.link(bookings))
elif not request.POST:
form.process(obj=self)
title = _('Booking Limit of ${name}', mapping={
'name': self.name
})
layout = BookingCollectionLayout(bookings, request, self.user)
layout.breadcrumbs.append(Link(title, request.link(self)))
layout.edit_mode = True
return {
'form': form,
'layout': layout,
'title': title,
}
@FeriennetApp.view(
model=Attendee,
permission=Personal,
request_method='DELETE')
[docs]
def delete_attendee(
self: Attendee,
request: FeriennetRequest
) -> None:
request.assert_valid_csrf_token()
attendees = AttendeeCollection(
request.session
)
deletion_possible = True
collection = BookingCollection(request.session)
bookings_to_delete = []
for booking in self.bookings:
if request.app.active_period and (
booking.period.id == request.app.active_period.id
):
deletion_possible = False
else:
bookings_to_delete.append(booking)
if deletion_possible:
for booking in bookings_to_delete:
collection.delete(booking)
invoice_items = request.session.query(ActivityInvoiceItem).filter(
ActivityInvoiceItem.attendee_id == self.id)
for item in invoice_items:
item.attendee_id = None
attendees.delete(self)
name = self.name
request.success(_(
'${name} and associated bookings were deleted.',
mapping={
'name': name
}
))
else:
request.alert(_(
'The attendee cannot be deleted because there are '
'existing bookings in the current period.'))
request.redirect(request.class_link(BookingCollection))