コード例 #1
0
    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
コード例 #2
0
    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
コード例 #3
0
    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
コード例 #4
0
    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
コード例 #5
0
 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
コード例 #6
0
    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
コード例 #7
0
    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
コード例 #8
0
    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
コード例 #9
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
コード例 #10
0
    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
コード例 #11
0
 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
コード例 #12
0
    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
コード例 #13
0
 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
コード例 #14
0
    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
コード例 #15
0
 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))
コード例 #16
0
 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
コード例 #17
0
    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
コード例 #18
0
 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
コード例 #19
0
    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
コード例 #20
0
    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))