def create_reservation():
    data = request.get_json() or {}

    error = Reservation.check_data(data=data, new=True)
    if 'user_id' in data and data['user_id'] is not None and \
            User.query.get(data['user_id']) is None:
        error = 'usuário não existe'
    if 'thirdparty_id' in data and data['thirdparty_id'] is not None and \
            Thirdparty.query.get(data['thirdparty_id']) is None:
        error = 'terceiro não existe'
    if Reservation.query.filter(
            Reservation.date_start >= data['date_start']).filter(
                Reservation.date_start <= data['date_end']).all(
                ) or Reservation.query.filter(
                    Reservation.date_end >= data['date_start']).filter(
                        Reservation.date_end <= data['date_end']).all():
        error = 'já existe um evento nesse período'

    if error:
        return bad_request(error)

    reservation = Reservation()
    reservation.from_dict(data)

    try:
        db.session.add(reservation)
        db.session.commit()
    except Exception:
        return internal_server()

    return jsonify(reservation.to_dict()), 201
예제 #2
0
def create_reservation():
    data = request.get_json() or {}
    u_id = g.current_user.id
    if 'listingId' not in data:
        return bad_request('Must include listing ID')
    data['user_id'] = u_id
    reservation = Reservation()
    reservation.from_dict(data)
    db.session.add(reservation)

    # block the date
    check_in_date = reservation.check_in_date
    check_out_date = reservation.check_out_date
    # check not continuously dates
    listingDates = ListingDate.query.filter_by(
        listing_id=reservation.listing_id).filter(
            ListingDate.date <= check_out_date).filter(
                ListingDate.date >= check_in_date).all()
    if len(listingDates) > 0:
        return error_response(202, 'Please choose a continuous dates range')
    # serve the date
    date_generated = [
        check_in_date + timedelta(days=x)
        for x in range(0, (check_out_date - check_in_date).days + 1)
    ]
    for gen_d in date_generated:
        print(gen_d.strftime('%d/%m/%Y'))
        listingDate = ListingDate()
        listingDate.listing_id = data['listingId']
        listingDate.date = gen_d
        listingDate.date_type = 'reserved'
        db.session.add(listingDate)

    db.session.commit()
    response = jsonify(reservation.to_dict())
    response.status_code = 201
    return response
예제 #3
0
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('guest_id',
                            type=int,
                            required=True,
                            help='guest_id cannot be blank.')
        parser.add_argument('accommodation_id',
                            type=int,
                            required=True,
                            help='accommodation_id cannot be blank.')
        parser.add_argument('num_guests',
                            type=int,
                            required=True,
                            help='num_guests cannot be blank.')
        parser.add_argument('check_in', required=True, type=DateType)
        parser.add_argument('check_out', required=True, type=DateType)
        parser.add_argument('token', required=True, help='Token required.')
        args = parser.parse_args()

        user = User.check_token(args.token)
        if not user:
            return {
                'msg': 'You must be logged in to create a reservation.'
            }, 401

        acc = Accommodation.query.filter(
            (Accommodation.id == args.accommodation_id)
            & (Accommodation.is_deleted == False)).first()

        if not acc:
            return {
                'msg':
                'Reservation could not be made as the accommodation does not exist'
            }, 404

        # ensure check out is after check in
        if datetime.strptime(args.check_in, '%Y-%m-%d') >= datetime.strptime(
                args.check_out, '%Y-%m-%d'):
            return {'msg': 'check in date must be before check out date'}, 400

        # use accommodation_id to find all reservations that conflict with given checkin/out dates
        # TODO: need to consider reservation status as well
        reservations = Reservation.query.filter(
            (Reservation.accommodation_id == args.accommodation_id)
            & ((Reservation.check_in_date < args.check_out)
               & (Reservation.check_out_date > args.check_in))).all()

        if len(reservations):
            return {'msg': 'Reservation not available for these dates'}, 400

        # check that num_guests is <= acc's num_guests
        acc = Accommodation.query.filter_by(id=args.accommodation_id).first()
        if acc.num_guests < args.num_guests:
            return {
                'msg': 'num_guests is too many for this accommodation'
            }, 400

        # create new reservation for given guest_id and dates
        new_res = Reservation(accommodation_id=args.accommodation_id,
                              guest_id=args.guest_id,
                              check_in_date=args.check_in,
                              check_out_date=args.check_out,
                              status='booked')

        db.session.add(new_res)
        db.session.commit()
        return {'msg': new_res.to_dict()}, 201