def post_order(data): user_id = data["user_id"] notes = data['notes'] order_time = data['order_time'] items = data['items'] deliver_to = data['deliver_to'] order_loc = data['order_loc'] food_items = [] user = User.query.filter_by(id=user_id).first() if not user: return {"message": "user id is not found"}, 400 if not items: return {"message": "items must be not null"}, 400 if list(order_loc.keys()) != ['latitude', 'longitude', 'accuracy']: return {"message": "order_loc object is not valid key"}, 400 if type(order_loc['latitude']) != float and type(order_loc['latitude']) != int: return {"message": "latitude of order_loc object is not valid type"}, 400 if type(order_loc['longitude']) != float and type(order_loc['longitude']) != int: return {"message": "longitude of order_loc object is not valid type"}, 400 if type(order_loc['accuracy']) != float and type(order_loc['accuracy']) != int: return {"message": "accuracy of order_loc object is not valid type"}, 400 if list(deliver_to.keys()) != ['latitude', 'longitude', 'accuracy', 'is_pinned']: return {"message": "deliver_to object is not valid key"}, 400 if type(deliver_to['latitude']) != float and type(deliver_to['latitude']) != int: return {"message": "latitude of deliver_to object is not valid type"}, 400 if type(deliver_to['longitude']) != float and type(deliver_to['longitude']) != int: return {"message": "longitude of deliver_to object is not valid type"}, 400 if type(deliver_to['accuracy']) != float and type(deliver_to['accuracy']) != int: return {"message": "accuracy of deliver_to object is not valid type"}, 400 if type(deliver_to['is_pinned']) != bool: return {"message": "is_pinned of deliver_to object is not valid type"}, 400 for item in items: if "id" and "qty" not in item.keys(): return {"message": "item must have id and qty"}, 400 if int != type(item["id"]): return {"message": "id of item should be integer"}, 400 if int != type(item["qty"]): return {"message": "qty of item should be integer"}, 400 food = Food.query.get(item["id"]) if not food: return {"message": "food id={} is not found".format(item["id"])}, 400 if food.stock < item["qty"]: return {"message": "stock not enough for {}, avalaible {} ".format(food.name, food.stock)}, 400 item = CartItem( qty=item["qty"], food_id=item["id"] ) food_items.append(item) order_loc = OrderLocationTracked( latitude=order_loc['latitude'], longitude=order_loc['longitude'], accuracy=order_loc['accuracy'] ) deliver_to = OrderLocationTracked( latitude=deliver_to['latitude'], longitude=deliver_to['longitude'], accuracy=deliver_to['accuracy'], is_pinned=deliver_to['is_pinned'] ) order = Order( order_time=order_time, order_loc=order_loc, deliver_to=deliver_to, notes=notes, cart=Cart() ) order.cart.cart_items = food_items user.user_detail.orders.append(order) try: user.commit() except: return {"message": "can't save, tell you engineer"}, 500 return {"message": "success", "data": order.get(detail=True)}