Exemplo n.º 1
0
def get_order_billing_status(request, passenger):
    approved = "approved"
    pending = "pending"

    order_id = request.GET.get("order_id")
    order = Order.by_id(order_id)

    if not (order and order.passenger == passenger):
        return JSONResponse({"error": _("You are not authorized to view the status of this order")})

    response = {}
    try:
        billing_trx = sorted(order.billing_transactions.all(), lambda trx: trx.create_date)[0]

        if billing_trx.status == BillingStatus.APPROVED:
            response['status'] = approved
        elif billing_trx.status == BillingStatus.FAILED:
            response['error'] = _("This card cannot be charged. It may be expired, blocked or not yet supported by WAYbetter (American Express)")
        else:
            response['status'] = pending

    except IndexError:  # no billing transactions
        response['error'] = _("Order was not processed for billing")

    logging.info("response = %s" % response)
    return JSONResponse(response)
Exemplo n.º 2
0
def update_ride_add_order(ride, ride_data, new_order):
    # important:
    # connect new_order to ride ONLY AFTER update_ride is done.
    # If not, new_order will turn up in ride.orders.all() queries which doesn't reflect the state of the ride prior to joining

    update_ride(ride, ride_data, new_order=new_order)

    # create or update points for the new order
    for point_data in [ride_data.order_pickup_point(NEW_ORDER_ID), ride_data.order_dropoff_point(NEW_ORDER_ID)]:
        if len(point_data.order_ids) == 1:  # new point
            point = create_ride_point(ride, point_data)

        else:  # find existing point
            existing_order_id = first(lambda id: id != NEW_ORDER_ID, point_data.order_ids)
            existing_order = Order.by_id(existing_order_id)
            point = existing_order.pickup_point if point_data.stop_type == StopType.PICKUP else existing_order.dropoff_point
            logging.info("joining existing point %s" % point.id)

        if point_data.stop_type == StopType.PICKUP:
            new_order.pickup_point = point
        else:
            new_order.dropoff_point = point

    new_order.price_data = ride_data.order_price_data(NEW_ORDER_ID)
    new_order.ride = ride
    new_order.save()
Exemplo n.º 3
0
def fb_share(request):
    context = request.GET.get("context")
    raw_data = request.GET.get("data")
    data = simplejson.loads(raw_data) if raw_data else None

    caption = u"הצטרפו למהפכת המוניות המשותפות WAYbetter:"
    description = u"מתקדם יותר, חכם יותר, נוח יותר ומשתלם הרבה יותר!"

    if context == 'order_approved':
        order = Order.by_id(data.get('order_id'))
        savings = order.price - order.get_billing_amount()

        if savings:
            caption = u"חסכתי %s₪ על מונית משותפת מ%s ל%s. תצטרפו אלי ונחסוך יחד יותר..." % (savings, order.from_raw, order.to_raw)
        else:
            caption = u"הזמנתי מונית משותפת מ%s ל%s. תצטרפו אלי ונחסוך יחד יותר..." % (order.from_raw, order.to_raw)

    args = {
        'app_id': settings.FACEBOOK_APP_ID,
        'link': settings.DEFAULT_DOMAIN,
        'picture': 'http://%s/static/images/fb_share_logo.png' % settings.DEFAULT_DOMAIN,
        'name': 'WAYbetter',
        'caption': caption.encode("utf-8"),
        'description': description.encode("utf-8"),
        'redirect_uri': settings.CLOSE_CHILD_BROWSER_URI if request.mobile else "http://%s" % settings.DEFAULT_DOMAIN,
        'display': 'touch' if request.mobile else 'page'
    }
    url = "http://%s.facebook.com/dialog/feed?%s" % ("m" if request.mobile else "www", urllib.urlencode(args))

    return HttpResponseRedirect(url)
Exemplo n.º 4
0
def track_order(request, order_id):
    order = Order.by_id(order_id)
    use_mock = False
    ride = None
    expiration_date = default_tz_now()
    if order:
        try:
            ride = order.ride or order.pickmeapp_ride
        except (SharedRide.DoesNotExist, PickMeAppRide.DoesNotExist):
            pass
    else:
        error_message = _("This ride is invalid")

    if not ride:
        error_message = _("This ride is invalid")
    else:
        expiration_date = ride.arrive_time + timedelta(minutes=15)
        if expiration_date < default_tz_now():
            error_message = _("This ride has expired")

    if ride.station:
        station_icon_url = ride.station.app_icon_url
        station_phone = ride.station.phone

    if request.GET.get("use_mock"):
        error_message = ""
        station_icon_url = "https://s3.amazonaws.com/stations_icons/ny_icon.png"
        use_mock = True
        expiration_date = default_tz_now() + timedelta(minutes=15)

    expiration_date = to_js_date(expiration_date)  # prepare for JS consumption

    return custom_render_to_response('track_order.html',
                                     locals(),
                                     context_instance=RequestContext(request))
Exemplo n.º 5
0
def track_order(request, order_id):
    order = Order.by_id(order_id)
    use_mock = False
    ride = None
    expiration_date = default_tz_now()
    if order:
        try:
            ride = order.ride or order.pickmeapp_ride
        except (SharedRide.DoesNotExist, PickMeAppRide.DoesNotExist):
            pass
    else:
        error_message = _("This ride is invalid")

    if not ride:
        error_message = _("This ride is invalid")
    else:
        expiration_date = ride.arrive_time + timedelta(minutes=15)
        if expiration_date < default_tz_now():
            error_message = _("This ride has expired")

    if ride.station:
        station_icon_url = ride.station.app_icon_url
        station_phone = ride.station.phone

    if request.GET.get("use_mock"):
        error_message = ""
        station_icon_url = "https://s3.amazonaws.com/stations_icons/ny_icon.png"
        use_mock = True
        expiration_date = default_tz_now() + timedelta(minutes=15)

    expiration_date = to_js_date(expiration_date)  # prepare for JS consumption

    return custom_render_to_response("track_order.html", locals(), context_instance=RequestContext(request))
Exemplo n.º 6
0
def cancel_order(request, order_id):
    res = False

    order = Order.by_id(order_id)
    order.cancel_billing()
    if order.change_status(new_status=CANCELLED):
        res = True

    return JSONResponse({'success': res})
Exemplo n.º 7
0
def cancel_order(request, order_id):
    res = False

    order = Order.by_id(order_id)
    order.cancel_billing()
    if order.change_status(new_status=CANCELLED):
        res = True

    return JSONResponse({'success': res})
Exemplo n.º 8
0
def get_order_position(request, order_id):
    """
    Return a taxi position and pickup/dropoff status for taxi tracking page.

    position : TaxiRidePosition if there is a position, None if there is no position or it is stale (expired)
    passenger_pickup_up: bool indicating if the passenger is on the taxi
    """
    order = Order.by_id(order_id)
    position = get_position_for_order(order)

    response = {"position": position.__dict__ if position else None, "passenger_picked_up": order.pickup_point.visited}
    logging.info(response)
    return JSONResponse(response)
Exemplo n.º 9
0
def get_order_position(request, order_id):
    """
    Return a taxi position and pickup/dropoff status for taxi tracking page.

    position : TaxiRidePosition if there is a position, None if there is no position or it is stale (expired)
    passenger_pickup_up: bool indicating if the passenger is on the taxi
    """
    order = Order.by_id(order_id)
    position = get_position_for_order(order)

    response = {
        'position': position.__dict__ if position else None,
        'passenger_picked_up': order.pickup_point.visited,
    }
    logging.info(response)
    return JSONResponse(response)
Exemplo n.º 10
0
def get_ongoing_ride_details(request):
    order_id = request.GET.get("order_id")
    order = Order.by_id(order_id)

    response = {}

    if order and order.ride:
        ride = order.ride
        station = ride.station
        station_data = {
            'name': station.name if station else WAYBETTER_STATION_NAME,
            'phone': settings.CONTACT_PHONE
        }

        pickup_position = {"lat": order.from_lat, "lng": order.from_lon}
        dropoff_position = {"lat": order.to_lat, "lng": order.to_lon}

        taxi_position = get_position_for_order(order)
        if taxi_position:
            taxi_position = {"lat": taxi_position.lat, "lng": taxi_position.lon}

        pickup_stops = [{"lat": p.lat, "lng": p.lon} for p in ride.pickup_points]  # sorted by stop_time
        sorted_orders = sorted(ride.orders.all(), key=lambda o: o.depart_time)

        # stops include other passengers stops only
        stops = filter(lambda stop: (stop["lat"], stop["lng"])
                    not in [(pickup_position["lat"], pickup_position["lng"]), (dropoff_position["lat"], dropoff_position["lng"])], pickup_stops)

        # passenger appears as many times as seats she ordered
        passengers = [{'name': o.passenger.name, 'picture_url': o.passenger.picture_url, 'is_you': o==order}
                        for o in sorted_orders for seat in range(o.num_seats)]

        response = {
            "station"           : station_data,
            "passengers"        : passengers,
            "taxi_position"     : taxi_position,
            "taxi_number"       : ride.taxi_number,
            "pickup_position"   : pickup_position,
            "dropoff_position"  : dropoff_position,
            'passenger_picked_up': order.pickup_point.visited,
            "stops"             : stops,
            "empty_seats"       : MAX_SEATS - sum([o.num_seats for o in sorted_orders]),
        }
    else:
        logging.error("ongoing ride details error for order [%s]" % order_id)

    return JSONResponse(response)
Exemplo n.º 11
0
def cancel_order(request, passenger):
    """
    Cancel an order. Current status must be APPROVED meaning J5 was successful.
    The billing backend is responsible for not charging (J4) the order.
    """
    from sharing.sharing_dispatcher import WS_SHOULD_HANDLE_TIME
    response = {'success': False,
                'message': _("This order cannot be cancelled anymore")}

    order = Order.by_id(request.POST.get("order_id"))
    cancel_allowed = False
    if order and order.passenger == passenger:
        cancel_allowed = True
        ride = order.ride
        if ride:
            cancel_allowed = ride.depart_time > default_tz_now() + datetime.timedelta(minutes=WS_SHOULD_HANDLE_TIME)

    if cancel_allowed and order.change_status(APPROVED, CANCELLED):
        response = {'success': True,
                    'message': _("Order cancelled")}

    return JSONResponse(response)
Exemplo n.º 12
0
def cancel_billing(request, order_id):
    order = Order.by_id(order_id)
    res = order.cancel_billing()
    return JSONResponse({'success': res})
Exemplo n.º 13
0
def cancel_billing(request, order_id):
    order = Order.by_id(order_id)
    res = order.cancel_billing()
    return JSONResponse({'success': res})