Example #1
0
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') )
Example #2
0
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') )
Example #3
0
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") )
Example #4
0
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") )
Example #5
0
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))