def handle_new_allocation(self, request, form): """ Handles new allocations for differing form classes. """ if form.submitted(request): scheduler = self.get_scheduler(request.app.libres_context) try: allocations = scheduler.allocate( dates=form.dates, whole_day=form.whole_day, quota=form.quota, quota_limit=form.quota_limit, data=form.data, partly_available=form.partly_available ) except LibresError as e: utils.show_libres_error(e, request) else: request.success(_("Successfully added ${n} allocations", mapping={ 'n': len(allocations) })) self.highlight_allocations(allocations) return morepath.redirect(request.link(self)) elif not request.POST: start, end = utils.parse_fullcalendar_request(request, self.timezone) whole_day = request.params.get('whole_day') == 'yes' if start and end: if whole_day: form.start.data = start form.end.data = end if hasattr(form, 'as_whole_day'): form.as_whole_day.data = 'yes' else: form.start.data = start form.end.data = end if hasattr(form, 'as_whole_day'): form.as_whole_day.data = 'no' if hasattr(form, 'start_time'): form.start_time.data = start form.end_time.data = end layout = ResourceLayout(self, request) layout.breadcrumbs.append(Link(_("New allocation"), '#')) layout.editbar_links = None return { 'layout': layout, 'title': _("New allocation"), 'form': form }
def finalize_reservation(self, request): # this view is public, but only for a limited time assert_anonymous_access_only_temporary(self, request) collection = ResourceCollection(request.app.libres_context) resource = collection.by_id(self.resource) scheduler = resource.get_scheduler(request.app.libres_context) session_id = get_libres_session_id(request) try: scheduler.queries.confirm_reservations_for_session(session_id) scheduler.approve_reservations(self.token) except LibresError as e: utils.show_libres_error(e, request) layout = ReservationLayout(resource, request) layout.breadcrumbs.append(Link(_("Error"), '#')) return { 'title': _("The reservation could not be completed"), 'layout': layout, } else: forms = FormCollection(request.app.session()) submission = forms.submissions.by_id(self.token) if submission: forms.submissions.complete_submission(submission) with forms.session.no_autoflush: ticket = TicketCollection(request.app.session()).open_ticket( handler_code='RSV', handler_id=self.token.hex ) send_html_mail( request=request, template='mail_ticket_opened.pt', subject=_("A ticket has been opened"), receivers=(self.email, ), content={ 'model': ticket } ) request.success(_("Thank you for your reservation!")) request.app.update_ticket_count() return morepath.redirect(request.link(ticket, 'status'))
def handle_edit_reservation(self, request, form): # this view is public, but only for a limited time assert_anonymous_access_only_temporary(self, request) collection = ResourceCollection(request.app.libres_context) resource = collection.by_id(self.resource) if form.submitted(request): scheduler = resource.get_scheduler(request.app.libres_context) try: if self.email != form.email.data: scheduler.change_email(self.token, form.email.data) start, end = form.get_date_range() scheduler.change_reservation( self.token, self.id, start, end, quota=form.data.get('quota') ) except LibresError as e: utils.show_libres_error(e, request) else: forms = FormCollection(request.app.session()) submission = forms.submissions.by_id(self.token) confirm_link = request.link(self, 'bestaetigung') if submission is None: return morepath.redirect(confirm_link) else: return morepath.redirect( get_submission_link(request, submission, confirm_link) ) form.apply_model(self) layout = ReservationLayout(resource, request) layout.breadcrumbs.append(Link(_("Edit Reservation"), '#')) title = _("Change reservation for ${title}", mapping={ 'title': resource.title, }) return { 'layout': layout, 'title': title, 'form': form, 'allocation': self, 'button_text': _("Continue") }
def handle_edit_allocation(self, request, form): """ Handles edit allocation for differing form classes. """ resources = ResourceCollection(request.app.libres_context) resource = resources.by_id(self.resource) if form.submitted(request): scheduler = resource.get_scheduler(request.app.libres_context) new_start, new_end = form.dates try: scheduler.move_allocation( master_id=self.id, new_start=new_start, new_end=new_end, new_quota=form.quota, quota_limit=form.quota_limit ) except LibresError as e: utils.show_libres_error(e, request) else: request.success(_("Your changes were saved")) resource.highlight_allocations([self]) return morepath.redirect(request.link(resource)) elif not request.POST: form.apply_model(self) start, end = utils.parse_fullcalendar_request(request, self.timezone) if start and end: form.apply_dates(start, end) return { 'layout': AllocationEditFormLayout(self, request), 'title': _("Edit allocation"), 'form': form }
def handle_reserve_allocation(self, request, form): """ Creates a new reservation for the given allocation. """ collection = ResourceCollection(request.app.libres_context) resource = collection.by_id(self.resource) if form.submitted(request): start, end = form.get_date_range() try: scheduler = resource.get_scheduler(request.app.libres_context) token = scheduler.reserve( email=form.data['email'], dates=(start, end), quota=int(form.data.get('quota', 1)), session_id=get_libres_session_id(request) ) except LibresError as e: utils.show_libres_error(e, request) else: # while we re at it, remove all expired sessions resource.remove_expired_reservation_sessions( request.app.libres_context) # though it's possible for a token to have multiple reservations, # it is not something that can happen here -> therefore one! reservation = scheduler.reservations_by_token(token).one() confirm_link = request.link(reservation, 'bestaetigung') if not resource.definition: return morepath.redirect(confirm_link) # if extra form data is required, this is the first step. # together with the unconfirmed, session-bound reservation, # we create a new external submission without any data in it. # the user is then redirected to the reservation data edit form # where the reservation is finalized and a ticket is opened. forms = FormCollection(request.app.session()) submission = forms.submissions.add_external( form=resource.form_class(), state='pending', id=reservation.token ) return morepath.redirect( get_submission_link(request, submission, confirm_link) ) layout = ReservationLayout(resource, request) layout.breadcrumbs.append(Link(_("Reserve"), '#')) title = _("New reservation for ${title}", mapping={ 'title': resource.title, }) return { 'layout': layout, 'title': title, 'form': form, 'allocation': self, 'button_text': _("Continue") }