def _process(self): reservations = Reservation.find_all(event_id=self.event_id) if not reservations: self._redirect(url_for('event_mgmt.rooms_choose_event', self.event)) return return WPRoomBookingEventBookingList( self, self.event, reservations=reservations).display()
def approve(self, notify_blocker=True): """Approve the room blocking, rejecting all colliding reservations/occurrences.""" self.state = BlockedRoomState.accepted # Get colliding reservations start_dt = datetime.combine(self.blocking.start_date, time()) end_dt = datetime.combine(self.blocking.end_date, time(23, 59, 59)) reservation_criteria = [ Reservation.room_id == self.room_id, ~Reservation.is_rejected, ~Reservation.is_cancelled ] # Whole reservations to reject reservations = Reservation.find_all( Reservation.start_dt >= start_dt, Reservation.end_dt <= end_dt, *reservation_criteria ) # Single occurrences to reject occurrences = ReservationOccurrence.find_all( ReservationOccurrence.start_dt >= start_dt, ReservationOccurrence.end_dt <= end_dt, ReservationOccurrence.is_valid, ~ReservationOccurrence.reservation_id.in_(map(attrgetter('id'), reservations)) if reservations else True, *reservation_criteria, _join=Reservation ) reason = f'Conflict with blocking {self.blocking.id}: {self.blocking.reason}' for reservation in reservations: if self.blocking.can_override(reservation.created_by_user, room=reservation.room): continue reservation.reject(self.blocking.created_by_user, reason) for occurrence in occurrences: reservation = occurrence.reservation if self.blocking.can_override(reservation.created_by_user, room=reservation.room): continue occurrence.reject(self.blocking.created_by_user, reason) if notify_blocker: # We only need to notify the blocking creator if the blocked room wasn't approved yet. # This is the case if it's a new blocking for a room managed by the creator notify_request_response(self)
def approve(self, notify_blocker=True): """Approve the room blocking, rejecting all colliding reservations/occurrences.""" self.state = BlockedRoomState.accepted # Get colliding reservations start_dt = datetime.combine(self.blocking.start_date, time()) end_dt = datetime.combine(self.blocking.end_date, time(23, 59, 59)) reservation_criteria = [ Reservation.room_id == self.room_id, ~Reservation.is_rejected, ~Reservation.is_cancelled ] # Whole reservations to reject reservations = Reservation.find_all( Reservation.start_dt >= start_dt, Reservation.end_dt <= end_dt, *reservation_criteria ) # Single occurrences to reject occurrences = ReservationOccurrence.find_all( ReservationOccurrence.start_dt >= start_dt, ReservationOccurrence.end_dt <= end_dt, ReservationOccurrence.is_valid, ~ReservationOccurrence.reservation_id.in_(map(attrgetter('id'), reservations)) if reservations else True, *reservation_criteria, _join=Reservation ) reason = 'Conflict with blocking {}: {}'.format(self.blocking.id, self.blocking.reason) for reservation in reservations: if self.blocking.can_be_overridden(reservation.created_by_user, reservation.room): continue reservation.reject(self.blocking.created_by_user, reason) for occurrence in occurrences: reservation = occurrence.reservation if self.blocking.can_be_overridden(reservation.created_by_user, reservation.room): continue occurrence.reject(self.blocking.created_by_user, reason) if notify_blocker: # We only need to notify the blocking creator if the blocked room wasn't approved yet. # This is the case if it's a new blocking for a room managed by the creator notify_request_response(self)
def _process(self): reservations = Reservation.find_all(event_id=self.event_id) if not reservations: self._redirect(url_for('event_mgmt.rooms_choose_event', self.event)) return return WPRoomBookingEventBookingList(self, self.event, reservations=reservations).display()