def create():
    req_data = request.get_json()
    try:
        data = rentableitem_schema.load(req_data)
    except marshmallow.exceptions.ValidationError as e:
        return custom_response(e.messages, 401)

    rentableitem = RentableItemModel(data)

    user_in_db = UserModel.get_user_by_name(data.get('owner_name'))

    if not user_in_db:
        message = {
            'error': 'User does not exists exist, please supply another name'
        }
        return custom_response(message, 400)

    if rentableitem.category not in RentableItemModel.categoryTypes:
        message = {
            'error':
            'Category does not exists exist, please supply another category'
        }
        return custom_response(message, 400)

    rentableitem.owner_id = user_in_db.id
    rentableitem.owner = user_in_db
    rentableitem.owner_name = user_in_db.name
    rentableitem.rented = False
    rentableitem.save()

    ser_rentableitem = rentableitem_schema.dump(rentableitem)
    return custom_response(ser_rentableitem, 200)
def get_a_rentableitem(rentableitem_id):
    rentableitem = RentableItemModel.get_rentableitem_by_id(rentableitem_id)
    if not rentableitem:
        return custom_response({'error': 'rentable item not found'}, 404)

    ser_rentableitem = rentableitem_schema.dump(rentableitem)
    return custom_response(ser_rentableitem, 200)
def return_item(rentableitem_id):
    rentableitem = RentableItemModel.get_rentableitem_by_id(rentableitem_id)
    if not rentableitem:
        return custom_response({'error': 'rentable item not found'}, 404)
    rentableitem.rented = False
    db.session.commit()
    return custom_response("return succes", 200)
def delete(rentableitem_id):
    rentableitem = RentableItemModel.get_rentableitem_by_id(rentableitem_id)
    if not rentableitem:
        return custom_response({'error': 'rentable item not found'}, 404)
    reviews_to_be_deleted = ReviewItemModel.get_all_reviews_with_rentableitem_id(
        rentableitem.id)
    for r in reviews_to_be_deleted:
        r.delete()
    rentableitem.delete()
    return custom_response("delete succes", 200)
def get_all_by_category(category):
    if category not in RentableItemModel.categoryTypes:
        message = {
            'error':
            'Category does not exists exist, please supply another category'
        }
        return custom_response(message, 400)

    rentableitems = RentableItemModel.get_all_by_category(category)
    ri = RentableItems(rentableitems)
    ser_rentableitems = rentableitems_schema.dump(ri)
    response = custom_response(ser_rentableitems, 200)
    return response
def get_all_reviewitems_of_user(rentableitem_id):
    rentableitem = RentableItemModel.get_rentableitem_by_id(rentableitem_id)

    if not rentableitem:
        message = {
            'error':
            'Rentable item does not exists exist, please supply another id'
        }
        return custom_response(message, 400)

    reviewitems = rentableitem.reviews
    ri = ReviewItems(reviewitems)
    ser_reviewitems = reviewitems_schema.dump(ri)
    response = custom_response(ser_reviewitems, 200)
    return response
def downloadimage(rentableitem_id):
    rentableitem = RentableItemModel.get_rentableitem_by_id(rentableitem_id)
    if not rentableitem:
        return custom_response({'error': 'rentable item not found'}, 404)
    if rentableitem.photo_name is None or rentableitem.photo_name == '':
        return custom_response(
            {'error': 'rentable item does not have a photo'}, 404)
    if os.path.isfile(
            os.path.join(os.getcwd(), 'photos',
                         rentableitem.photo_name)) is False:
        rentableitem.photo_name = ''
        db.session.commit()
        return custom_response(
            {'error': 'rentable item does not have a photo'}, 404)
    return send_file(os.path.join(os.getcwd(), 'photos',
                                  rentableitem.photo_name),
                     as_attachment=True)
def rent_item(rentableitem_id):
    req_data = request.get_json()
    data = rentperiod_schema.load(req_data)
    start_date = data.get("start_date")
    end_date = data.get("end_date")
    name = data.get("user_name")

    user = UserModel.get_user_by_name(name)

    if not user:
        message = {
            'error': 'User does not exists exist, please supply another name'
        }
        return custom_response(message, 400)
    rentableitem = RentableItemModel.get_rentableitem_by_id(rentableitem_id)

    if not rentableitem:
        return custom_response({'error': 'rentable item not found'}, 404)

    periods_of_rental_of_current_item = RentPeriodModel.get_all_rent_periods_with_rentableitem_id(
        rentableitem.id)
    for period_of_rental in periods_of_rental_of_current_item:
        if start_date < period_of_rental.end_date and end_date > period_of_rental.start_date:
            return custom_response(
                {'error': 'the item is already rented in that period'}, 404)

    if not (start_date >= rentableitem.available_start_date
            and end_date <= rentableitem.available_end_date):
        return custom_response(
            {'error': 'the owner does not rent the item in that period'}, 404)

    rent_period = RentPeriodModel(data)
    rent_period.rentableitem = rentableitem
    rent_period.rentableitem_id = rentableitem.id
    rent_period.save()

    rentableitem.rented = True
    db.session.commit()
    return custom_response("rent succes", 200)
def uploadimage(rentableitem_id):
    rentableitem = RentableItemModel.get_rentableitem_by_id(rentableitem_id)
    if not rentableitem:
        return custom_response({'error': 'rentable item not found'}, 404)
    file = request.files['pic']
    filename = file.filename
    if rentableitem.photo_name is None or rentableitem.photo_name == '':
        rentableitem.photo_name = filename
        db.session.commit()
        file.save(os.path.join(os.getcwd(), 'photos', filename))
        return custom_response("upload succes", 200)
    else:
        if os.path.isfile(
                os.path.join(os.getcwd(), 'photos',
                             rentableitem.photo_name)) is True:
            return custom_response("this rentable item has already a photo",
                                   404)
        else:
            rentableitem.photo_name = filename
            db.session.commit()
            file.save(os.path.join(os.getcwd(), 'photos', filename))
            return custom_response("upload succes", 200)
def create():
    req_data = request.get_json()

    data = review_schema.load(req_data)

    review = ReviewItemModel(data)

    if not (1 <= review.rating <= 5):
        message = {'error': 'Rating must be between 1 and 5'}
        return custom_response(message, 400)

    user_in_db = UserModel.get_user_by_name(data.get('owner_name'))
    rentableitem_in_db = RentableItemModel.get_rentableitem_by_id(
        data.get('rentableitem_id'))

    if not user_in_db:
        message = {
            'error': 'User does not exists exist, please supply another name'
        }
        return custom_response(message, 400)

    if not rentableitem_in_db:
        message = {
            'error':
            'Rentable item does not exists exist, please supply another id'
        }
        return custom_response(message, 401)

    review.owner_id = user_in_db.id
    review.owner = user_in_db
    review.owner_name = user_in_db.name
    review.rentableitem = rentableitem_in_db
    review.rentableitem_id = rentableitem_in_db.id

    review.save()

    ser_review = review_schema.dump(review)
    return custom_response(ser_review, 200)
def get_all_like_name(name):
    rentableitems = RentableItemModel.get_all_like_name(name)
    ri = RentableItems(rentableitems)
    ser_rentableitems = rentableitems_schema.dump(ri)
    response = custom_response(ser_rentableitems, 200)
    return response