def get_orders(**kwargs): # NewOrder, DeliveryOnProgress, CancelledOrder, RedirectedOrders, OrdersReturned filters = (OrderModel.OrderSchema().dump(kwargs['filter'])) these_order = OrderModel.Order.query for attr, value in filters.items(): if value is not None: these_order = these_order.filter( getattr(OrderModel.Order, attr) == value) these_order = these_order.all() these_order = OrderModel.OrderSchema().dump(these_order, many=True) return these_order, 200
def get_address(**kwargs): # NewOrder, DeliveryOnProgress, CancelledOrder, RedirectedOrders, OrdersReturned filters = (OrderModel.OrderSchema().dump(kwargs['filter'])) these_order = OrderModel.Order.query for attr, value in filters.items(): if value is not None: these_order = these_order.filter( getattr(OrderModel.Order, attr) == value) these_order = these_order.first() these_order = OrderModel.OrderSchema().dump(these_order) return { 'name': these_order['receiver_name'], 'address': these_order['delivery_address'], 'special_code': these_order['special_code'], }, 200
def post(self): params = request.json if not params: return {'message': 'No input data provided'}, 400 try: this_order = (OrderModel.OrderSchema().load(params)) except ValidationError as err: # TODO parse the err in our format return {'error': err.messages, 'message': 'Input not in expected format'}, 422 return OrderUtils.add_order(order=this_order)
def update_orders(**kwargs): this_order = OrderModel.Order.query.filter_by( order_id=kwargs['update'].order_id).first() updates = (OrderModel.OrderSchema().dump(kwargs['update'])) for attr, value in updates.items(): if value is not None: this_order.attr = value if updates['current_status'] == 'CancelledOrder': similar_order = OrderModel.Order.query \ .with_entities(OrderModel.Order.order_id, OrderModel.Order.delivery_latitude, OrderModel.Order.delivery_longitude)\ .filter(OrderModel.Order.product_id == this_order.product_id, OrderModel.Order.current_status == 'NewOrder', OrderModel.Order.order_id != this_order.order_id)\ .all() origin = "28.704060,77.102493" similar_order_data = [] min_distance = sys.maxsize min_duration = sys.maxsize redirection_order = -1 for order in similar_order: destination = str(order[1]) + ',' + str(order[2]) now = datetime.now() directions_result = gmaps.directions(origin, destination, mode="transit", departure_time=now) if directions_result[0]['legs'][0]['distance']['value'] < min_distance\ and directions_result[0]['legs'][0]['duration']['value'] < min_duration: min_distance = directions_result[0]['legs'][0]['distance'][ 'value'] min_duration = directions_result[0]['legs'][0]['duration'][ 'value'] redirection_order = order[0] destination = str(this_order.delivery_start_latitude) + ',' + str( this_order.delivery_start_longitude) directions_result = gmaps.directions(origin, destination, mode="transit", departure_time=now) if directions_result[0]['legs'][0]['distance']['value'] < min_distance \ and directions_result[0]['legs'][0]['duration']['value'] < min_duration: this_order.current_status = 'OrdersReturned' else: this_order.current_status = 'RedirectedOrders' redirected_order = OrderModel.Order.query.filter_by( order_id=redirection_order).first() this_order.delivery_address = redirected_order.delivery_address redirected_order.current_status = 'DeliveryOnProgress' db.session.commit() return {'message': 'updated!'}, 200
def get(self): params = request.args.to_dict() filters = (OrderModel.OrderSchema().load(params)) return OrderUtils.get_address(filter=filters)
def put(self): params = request.args.to_dict() updates = (OrderModel.OrderSchema().load(params)) return OrderUtils.update_orders(update=updates)