Esempio n. 1
0
def order_tracker(sender, signal_type, obj, **kwargs):
    """
    Handler for all async signals
    Sends messages to passenger's channel
    """
    if signal_type in [
            SignalType.ASSIGNMENT_CREATED, SignalType.ASSIGNMENT_STATUS_CHANGED
    ]:
        order_assignment = obj

        if order_assignment.status in [PENDING, ASSIGNED]:
            order = order_assignment.order
            passenger = order.passenger

            # change this when tracker used for all passengers
            if passenger.business:
                msg = get_tracker_msg_for_order(
                    order, last_assignment=order_assignment)
                send_msg_to_passenger(passenger, msg)
            else:
                return

    elif signal_type in [SignalType.ORDER_STATUS_CHANGED]:
        order = obj

        if order.status in [ACCEPTED, TIMED_OUT, FAILED, ERROR]:
            passenger = order.passenger

            # change this when tracker used for all passengers
            if passenger.business:
                msg = get_tracker_msg_for_order(order)
                send_msg_to_passenger(passenger, msg)
            else:
                return
Esempio n. 2
0
def order_tracker(sender, signal_type, obj, **kwargs):
    """
    Handler for all async signals
    Sends messages to passenger's channel
    """
    if signal_type in [SignalType.ASSIGNMENT_CREATED, SignalType.ASSIGNMENT_STATUS_CHANGED]:
        order_assignment = obj

        if order_assignment.status in [PENDING, ASSIGNED]:
            order = order_assignment.order
            passenger = order.passenger

            # change this when tracker used for all passengers
            if passenger.business:
                msg = get_tracker_msg_for_order(order, last_assignment=order_assignment)
                send_msg_to_passenger(passenger, msg)
            else:
                return

    elif signal_type in [SignalType.ORDER_STATUS_CHANGED]:
        order = obj

        if order.status in [ACCEPTED, TIMED_OUT, FAILED, ERROR]:
            passenger = order.passenger

            # change this when tracker used for all passengers
            if passenger.business:
                msg = get_tracker_msg_for_order(order)
                send_msg_to_passenger(passenger, msg)
            else:
                return
Esempio n. 3
0
 def _notify_order_passenger(order):
     logging.info("Ride status update: notifying passenger about taxi location for order: %s" % order)
     msg = translate_to_lang(_("To view your taxi: "), order.language_code)
     url = " http://%s%s" % (settings.DEFAULT_DOMAIN,
                            reverse("ordering.passenger_controller.track_order", kwargs={"order_id": order.id}))
     msg += url
     send_msg_to_passenger(order.passenger, msg)
Esempio n. 4
0
def book_order(request):
    """
    Book an order: send it to the dispatcher to get an order assignment,
    then pass the assignment to the station manager.
    """
    order_id = int(request.POST["order_id"])
    logging.info("book_order_task: %d" % order_id)
    order = get_object_or_404(Order, id=order_id)
    passenger = order.passenger

    # if this is the first order of this passenger, connect him with the station that originated the order
    if order.originating_station and passenger.orders.count() == 1:
        logging.info("assigning passenger %s to station %s" % (passenger, order.originating_station))
        passenger.originating_station = order.originating_station
        if not passenger.default_station:
            passenger.default_station = order.originating_station

        passenger.save()

    sorry_msg = ugettext_noop("We're sorry, but we could not find a taxi for you") # use dummy ugettext for makemessages)

    # check if dispatching should stop and return an answer to the user
    if (utc_now() - order.create_date).seconds > ORDER_HANDLE_TIMEOUT:
        try:
            order.change_status(new_status=TIMED_OUT)
            send_msg_to_passenger(passenger, translate_to_lang(sorry_msg, order.language_code))
            logging.warning("order time out: %d" % order_id)
            response = HttpResponse(ORDER_TIMEOUT)
        except UpdateStatusError:
            logging.error("book_order failed: cannot set order [%d] status to %s" % (order.id, "TIME_OUT"))
    else:
        try:
            # choose an assignment for the order and push it to the relevant workstation
            order_assignment = dispatcher.assign_order(order)
            push_order(order_assignment)
            enqueue_redispatch_orders(order_assignment, ORDER_TEASER_TIMEOUT, redispatch_pending_orders)
            response = HttpResponse(ORDER_HANDLED)

        except NoWorkStationFoundError:
            try:
                order.change_status(new_status=FAILED)
                send_msg_to_passenger(passenger, translate_to_lang(sorry_msg, order.language_code)) # use dummy ugettext for makemessages

                log_event(EventType.ORDER_FAILED, order=order, passenger=order.passenger)
                logging.warning("no matching workstation found for: %d" % order_id)
                response = HttpResponse(NO_MATCHING_WORKSTATIONS_FOUND)
            except UpdateStatusError:
                logging.error("book_order failed: cannot set order [%d] status to %s" % (order.id, "FAILED"))

        except Exception, e:
            try:
                order.change_status(new_status=ERROR)
                send_msg_to_passenger(passenger, translate_to_lang(ugettext_noop("We're sorry, but we have encountered an error while handling your request")
                             , order.language_code)) # use dummy ugettext for makemessages
                log_event(EventType.ORDER_ERROR, order=order, passenger=order.passenger)
                logging.error("book_order: OrderError: %d" % order_id)
                raise # handle exception in decorator 
            except UpdateStatusError:
                logging.error("book_order failed: cannot set order [%d] status to %s" % (order.id, "ERROR"))
Esempio n. 5
0
def accept_order(order, pickup_time, station):
    try:
        order.pickup_time = pickup_time
        order.station = station
        order.future_pickup = True
        order.save()

        # only change status after updating order values so that signal handler will see updated order
        order.change_status(ASSIGNED, ACCEPTED)

        enqueue_update_future_pickup(order, order.pickup_time*60)

        msg = translate_to_lang(
            ugettext_noop("Pickup at %(from)s in %(time)d minutes.\nStation: %(station_name)s, %(station_phone)s"),
            order.language_code) %\
              {"from": order.from_raw,
               "time": pickup_time,
               "station_name": order.station_name,
               "station_phone": station.phones.all()[0].local_phone} # use dummy ugettext for makemessages

        send_msg_to_passenger(order.passenger, msg)
    except UpdateStatusError:
        logging.error("accept_order failed [%d]: cannot mark order as %s" % (order.id, "ACCEPTED"))
Esempio n. 6
0
def accept_order(order, pickup_time, station):
    try:
        order.pickup_time = pickup_time
        order.station = station
        order.future_pickup = True
        order.save()

        # only change status after updating order values so that signal handler will see updated order
        order.change_status(ASSIGNED, ACCEPTED)

        enqueue_update_future_pickup(order, order.pickup_time * 60)

        msg = translate_to_lang(
            ugettext_noop("Pickup at %(from)s in %(time)d minutes.\nStation: %(station_name)s, %(station_phone)s"),
            order.language_code) %\
              {"from": order.from_raw,
               "time": pickup_time,
               "station_name": order.station_name,
               "station_phone": station.phones.all()[0].local_phone} # use dummy ugettext for makemessages

        send_msg_to_passenger(order.passenger, msg)
    except UpdateStatusError:
        logging.error("accept_order failed [%d]: cannot mark order as %s" %
                      (order.id, "ACCEPTED"))
Esempio n. 7
0
def book_order(request):
    """
    Book an order: send it to the dispatcher to get an order assignment,
    then pass the assignment to the station manager.
    """
    order_id = int(request.POST["order_id"])
    logging.info("book_order_task: %d" % order_id)
    order = get_object_or_404(Order, id=order_id)
    passenger = order.passenger

    # if this is the first order of this passenger, connect him with the station that originated the order
    if order.originating_station and passenger.orders.count() == 1:
        logging.info("assigning passenger %s to station %s" %
                     (passenger, order.originating_station))
        passenger.originating_station = order.originating_station
        if not passenger.default_station:
            passenger.default_station = order.originating_station

        passenger.save()

    sorry_msg = ugettext_noop(
        "We're sorry, but we could not find a taxi for you"
    )  # use dummy ugettext for makemessages)

    # check if dispatching should stop and return an answer to the user
    if (utc_now() - order.create_date).seconds > ORDER_HANDLE_TIMEOUT:
        try:
            order.change_status(new_status=TIMED_OUT)
            send_msg_to_passenger(
                passenger, translate_to_lang(sorry_msg, order.language_code))
            logging.warning("order time out: %d" % order_id)
            response = HttpResponse(ORDER_TIMEOUT)
        except UpdateStatusError:
            logging.error(
                "book_order failed: cannot set order [%d] status to %s" %
                (order.id, "TIME_OUT"))
    else:
        try:
            # choose an assignment for the order and push it to the relevant workstation
            order_assignment = dispatcher.assign_order(order)
            push_order(order_assignment)
            enqueue_redispatch_orders(order_assignment, ORDER_TEASER_TIMEOUT,
                                      redispatch_pending_orders)
            response = HttpResponse(ORDER_HANDLED)

        except NoWorkStationFoundError:
            try:
                order.change_status(new_status=FAILED)
                send_msg_to_passenger(passenger,
                                      translate_to_lang(
                                          sorry_msg, order.language_code)
                                      )  # use dummy ugettext for makemessages

                log_event(EventType.ORDER_FAILED,
                          order=order,
                          passenger=order.passenger)
                logging.warning("no matching workstation found for: %d" %
                                order_id)
                response = HttpResponse(NO_MATCHING_WORKSTATIONS_FOUND)
            except UpdateStatusError:
                logging.error(
                    "book_order failed: cannot set order [%d] status to %s" %
                    (order.id, "FAILED"))

        except Exception, e:
            try:
                order.change_status(new_status=ERROR)
                send_msg_to_passenger(
                    passenger,
                    translate_to_lang(
                        ugettext_noop(
                            "We're sorry, but we have encountered an error while handling your request"
                        ), order.language_code
                    ))  # use dummy ugettext for makemessages
                log_event(EventType.ORDER_ERROR,
                          order=order,
                          passenger=order.passenger)
                logging.error("book_order: OrderError: %d" % order_id)
                raise  # handle exception in decorator
            except UpdateStatusError:
                logging.error(
                    "book_order failed: cannot set order [%d] status to %s" %
                    (order.id, "ERROR"))