def search_tables(start_moment: datetime, end_moment: datetime, seat_count: int, tolerance=timedelta(minutes=30)) \
        -> FINQ[Table]:
    # if existing booking intersects with search more than in 30 minutes, then this table is dropped
    return FINQ(db.session.query(Table)) \
        .filter(lambda t: t.seat_count >= seat_count) \
        .filter(lambda t: FINQ(t.bookings)
                .filter(lambda b: datetime_segment_intersection(start_moment, end_moment, b.booking_start_datetime,
                                                                b.booking_end_datetime) > tolerance)
                .none())
Exemple #2
0
def search_all_tables():
    start = datetime.strptime(request.args["startDatetime"], DATEFORMAT)
    end = datetime.strptime(request.args["endDatetime"], DATEFORMAT)
    seat_count = int(request.args["seatsCount"])

    return {
        Fields.Restaurants.value:
        DatabaseController.search_all_tables(start, end, seat_count).group_by(
            lambda t: t[0].restaurant_id).map(lambda l: FINQ(l).map(lambda t: (
                t[0].restaurant_id, zip_table(t))).self(extract_key)).
        map(lambda kl: (DatabaseController.get_restaurant(kl[0]), kl[1])).map(
            zip_restaurant).to_list()
    }
Exemple #3
0
def get_table_with_bookings(table, start: datetime, end: datetime):
    return quote_fields({
        Fields.Id:
        table.id,
        Fields.SeatCount:
        table.seat_count,
        Fields.TableNumber:
        table.table_number,
        Fields.RestaurantId:
        table.restaurant_id,
        Fields.Bookings:
        FINQ(table.bookings).filter(
            datetime_segment_day_intersections(
                start, end)).map(lambda b: b.id).map(get_booking).to_list()
    })
Exemple #4
0
def get_table_bookings(restaurant_identifier, table_number):
    table = DatabaseController.get_table_from_number_and_restaurant(
        table_number, restaurant_identifier)

    if table:
        return quote_fields({
            Fields.Success:
            True,
            Fields.Bookings:
            FINQ(
                table.bookings).map(lambda b: b.id).map(get_booking).to_list()
        })
    else:
        return quote_fields({
            Fields.Success: False,
            Fields.Error: Errors.NoTable
        })
Exemple #5
0
def get_tables_at_restaurant(identifier):
    return FINQ(DatabaseController.get_restaurant(identifier).tables) \
        .map(get_table) \
        .to_dict(lambda d: d[Fields.Id.value], Identity)
Exemple #6
0
def get_tables():
    return FINQ(DatabaseController.get_tables()) \
        .map(get_table) \
        .to_dict(lambda d: d[Fields.Id.value], Identity)
def search_all_tables(start_moment: datetime, end_moment: datetime, seat_count: int, tolerance=timedelta(minutes=30)) \
        -> FINQ[Tuple[Table, List[Booking]]]:
    # if existing booking intersects with search more than in 30 minutes, then this table is dropped
    return FINQ(db.session.query(Table)) \
        .filter(lambda t: t.seat_count >= seat_count) \
        .map(lambda t: (t, FINQ(t.bookings).filter(datetime_segment_day_intersections(start_moment, end_moment))))
def booking_intersects_others(table, start_time, end_time) -> bool:
    return FINQ(table.bookings) \
        .filter(datetime_segment_day_intersections(start_time, end_time)) \
        .filter(lambda b: datetime_segment_intersection(start_time, end_time, b.booking_start_datetime,
                                                        b.booking_end_datetime).microseconds > 0).any()