def create_from_data(cls, room, data, user, prebook=None, ignore_admin=False): """Creates a new reservation. :param room: The Room that's being booked. :param data: A dict containing the booking data, usually from a :class:`NewBookingConfirmForm` instance :param user: The :class:`.User` who creates the booking. :param prebook: Instead of determining the booking type from the user's permissions, always use the given mode. """ populate_fields = ('start_dt', 'end_dt', 'repeat_frequency', 'repeat_interval', 'room_id', 'contact_email', 'contact_phone', 'booking_reason', 'needs_assistance', 'uses_vc', 'needs_vc_assistance') if data['repeat_frequency'] == RepeatFrequency.NEVER and data[ 'start_dt'].date() != data['end_dt'].date(): raise ValueError('end_dt != start_dt for non-repeating booking') if prebook is None: prebook = not room.can_book(user, allow_admin=(not ignore_admin)) if prebook and not room.can_prebook( user, allow_admin=(not ignore_admin)): raise NoReportError(u'You cannot book this room') room.check_advance_days(data['end_dt'].date(), user) room.check_bookable_hours(data['start_dt'].time(), data['end_dt'].time(), user) reservation = cls() for field in populate_fields: if field in data: setattr(reservation, field, data[field]) reservation.room = room # if 'room_usage' is not specified, we'll take whatever is passed in 'booked_for_user' reservation.booked_for_user = data['booked_for_user'] if data.get( 'room_usage') != 'current_user' else user reservation.booked_for_name = reservation.booked_for_user.full_name reservation.state = ReservationState.pending if prebook else ReservationState.accepted reservation.created_by_user = user reservation.create_occurrences(True) if not any(occ.is_valid for occ in reservation.occurrences): raise NoReportError(_(u'Reservation has no valid occurrences')) db.session.flush() signals.rb.booking_created.send(reservation) notify_creation(reservation) return reservation
def create_from_data(cls, room, data, user, prebook=None): """Creates a new reservation. :param room: The Room that's being booked. :param data: A dict containing the booking data, usually from a :class:`NewBookingConfirmForm` instance :param user: The :class:`.User` who creates the booking. :param prebook: Instead of determining the booking type from the user's permissions, always use the given mode. """ populate_fields = ( "start_dt", "end_dt", "repeat_frequency", "repeat_interval", "room_id", "booked_for_user", "contact_email", "contact_phone", "booking_reason", "used_equipment", "needs_assistance", "uses_vc", "needs_vc_assistance", ) if data["repeat_frequency"] == RepeatFrequency.NEVER and data["start_dt"].date() != data["end_dt"].date(): raise ValueError("end_dt != start_dt for non-repeating booking") if prebook is None: prebook = not room.can_be_booked(user) if prebook and not room.can_be_prebooked(user): raise NoReportError("You cannot book this room") room.check_advance_days(data["end_dt"].date(), user) room.check_bookable_hours(data["start_dt"].time(), data["end_dt"].time(), user) reservation = cls() for field in populate_fields: if field in data: setattr(reservation, field, data[field]) reservation.room = room reservation.booked_for_name = reservation.booked_for_user.full_name reservation.is_accepted = not prebook reservation.created_by_user = user reservation.create_occurrences(True) if not any(occ.is_valid for occ in reservation.occurrences): raise NoReportError(_("Reservation has no valid occurrences")) notify_creation(reservation) return reservation
def create_from_data(cls, room, data, user, prebook=None): """Creates a new reservation. :param room: The Room that's being booked. :param data: A dict containing the booking data, usually from a :class:`NewBookingConfirmForm` instance :param user: The :class:`Avatar` who creates the booking. :param prebook: Instead of determining the booking type from the user's permissions, always use the given mode. """ populate_fields = ('start_dt', 'end_dt', 'repeat_frequency', 'repeat_interval', 'room_id', 'booked_for_id', 'contact_email', 'contact_phone', 'booking_reason', 'used_equipment', 'needs_assistance', 'uses_vc', 'needs_vc_assistance') if data['repeat_frequency'] == RepeatFrequency.NEVER and data[ 'start_dt'].date() != data['end_dt'].date(): raise ValueError('end_dt != start_dt for non-repeating booking') if prebook is None: prebook = not room.can_be_booked(user) if prebook and not room.can_be_prebooked(user): raise NoReportError('You cannot book this room') room.check_advance_days(data['end_dt'].date(), user) room.check_bookable_hours(data['start_dt'].time(), data['end_dt'].time(), user) reservation = cls() for field in populate_fields: if field in data: setattr(reservation, field, data[field]) reservation.room = room reservation.booked_for_name = reservation.booked_for_user.getFullName() reservation.is_accepted = not prebook reservation.created_by_user = user reservation.create_occurrences(True) if not any(occ.is_valid for occ in reservation.occurrences): raise NoReportError(_('Reservation has no valid occurrences')) notify_creation(reservation) return reservation
def create_from_data(cls, room, data, user, prebook=None): """Creates a new reservation. :param room: The Room that's being booked. :param data: A dict containing the booking data, usually from a :class:`NewBookingConfirmForm` instance :param user: The :class:`.User` who creates the booking. :param prebook: Instead of determining the booking type from the user's permissions, always use the given mode. """ populate_fields = ('start_dt', 'end_dt', 'repeat_frequency', 'repeat_interval', 'room_id', 'contact_email', 'contact_phone', 'booking_reason', 'used_equipment', 'needs_assistance', 'uses_vc', 'needs_vc_assistance') if data['repeat_frequency'] == RepeatFrequency.NEVER and data['start_dt'].date() != data['end_dt'].date(): raise ValueError('end_dt != start_dt for non-repeating booking') if prebook is None: prebook = not room.can_be_booked(user) if prebook and not room.can_be_prebooked(user): raise NoReportError(u'You cannot book this room') room.check_advance_days(data['end_dt'].date(), user) room.check_bookable_hours(data['start_dt'].time(), data['end_dt'].time(), user) reservation = cls() for field in populate_fields: if field in data: setattr(reservation, field, data[field]) reservation.room = room # if 'room_usage' is not specified, we'll take whatever is passed in 'booked_for_user' reservation.booked_for_user = data['booked_for_user'] if data.get('room_usage') != 'current_user' else user reservation.booked_for_name = reservation.booked_for_user.full_name reservation.is_accepted = not prebook reservation.created_by_user = user reservation.create_occurrences(True) if not any(occ.is_valid for occ in reservation.occurrences): raise NoReportError(_(u'Reservation has no valid occurrences')) notify_creation(reservation) return reservation