def process_ask_for_ride( request, ride_response, ride_offer, ride_request ): ''' Processes a response YES/NO to a request for a ride from a particular RideOffer ''' offer_id = ride_offer request_id = ride_request response = ride_response profile = request.session.get("profile") # Do some error checking def fail( msg ): messages.add_message( request, messages.ERROR, msg ) return HttpResponseRedirect( reverse('user_landing') ) try: offer = RideOffer.objects.get( id=ObjectId(offer_id) ) req = RideRequest.objects.get( pk=ObjectId(request_id) ) rider = req.passenger # Offer or Passenger is not real except (RideOffer.DoesNotExist, RideRequest.DoesNotExist): return fail( "Rideoffer or request does not exist" ) # Invalid value for "response" field--- must accept or decline if response not in ('accept','decline'): return fail( "Not a valid accept or decline request link" ) # Accepting/declining someone who never asked for a ride if req not in offer.askers: return fail( "Not a valid accept or decline request link (no such user has asked you for a ride)" ) if profile != offer.driver: return fail( "Not a valid accept or decline request link (no ride request has been sent to this account)" ) # Update the RideOffer instance to accept/decline the request if response == 'accept': if len(offer.passengers) == 0: offer.passengers = [rider] else: offer.passengers.append( rider ) # Save this offer inside of the RideRequest req.ride_offer = offer req.save() # Email the driver, confirming the fact that they've decided to give a ride. # Also give them passenger's contact info. body_driver = render_message( "taxi/static/emails/driver_thankyou.txt", locals() ) send_email( email_to=request.user.username, email_body=body_driver, email_subject="Your ride from %s to %s"%(offer.start,offer.end) ) # Email the requester, telling them that they're request has been accepted, and # give them the driver's contact info. body_requester = render_message( "taxi/static/emails/process_ask_for_ride_confirm.txt", locals() ) send_email( email_to=rider.user.username, email_body=body_requester, email_subject="Your ride from %s to %s"%(offer.start,offer.end) ) offer.askers.remove( req ) offer.save() messages.add_message( request, messages.SUCCESS, "You have {} {}'s request".format('accepted' if response == 'accept' else 'declined', str(rider.user)) ) return HttpResponseRedirect( reverse('user_landing') )
def process_offer_ride( request, ride_response, ride_offer, ride_request ): ''' Handles the 'accept' or 'decline' links sent to a passenger when a driver finds their RideRequest and submits an offer. ''' request_id = ride_request offer_id = ride_offer response = ride_response profile = request.session.get("profile") # Do some error checking def fail( msg ): messages.add_message( request, messages.ERROR, msg ) return HttpResponseRedirect( reverse('user_landing') ) try: req = RideRequest.objects.get( id=ObjectId(request_id) ) offer = RideOffer.objects.get( pk=ObjectId(offer_id) ) driver = offer.driver # Offer or Passenger is not real except (RideRequest.DoesNotExist, RideOffer.DoesNotExist): return fail( "Ride request or offer does not exist" ) # Invalid value for "response" field--- must accept or decline if response not in ('accept','decline'): return fail( "Not a valid accept or decline request link" ) # Accepting/declining someone who never asked for a ride if offer not in req.askers: return fail( "Not a valid accept or decline request link (no such user has offered you a ride)" ) if profile != req.passenger: return fail( "Not a valid accept or decline request link (no offer request has been sent to this account)" ) # Update the RideOffer instance to accept/decline the request if response == 'accept': req.ride_offer = offer if len(offer.passengers) == 0: offer.passengers = [profile] else: offer.passengers.append( profile ) offer.save() # Email the driver, confirming the fact that they've decided to give a ride. body_driver = render_message( "taxi/static/emails/driver_thankyou.txt", locals() ) send_email( email_to=driver.user.username, email_body=body_driver, email_subject="Your ride %s"%(offer) ) # Email the requester, telling them that they're request has been accepted, and # give them the driver's contact info. body_requester = render_message( "taxi/static/emails/process_offer_ride_confirm.txt", locals() ) send_email( email_to=profile.user.username, email_body=body_requester, email_subject="Your ride %s"%str(req) ) req.askers.remove( offer ) req.save() messages.add_message( request, messages.SUCCESS, "You have {} {}'s offer".format('accepted' if response == 'accept' else 'declined', str(driver)) ) return HttpResponseRedirect( reverse('user_landing') )
def ask_for_ride( request ): ''' Asks for a ride from a particular offer ''' data = request.POST profile = request.session.get("profile") offer = RideOffer.objects.get( pk=ObjectId(data['offer_id']) ) msg = data['msg'] request_id = data['request_choices'] if 'request_choices' in data else 'new' # See if the logged-in user has already asked for a ride from this person for asker in offer.askers: if asker.passenger == profile: messages.add_message( request, messages.ERROR, "You have already asked to join this ride." ) return render_to_response( 'ride_offer.html', locals(), context_instance=RequestContext(request) ) # Get or create the RideRequest if request_id == 'new': req = RideRequest.objects.create( passenger = profile, start = offer.start, end = offer.end, message = msg, date = offer.date ) request_id = req.id profile.requests.append( req ) profile.save() else: req = RideRequest.objects.get( pk=ObjectId(request_id) ) req.message = msg req.save() # Stuff that we append to the message accept_link = '%s%s'%( _hostname(), reverse( 'process_ask_for_ride', args=('accept', offer.id, request_id) ) ) decline_link = '%s%s'%( _hostname(), reverse( 'process_ask_for_ride', args=('decline', offer.id, request_id) ) ) appended = render_message( "taxi/static/emails/ask_for_ride_accept_or_decline.txt", locals() ) msg = "\r\n".join( (msg,30*'-',appended) ) # Save this asker in the offer's 'askers' field offer.askers.append( req ) offer.save() dest_email = offer.driver.user.username subject = "{} {} is asking you for a ride!".format( request.user.first_name, request.user.last_name ) send_email( email_to=dest_email, email_body=msg, email_subject=subject ) messages.add_message( request, messages.SUCCESS, "Your request has been sent successfully." ) return HttpResponseRedirect( reverse("browse") )
def offer_ride( request ): ''' Sends an offer for a ride to someone who has made a RideRequest ''' data = request.POST profile = request.session.get("profile") req = RideRequest.objects.get( pk=ObjectId(data['request_id']) ) msg = data['msg'] offer_choices = data['offer_choices'] if 'offer_choices' in data else 'new' # Can't offer twice for asker in req.askers: if asker.driver == profile: messages.add_message( request, messages.ERROR, "You have already offered a ride to this person" ) return render_to_response( 'ride_request.html', locals(), context_instance=RequestContext(request) ) # Get or create the offer that this request should be associated with if offer_choices == 'new': offer = RideOffer.objects.create( driver = profile, start = req.start, end = req.end, date = req.date, message = msg ) profile.offers.append( offer ) profile.save() else: offer = RideOffer.objects.get( pk=ObjectId(offer_choices) ) offer.message = msg offer.save() # Message to be sent to the passenger accept_link = '%s%s'%( _hostname(), reverse( 'process_offer_ride', args=('accept', offer.id, req.id) ) ) decline_link = '%s%s'%( _hostname(), reverse( 'process_offer_ride', args=('decline', offer.id, req.id) ) ) appended = render_message( 'taxi/static/emails/offer_ride_accept_or_decline.txt', locals() ) msg = "\r\n".join( (msg,30*'-',appended) ) # Save this asker in the offer's 'askers' field req.askers.append( offer ) req.save() dest_email = req.passenger.user.username subject = "{} can drive you to {}".format( profile, req.end ) send_email( email_to=dest_email, email_body=msg, email_subject=subject ) messages.add_message( request, messages.SUCCESS, "Your offer has been sent successfully." ) return HttpResponseRedirect( reverse("browse") )
def cancel_ride(request, ride_id): ''' Render and process a RideRequest/RideOffer cancellation ''' try: ride_offer = RideOffer.objects.get(pk=ObjectId(ride_id)) driver = ride_offer.driver except (RideOffer.DoesNotExist): driver = None try: ride_request = RideRequest.objects.get(pk=ObjectId(ride_id)) rider = ride_request.passenger except (RideRequest.DoesNotExist): rider = None # confirm correct user profile = request.session.get('profile') if not profile in (driver,rider): raise PermissionDenied # Form has been submitted, else... if request.method == 'POST': form = CancellationForm(request.POST) # Check for valid form if form.is_valid(): data = form.cleaned_data try: req = RideRequest.objects.get(pk=ObjectId(ride_id)) except RideRequest.DoesNotExist: req = None try: offer = RideOffer.objects.get(pk=ObjectId(ride_id)) except RideOffer.DoesNotExist: offer = None if req is not None: reason_msg = data['reason'] email_message = render_message( "taxi/static/emails/passenger_cancelled.txt", locals() ) if req.offer: send_email( email_subject='Rider Cancellation', email_to=req.offer.driver.user.username, email_body=email_message ) #user_id = req. req.delete() elif offer is not None: reason_msg = data['reason'] for passenger in offer.passengers: email_message = render_message( "taxi/static/emails/driver_cancelled.txt", locals() ) send_email( email_subject='Ride Cancellation', email_to=passenger.user.username, email_body=email_message ) for each_ride in RideRequest.objects.filter(ride_offer=offer): each_ride.ride_offer = None each_ride.save() offer.delete() return HttpResponseRedirect( reverse('user_landing') ) return render_to_response('cancel_ride.html', locals(), context_instance=RequestContext(request)) if driver: if not ride_offer.passengers: ride_offer.delete() return HttpResponseRedirect( reverse('user_landing') ) elif rider: if not ride_request.ride_offer: ride_request.delete() return HttpResponseRedirect( reverse('user_landing') ) form = CancellationForm(initial={'ride_id':ride_id}) return render_to_response('cancel_ride.html', locals(), context_instance=RequestContext(request))