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)
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()
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)
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))
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))
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})
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})
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)
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)
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)
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)
def cancel_billing(request, order_id): order = Order.by_id(order_id) res = order.cancel_billing() return JSONResponse({'success': res})
def cancel_billing(request, order_id): order = Order.by_id(order_id) res = order.cancel_billing() return JSONResponse({'success': res})