def end_trip(user_number, booking_id): conn = None try: conn, cur = Sql.get_connection() logging.debug(" " + str(user_number) + ": Connection and cursor received") status = Firebase.reset_user(user_number) logging.debug(" " + str(user_number) + ": User reset done") if status == 0: raise ValueError("Error in ending trip") sql_query = "update user_booking set activity = concat(activity, '|', 'user_end_trip'), status = {0} where booking_id = '{1}' and status != {2}" cur.execute( sql_query.format(C.USER_END_TRIP, booking_id, C.USER_END_TRIP)) conn.commit() conn.close() result = Response.make_response(200, "Ended", "Trip ended") return result except Exception as e: if conn is not None: conn.close() logging.error(" " + str(user_number) + ": Error in end trip request: " + str(e)) return Response.default_error
def get_all(number): conn = None try: conn, cur = Sql.get_connection() logging.debug("Connection and cursor received") sql_query = "select name, number, vehicle from drivers where number = '{0}'" cur.execute(sql_query.format(number)) data = cur.fetchall() result = Response.make_response(200, "Vehicle number updated", "Vehicle number updated", name=data[0], number=data[1], vehicle=data[2]) conn.close() logging.debug("Connection closed") return result except Exception as e: if conn is not None: conn.close() logging.error("Error in getting all details: " + str(e)) error = Response.make_response(500, "System failure", "Oops something went wrong !") return error
def check_user_repetition(number): conn = None try: conn, cur = Sql.get_connection() logging.debug(" " + str(number) + ": Connection and cursor received") # check from db sql_query = "select count(number) from users where number = '{0}'" cur.execute(sql_query.format(number)) data = cur.fetchone() logging.debug(" " + str(number) + ": Count is: " + str(data[0])) if int(data[0]) == 0: conn.close() result = Response.make_response(200, "Phone number does not exist", "Phone number does not exist", present=0) return result result = Response.make_response(200, "Phone number already exists", "Phone number already exists", present=1) conn.close() logging.debug(" " + str(number) + ": Connection closed") return result except Exception as e: if conn is not None: conn.close() logging.error(" " + str(number) + ": Error in checking user repetition: " + str(e)) error = Response.make_response(500, "System failure", "Oops something went wrong !") return error
def create_user(number, name): conn = None try: conn, cur = Sql.get_connection() logging.debug(" " + str(number) + ": Connection and cursor received") # insert in db sql_query = "insert into users (number, name) values ('{0}', '{1}')" cur.execute(sql_query.format(number, name)) conn.commit() logging.debug(" " + str(number) + ": User successfully inserted in users table") result = Response.make_response(201, "Account created", "Your account has been created") conn.close() return result except Exception as e: if conn is not None: conn.close() logging.error(" " + str(number) + ": Error in creating user: "******"System failure", "Oops something went wrong !") return error
def create_otp(number): conn = None try: conn, cur = Sql.get_connection() logging.debug(" " + str(number) + ": Connection and cursor received") response = requests.get("https://2factor.in/API/V1/" + str(config.api_key_2factor) + "/SMS/+91" + str(number)[-10:]+ "/AUTOGEN") response = dict(response.json()) if response["Status"] == "Success": session_id = response["Details"] logging.debug(" " + str(number) + ": OTP created successfully with session id: " + str(session_id)) sql_query = "insert into user_otp (number, session_id) values ('{0}', '{1}') on duplicate key update session_id = '{1}', otp_verified = 0" cur.execute(sql_query.format(number, session_id)) conn.commit() logging.debug(" " + str(number) + ": Connection closed") result = Response.make_response(200, "OTP sent", "Please enter otp") conn.close() return result else: logging.warning(" " + str(number) + ": OTP could not be created") error = Response.make_response(500, "System failure", "Oops something went wrong !") conn.close() return error except Exception as e: if conn is not None: conn.close() logging.error(" " + str(number) + ": Error in create_otp: " + str(e)) error = Response.make_response(500, "System failure", "Oops something went wrong !") return error
def start_trip(user_number, booking_id): conn = None try: conn, cur = Sql.get_connection() status = Firebase.start_trip(user_number) if status == 0: raise ValueError("Error in starting trip") sql_query = "update user_booking set activity = concat(activity, '|', 'user_in_ride'), status = {0} where booking_id = '{1}'" cur.execute(sql_query.format(C.USER_IN_RIDE, booking_id)) conn.commit() sql_query = "update distance set status = 0 where booking_id = '{0}'" cur.execute(sql_query.format(booking_id)) conn.commit() conn.close() result = Response.make_response(200, "Started", "Trip started") return result except Exception as e: if conn is not None: conn.close() logging.error("Error in start trip request: " + str(e)) return Response.default_error
def cancel_booking(user_number, booking_id): conn = None try: conn, cur = Sql.get_connection() logging.debug(" " + str(user_number) + ": Connection and cursor received") status = Firebase.reset_user(user_number) if status == 0: return Response.default_error sql_query = "update user_booking set status = {0}, activity = concat(activity, '|', 'user_cancelled') where booking_id = '{1}' and status != {2}" cur.execute( sql_query.format(C.USER_CANCELLED, booking_id, C.USER_CANCELLED)) conn.commit() sql_query = "update distance set status = 0 where booking_id = '{0}'" cur.execute(sql_query.format(booking_id)) conn.commit() conn.close() logging.debug("Booking cancelled successfully for " + str(user_number)) result = Response.make_response(200, "Booking cancelled", "Your booking has been cancelled") return result except Exception as e: if conn is not None: conn.close() logging.error(" " + str(user_number) + ": Error in cancelling booking: " + str(e)) return Response.default_error
def find_drivers(user_number, from_lon, from_lat, to_lon, to_lat, seats): conn = None try: conn, cur = Sql.get_connection() logging.debug(" " + str(user_number) + ": Connection and cursor received") sql_query = "select count(booking_id) from user_booking where user_number = '{0}' and (status = {1} or status = {2} or status = {3})" cur.execute( sql_query.format(user_number, C.USER_IN_RIDE, C.USER_BOOKED, C.USER_REQUESTING)) current_booking = cur.fetchone()[0] # if already there is no booking then proceed if current_booking == 0: conn.close() path_ = "users/" + user_number result = Response.make_response(200, "Success", "We are searching drivers", path=path_) return result, 1 else: conn.close() result = Response.make_response( 409, "Booking exists", "You have already one booking going on") return result, 0 except Exception as e: if conn is not None: conn.close() logging.error(" " + str(user_number) + ": Error in finding drivers: " + str(e)) return Response.default_error, 0
def history(user_number, count, last_timestamp): conn = None try: conn, cur = Sql.get_connection() sql_query = "select * from user_history where timestamp < {0} limit count" cur.execute(sql_query) data = cur.fetchall() output = {} ind = 0 for r in data: _user_number = str(r[0]) _booking_id = str(r[1]) timestamp = r[2] output[ind] = {} output[ind]["userNumber"] = _user_number output[ind]["bookingId"] = _booking_id output[ind]["timestamp"] = timestamp ind = ind + 1 conn.close() result = Response.make_response(200, "", "History fetched", history=output) return result except Exception as e: if conn is not None: conn.close() logging.error("Error in showing history for user number " + str(user_number) + ": " + str(e)) return Response.default_error
def accept(driver_number): conn = None try: conn, cur = Sql.get_connection() booking_details = Firebase.get_current_request(driver_number) if booking_details["bookingId"] == -1: raise ValueError('There is no booking for this driver') if len(booking_details) == 0: raise ValueError('Booking details is empty') user_number = int(booking_details["user"]) fare = float(booking_details["fare"]) booking_id = booking_details["bookingId"] from_lon = float(booking_details["from_lon"]) from_lat = float(booking_details["from_lat"]) to_lon = float(booking_details["to_lon"]) to_lat = float(booking_details["to_lat"]) seats = int(booking_details["seats"]) now_time = datetime.timestamp(datetime.now()) sql_query = "select name, vehicle from drivers where number = '{0}'" cur.execute(sql_query.format(driver_number)) d = cur.fetchone() driver_name = str(d[0]) vehicle = str(d[1]) sql_query = "insert into driver_history (booking_id, driver_number, timestamp) values ('{0}', {1}, {2})" cur.execute(sql_query.format(booking_id, driver_number, now_time)) conn.commit() sql_query = "insert into distance(booking_id, status, dist, driver, from_lon, from_lat) values('{0}', 1, -1.0, '{1}', {2}, {3})" cur.execute(sql_query.format(booking_id, driver_number, from_lon, from_lat)) conn.commit() sql_query = "insert into user_history (booking_id, user_number, timestamp) values ('{0}', {1}, {2})" cur.execute(sql_query.format(booking_id, user_number, now_time)) conn.commit() status = Firebase.confirm_user_booking(user_number, driver_number, driver_name, vehicle) sql_query = "insert into user_booking(booking_id, user_number, status, driver_number, fare, activity, from_lon, from_lat, to_lon, to_lat, seats) values('{0}', '{1}', {2}, '{3}', {4}, '{5}', {6}, {7}, {8}, {9}, {10})" cur.execute(sql_query.format(booking_id, user_number, C.USER_BOOKED, driver_number, fare, "user_booked", from_lon, from_lat, to_lon, to_lat, seats)) conn.commit() conn.close() result = Response.make_response(200, "Driver accepted", "Request accepted successfully", fare = fare, bookingId = booking_id) return result except Exception as e: if conn is not None: conn.close() logging.error("Error in accepting request: " + str(e)) return Response.default_error
def reject(driver_number): conn = None try: conn, cur = Sql.get_connection() status = Firebase.reset_driver(driver_number) conn.close() if status == 1: result = Response.make_response(200, "Driver rejected", "Request rejected") return result else: raise ValueError("Error in rejecting") except Exception as e: if conn is not None: conn.close() logging.error("Error in rejecting request: " + str(e)) return Response.default_error
def set_name(user_number, name): conn = None try: conn, cur = Sql.get_connection() sql_query = "update users set name = '{0}' where number = '{1}'" cur.execute(sql_query.format(name, user_number)) conn.commit() conn.close() result = Response.make_response(200, "name changed", "Your name has been changed") return result except Exception as e: if conn is not None: conn.close() logging.error("Error in setting name for user number " + str(user_number) + ": " + str(e)) return Response.default_error
def get_dist(user_number, curr_lon, curr_lat, driver_nummber): conn = None try: conn, cur = Sql.get_connection() logging.debug(" " + str(user_number) + ": Connection and cursor received") sql_query = "select curr_lon, curr_lat from driver_status where driver = '{0}'" cur.execute(sql_query.format(driver_nummber)) driver_lon = cur.fetchone()[0] driver_lat = cur.fetchone()[1] dist = driver_lon + driver_lat - curr_lon - curr_lat result = Response.make_response(200, "", "", distance=dist) return result except Exception as e: if conn is not None: conn.close() logging.error(" " + str(user_number) + ": Error in getting current distance: " + str(e)) return Response.default_error
def get_name(user_number): conn = None try: conn, cur = Sql.get_connection() sql_query = "select name from users where number = '{0}'" cur.execute(sql_query.format(user_number)) data = cur.fetchone() name = data[0] conn.commit() conn.close() result = Response.make_response(200, "", "", name=name) return result except Exception as e: if conn is not None: conn.close() logging.error("Error in setting name for user number " + str(user_number) + ": " + str(e)) return Response.default_error
def closure_reset(current_drivers, user_number): conn = None try: conn, cur = Sql.get_connection() logging.debug(" " + str(user_number) + ": Got connection in closure reset") for key, value in current_drivers.items(): _ = Firebase.reset_driver(key) sql_query = "update driver_status set status = {0} where driver_number = '{1}'" cur.execute(sql_query.format(C.DRIVER_FREE, key)) conn.commit() _ = Firebase.reset_user(user_number) logging.debug(" " + str(user_number) + ": User reset done") _ = Firebase.update_requester(user_number, {}) logging.debug(" " + str(user_number) + ": Requester reset done") conn.close() except Exception as e: if conn is not None: conn.close() logging.error(" " + str(user_number) + ": Error in closure: " + str(e))
def verify_otp(number, otp): conn = None try: conn, cur = Sql.get_connection() logging.debug("Connection and cursor received") sql_query = "select session_id from driver_otp where number = " + str(number) cur.execute(sql_query) data = cur.fetchone() session_id = str(data[0]) print(session_id) response = requests.get("https://2factor.in/API/V1/" + str(config.api_key_2factor) + "/SMS/VERIFY/" + str(session_id)+ "/" + str(otp)) response = dict(response.json()) if response["Status"] == "Success" and response["Details"] == "OTP Matched" : sql_query = "update driver_otp set otp_verified = 1 where number = " + str(number) cur.execute(sql_query) conn.commit() response = Create.check_user_repetition(number) if "present" in response: if response["present"] == 1: result = Response.make_response(200, "OTP matched", "OTP matched successfully", action = "login", match = 1) if response["present"] == 0: result = Response.make_response(200, "OTP matched", "OTP matched successfully", action = "signUp", match = 1) logging.debug("OTP verified successfully") conn.close() return result else: conn.close() error = Response.make_response(500, "System failure", "Oops something went wrong !") return error else: logging.debug("OTP could not be verified") error = Response.make_response(200, "OTP mismatched", "OTP does not match", match = 0) conn.close() return error except Exception as e: if conn is not None: conn.close() logging.error("Error in verify_otp: " + str(e)) error = Response.make_response(500, "System failure", "Oops something went wrong !") return error
def update_vehicle(number, vehicle_number): conn = None try: conn, cur = Sql.get_connection() logging.debug("Connection and cursor received") # update in db sql_query = "update drivers set vehicle = '{0}' where number = '{1}'" cur.execute(sql_query.format(vehicle_number, number)) conn.commit() result = Response.make_response(200, "Vehicle number updated", "Vehicle number updated") conn.close() logging.debug("Connection closed") return result except Exception as e: if conn is not None: conn.close() logging.error("Error in updating vehicle: " + str(e)) error = Response.make_response(500, "System failure", "Oops something went wrong !") return error
def change_status(number, curr_status): conn = None try: conn, cur = Sql.get_connection() logging.debug("Connection and cursor received") sql_query = "insert into driver_status (driver_number, status, curr_lat, curr_long) values ('{0}', {1}, {2}, {3}) on duplicate key update status = {1}" cur.execute(sql_query.format(number, curr_status, -181.0, -181.0)) conn.commit() conn.close() logging.debug(" Status of driver " + str(driver_number) + " changed to " + str(curr_status)) result = Response.make_response( 200, "Current status of driver changed", "Current status of driver changed") return result except Exception as e: if conn is not None: conn.close() logging.error("Error in changing driver status: " + str(e)) error = Response.make_response(500, "System failure", "Oops something went wrong !") return error
def cancel(user_number, booking_id): conn = None try: conn, cur = Sql.get_connection() status = Firebase.reset_user(user_number) if status == 0: raise ValueError("Error in cancelling") sql_query = "update user_booking set activity = concat(activity, '|', 'driver_cancelled'), status = {0} where booking_id = '{1}'" cur.execute(sql_query.format(C.DRIVER_CANCELLED, booking_id)) conn.commit() sql_query = "update distance set status = 0 where booking_id = '{0}'" cur.execute(sql_query.format(booking_id)) conn.commit() conn.close() result = Response.make_response(200, "Cancelled", "Request has been successfully cancelled") return result except Exception as e: if conn is not None: conn.close() logging.error("Error in cancelling request: " + str(e)) return Response.default_error
def create_booking(user_number, from_lon, from_lat, to_lon, to_lat, seats): conn = None max_queue_size = 2 current_drivers = {} try: conn, cur = Sql.get_connection() logging.debug(" " + str(user_number) + ": Connection and cursor received") # Get payment details payment = Fare.get_fare(from_lat, from_lon, to_lat, to_lon) if payment == -1: conn.close() seats = int(seats) booking_id = str(ObjectId()) sql_query = "select driver_number, curr_lat, curr_long from driver_status where status = 6" cur.execute(sql_query) data = cur.fetchall() data, status = Utility.sort_drivers(from_lat, from_lon, data) logging.debug(" " + str(user_number) + ": Drivers sorted according to distance") if status == 0: conn.close() now_time = datetime.timestamp(datetime.now()) end_time = now_time + 60 driver_index = 0 driver_number = -1 status = Firebase.initialize(user_number, from_lon, from_lat, to_lon, to_lat, booking_id, payment, seats) logging.debug(" " + str(user_number) + ": Firebase user initialized") if status == 0: Book.closure_reset(current_drivers, user_number) conn.close() # Try for 60 seconds requesting drivers logging.info(" " + str(user_number) + ": 60 seconds booking search started") while now_time <= end_time: driver_number, status = Firebase.check_user(user_number) if status == C.WRONG: conn.close() Book.closure_reset(current_drivers, user_number) if status == C.USER_BOOKED or status == C.USER_IN_RIDE: # Flush list of current drivers for key, value in current_drivers.items(): _ = Firebase.reset_driver(key) # Flush requester list of user _ = Firebase.update_requester(user_number, {}) break # Check if driver has cancelled any request to_remove = [] for key, value in current_drivers.items(): user, status = Firebase.check_driver(key) if status == C.DRIVER_FREE: if key in current_drivers: to_remove.append(key) for key in to_remove: del current_drivers[key] # Send request to new driver while driver_index < len(data): if len(current_drivers) == max_queue_size: break driver_number = data[driver_index][0] logging.debug(" " + str(user_number) + ": Sending request to driver " + str(driver_number)) status = Firebase.request_driver(user_number, driver_number, booking_id, payment, from_lon, from_lat, to_lon, to_lat, seats) if status == 0: driver_index = driver_index + 1 continue current_drivers[driver_number] = 1 driver_index = driver_index + 1 # Update requester list of user logging.debug(" " + str(user_number) + ": Updating requester") _ = Firebase.update_requester(user_number, current_drivers) now_time = datetime.timestamp(datetime.now()) # Return result if int(driver_number) != C.DRIVER_FREE: logging.debug(" " + str(user_number) + ": Create booking function ended") conn.close() else: logging.debug(" " + str(user_number) + ": Create booking function ended") Book.closure_reset(current_drivers, user_number) conn.close() except Exception as e: Book.closure_reset(current_drivers, user_number) if conn is not None: conn.close() logging.error(" " + str(user_number) + ": Error in create booking: " + str(e))