def _process(self, args): filter_availability = all(x in args for x in ('start_dt', 'end_dt', 'repeat_frequency', 'repeat_interval')) only_unavailable = args.pop('unavailable') if not filter_availability: availability = None if only_unavailable: raise UnprocessableEntity( 'Required data to filter by availability is not present') else: availability = not only_unavailable search_query = search_for_rooms(args, availability=availability) room_ids = [id_ for id_, in search_query.with_entities(Room.id)] if filter_availability: room_ids_without_availability_filter = [ id_ for id_, in search_for_rooms(args).with_entities(Room.id) ] else: room_ids_without_availability_filter = room_ids return jsonify(rooms=room_ids, rooms_without_availability_filter= room_ids_without_availability_filter, total=len(room_ids_without_availability_filter), availability_days=self._get_date_range(args))
def _process(self, args): filter_availability = all(x in args for x in ('start_dt', 'end_dt', 'repeat_frequency', 'repeat_interval')) only_unavailable = args.pop('unavailable') if not filter_availability: availability = None if only_unavailable: raise UnprocessableEntity('Required data to filter by availability is not present') else: availability = not only_unavailable search_query = search_for_rooms(args, availability=availability) room_ids = [id_ for id_, in search_query.with_entities(Room.id)] total = len(room_ids) if not filter_availability else search_for_rooms(args).count() return jsonify(rooms=room_ids, total=total, availability_days=self._get_date_range(args))
def _process(self, args): query = search_for_rooms(args, availability=not args['unavailable']) if 'limit' in args: query = query.limit(args.pop('limit')) rooms = query.all() if 'additional_room_ids' in args: rooms.extend( Room.query.filter(Room.is_active, Room.id.in_( args.pop('additional_room_ids')))) date_range, availability = get_rooms_availability( rooms, args['start_dt'], args['end_dt'], args['repeat_frequency'], args['repeat_interval'], flexibility=0) date_range = [dt.isoformat() for dt in date_range] for data in availability.viewvalues(): # add additional helpful attributes data.update({ 'num_days_available': len(date_range) - len(data['conflicts']), 'all_days_available': not data['conflicts'] }) serialized = _serialize_availability(availability) return jsonify_data(flash=False, availability=serialized.items(), date_range=date_range)
def get_suggestions(filters, limit=None): blocked_rooms = get_blocked_rooms(filters['start_dt'], filters['end_dt'], [BlockedRoomState.accepted]) rooms = [room for room in search_for_rooms(filters, False) if room not in blocked_rooms] if filters['repeat_frequency'] == RepeatFrequency.NEVER: suggestions = sort_suggestions(get_single_booking_suggestions(rooms, filters['start_dt'], filters['end_dt'], limit=limit)) else: suggestions = get_number_of_skipped_days_for_rooms(rooms, filters['start_dt'], filters['end_dt'], filters['repeat_frequency'], filters['repeat_interval'], limit=limit) for entry in suggestions: entry['room_id'] = entry.pop('room').id return suggestions
def _process(self, args): filter_availability = all(x in args for x in ('start_dt', 'end_dt', 'repeat_frequency', 'repeat_interval')) only_unavailable = args.pop('unavailable') admin_override_enabled = args.pop('admin_override_enabled') if not filter_availability: availability = None if only_unavailable: raise UnprocessableEntity( 'Required data to filter by availability is not present') else: availability = not only_unavailable search_query = search_for_rooms(args, allow_admin=admin_override_enabled, availability=availability) rooms = [(id_, room_name) for id_, room_name, in search_query.with_entities( Room.id, Room.full_name)] # We can't filter by blocking's acl in the search_query, so we need to adjust the results rooms = self._adjust_blockings(rooms, args, availability) room_ids = [room[0] for room in rooms] if filter_availability: room_ids_without_availability_filter = [ id_ for id_, in search_for_rooms( args, allow_admin=admin_override_enabled).with_entities( Room.id) ] else: room_ids_without_availability_filter = room_ids return jsonify(rooms=room_ids, rooms_without_availability_filter= room_ids_without_availability_filter, total=len(room_ids_without_availability_filter), availability_days=self._get_date_range(args))
def get_suggestions(filters, limit=None): room_filters = {key: value for key, value in filters.iteritems() if key in ('capacity', 'equipment', 'building', 'text', 'floor')} query = search_for_rooms(room_filters) query = query.filter(~Room.filter_available(filters['start_dt'], filters['end_dt'], (filters['repeat_frequency'], filters['repeat_interval']))) rooms = query.all() if filters['repeat_frequency'] == RepeatFrequency.NEVER: return sort_suggestions(get_single_booking_suggestions(rooms, filters['start_dt'], filters['end_dt'], limit=limit)) else: return get_number_of_skipped_days_for_rooms(rooms, filters['start_dt'], filters['end_dt'], filters['repeat_frequency'], filters['repeat_interval'], limit=limit)