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
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
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