Example #1
0
 def match_proposal(self,propID):
     """
     This operation try to match the specified proposal with each request of the DB
     
     @pre : offermanager_port has been initialized and is the port of the OfferManager module
            propId is the id of a proposal in the database
            
     @post : DB has not been modified.
             for each request matching the specified proposal, a message is sent to OfferManager through its port:
                 ('buildoffer',requestID,proposalID) with requestID, the database ID of the matching request
     """
     infos=Proposal.objects.get(id=propID)
     requests=Request.objects.filter(nb_requested_seats__lte=infos.number_of_seats, status='P')
     for request in requests:
         found = False
         for offer in Offer.objects.filter(request=request):
             if Ride.objects.filter(offer=offer):
                 found=True
                 break
         if not found:
             route_points = RoutePoints.objects.filter(proposal=infos).order_by('order')
             valid_pair = list()
             for i in xrange(len(route_points)-1):
                 if get_distance((request.departure_point_lat,request.departure_point_long),(route_points[i].latitude,route_points[i].longitude))<request.departure_range:
                     for j in range(i+1,len(route_points)):
                         if get_distance((request.arrival_point_lat,request.arrival_point_long),(route_points[j].latitude,route_points[j].longitude))<request.arrival_range:
                             valid_pair.append((i,j))
             for (i,j) in valid_pair:
                 #delete all not in time arrival
                 if total_seconds(abs(get_time_at_point([(r.latitude,r.longitude) for r in route_points],j,infos.departure_time,infos.arrival_time)-request.arrival_time)) < request.max_delay:
                     self.send_to(self.offermanager_port, ('buildoffer',
                                  request.id,
                                  infos.id, 
                                  (
                                     route_points[i].latitude,
                                     route_points[i].longitude,
                                     get_time_at_point([(r.latitude,r.longitude) for r in route_points], 
                                                         i,
                                                         infos.departure_time,
                                                         infos.arrival_time),
                                     route_points[i].id
                                  ),
                                  (
                                     route_points[j].latitude,
                                     route_points[j].longitude,
                                     get_time_at_point([(r.latitude,r.longitude) for r in route_points],
                                                         j,
                                                         infos.departure_time,infos.arrival_time),
                                     route_points[j].id
                                   )
                             ))
Example #2
0
def match_request(requestID):
    """
    This operation try to match the specified proposal with each request of the DB
    
    @pre : DB has been initialized and is the SQL database
    offermanager_port has been initialized and is the port of the OfferManager module
    
    requestId is the id of a request in the database
    
    @post : DB has not been modified.
    for each proposal matching the specified request, a message is sent to OfferManager through its port:
    ('buildoffer',requestID,proposalID) with proposalID, the database ID of the matching proposal
    """
    request=Request.objects.get(id=requestID)
    proposals=Proposal.objects.filter(number_of_seats__gte=request.nb_requested_seats)
    for infos in proposals:
        route_points = RoutePoints.objects.filter(proposal=infos).order_by('order')
        valid_pair = list()
        for i in xrange(len(route_points)-2):
            if get_distance((request.departure_point.latitude,request.departure_point.longitude),(route_points[i].latitude,route_points[i].longitude))<request.departure_range:
                for j in range(i+1,len(route_points)):
                    if get_distance((request.arrival_point.latitude,request.arrival_point.longitude),(route_points[j].latitude,route_points[j].longitude))<request.arrival_range:
                        valid_pair.append((i,j))
        for (i,j) in valid_pair:
            #delete all not in time arrival
            if total_seconds(abs(get_time_at_point([(r.latitude,r.longitude) for r in route_points],j,infos.departure_time,infos.arrival_time)-request.arrival_time)) < request.max_delay:
                build_offer(requestID,
                            infos.id,
                            (
                                route_points[i].latitude,
                                route_points[i].longitude,
                                get_time_at_point([(r.latitude,r.longitude) for r in route_points],
                                               i,infos.departure_time,infos.arrival_time),
                                route_points[i].id
                            ),
                            (
                                route_points[j].latitude,
                                route_points[j].longitude,
                                get_time_at_point([(r.latitude,r.longitude) for r in route_points],
                                               j,infos.departure_time,infos.arrival_time),
                                route_points[j].id
                             ))
Example #3
0
def myrides(request, global_address_cache=None):
    
    if not request.user.is_authenticated():
        return redirect('/home/')        
    
    user = UserProfile.objects.get(user=request.user)
    info_rides = []
    
    three_days_ago = datetime.datetime.today() - datetime.timedelta(days=3)
    for prop in Proposal.objects.filter(user=user, status='P', departure_time__gt=three_days_ago):
        
        ol1 = Offer.objects.filter(proposal=prop, status='A') # every future offer accepted by both where the user is the driver
        ol2 = Offer.objects.filter(proposal=prop, status='F') # every offer finished where the user is the driver
        ol3 = Offer.objects.filter(proposal=prop, status='C') # every offer cancelled where the user is the driver
        offer_list = ol1 | ol2 | ol3
        for of in offer_list:
            
            ride = Ride.objects.filter(offer=of)
            
            if len(ride) == 1:
                ride = ride[0]
                route_points = of.proposal.routepoints_set.all()
                index_pickup = 0
                index_drop = 0
                for i in xrange(len(route_points)):
                    if route_points[i].latitude == of.pickup_point.latitude and route_points[i].longitude == of.pickup_point.longitude:
                        index_pickup = i
                    if route_points[i].latitude == of.drop_point.latitude and route_points[i].longitude == of.drop_point.longitude:
                        index_drop = i
                
                date_pick = utils.get_time_at_point([(el.latitude,el.longitude) for el in route_points],
                                                index_pickup,
                                                of.proposal.departure_time,
                                                of.proposal.arrival_time)
                
                date_drop = utils.get_time_at_point([(el.latitude,el.longitude) for el in route_points],
                                                index_drop,
                                                of.proposal.departure_time,
                                                of.proposal.arrival_time)
                
                
                pick_point = global_address_cache.get_address((of.pickup_point.latitude, of.pickup_point.longitude))
                drop_point = global_address_cache.get_address((of.drop_point.latitude, of.drop_point.longitude))
                
                infos = {
                    'driver':True, 'other':of.request.user,
                    'date_pick':date_pick, 'pick_point': pick_point,
                    'date_drop':date_drop, 'drop_point': drop_point,
                    'fee': of.total_fee, 'id':ride.id,
                    'nb_seat': of.request.nb_requested_seats, 'status':of.status
                }

                insert_ride(info_rides, infos)
                


    for req in Request.objects.filter(user=user, status='P', arrival_time__gt=three_days_ago):
        
        ol1 = Offer.objects.filter(request=req, status='A') # every future offer accepted by both where the user is the passenger
        ol2 = Offer.objects.filter(request=req, status='F') # every offer finished where the user is the passenger
        ol3 = Offer.objects.filter(request=req, status='C') # every offer cancelled where the user is the passenger
        offer_list = ol1 | ol2 | ol3
        for of in offer_list:
            ride = Ride.objects.filter(offer=of)    
    
            if len(ride) == 1:
                ride = ride[0]
                route_points = of.proposal.routepoints_set.all()
                
                index_pickup = 0
                index_drop = 0
                for i in xrange(len(route_points)):
                    if route_points[i].latitude == of.pickup_point.latitude and route_points[i].longitude == of.pickup_point.longitude:
                        index_pickup = i
                    if route_points[i].latitude == of.drop_point.latitude and route_points[i].longitude == of.drop_point.longitude:
                        index_drop = i
                
                
                date_pick = utils.get_time_at_point([(el.latitude,el.longitude) for el in route_points],
                                                index_pickup,
                                                of.proposal.departure_time,
                                                of.proposal.arrival_time)
                
                date_drop = utils.get_time_at_point([(el.latitude,el.longitude) for el in route_points],
                                                index_drop,
                                                of.proposal.departure_time,
                                                of.proposal.arrival_time)
                
                pick_point = global_address_cache.get_address((of.pickup_point.latitude,of.pickup_point.longitude))
                drop_point = global_address_cache.get_address((of.drop_point.latitude,of.drop_point.longitude))
                
                infos = {
                    'driver':False, 'other':of.proposal.user,
                    'date_pick':date_pick, 'pick_point': pick_point,
                    'date_drop':date_drop, 'drop_point': drop_point,
                    'fee': of.total_fee, 'id':ride.id,
                    'nb_seat': of.request.nb_requested_seats, 'status':of.status
                }

                insert_ride(info_rides, infos)
       
    if WaitCallbacksRide.message_present(request.user):
        notification = WaitCallbacksRide.get_message(user)
        WaitCallbacksRide.erase_message(user)
    return render_to_response('myrides.html', locals())
Example #4
0
def myoffers(request, global_address_cache=None):
    if not request.user.is_authenticated():
        return redirect('/home/')
    
    user = UserProfile.objects.get(user=request.user)
    info_offers = []
    
    for prop in user.proposal_set.all():
        new_offers = Offer.objects.filter(proposal=prop, status='P', pickup_time__gt=datetime.datetime.today())
        for of in new_offers:
            
            associated_req = of.request
            associated_offers = Offer.objects.filter(request = associated_req)
            display = True
            for other_of in associated_offers:
                if other_of.status == 'A':
                    display = False
                    break
            
            if display:
                route_points = of.proposal.routepoints_set.all()
                index_pickup = 0
                index_drop = 0
                for i in xrange(len(route_points)):
                    if route_points[i].latitude == of.pickup_point.latitude and route_points[i].longitude == of.pickup_point.longitude:
                        index_pickup = i
                    if route_points[i].latitude == of.drop_point.latitude and route_points[i].longitude == of.drop_point.longitude:
                        index_drop = i
                
                date_pick = utils.get_time_at_point([(el.latitude,el.longitude) for el in route_points],
                                                index_pickup,
                                                of.proposal.departure_time,
                                                of.proposal.arrival_time)
                
                
                date_drop = utils.get_time_at_point([(el.latitude,el.longitude) for el in route_points],
                                                index_drop,
                                                of.proposal.departure_time,
                                                of.proposal.arrival_time)
                
                
                pick_point = global_address_cache.get_address((of.pickup_point.latitude,of.pickup_point.longitude))
                drop_point = global_address_cache.get_address((of.drop_point.latitude,of.drop_point.longitude))
                infos = {
                    'driver':True, 'status':of.driver_ok, 'other':of.request.user,
                    'date_pick':date_pick, 'pick_point': pick_point,
                    'date_drop':date_drop, 'drop_point': drop_point,
                    'fee': of.total_fee, 'id':of.id, 'nb_seat': of.request.nb_requested_seats,
                }

                insert_offer(info_offers, infos)

            
    for req in user.request_set.all():
        new_offers = Offer.objects.filter(request=req, status='P', pickup_time__gt=datetime.datetime.today())
        for of in new_offers:
            associated_offers = Offer.objects.filter(request = req)
            display = True
            for other_of in associated_offers:
                if other_of.status == 'A':
                    display = False
                    break
            
            if display:
                route_points = of.proposal.routepoints_set.all()
                
                index_pickup = 0
                index_drop = 0
                for i in xrange(len(route_points)):
                    if route_points[i].latitude == of.pickup_point.latitude and route_points[i].longitude == of.pickup_point.longitude:
                        index_pickup = i
                    if route_points[i].latitude == of.drop_point.latitude and route_points[i].longitude == of.drop_point.longitude:
                        index_drop = i
                
                
                date_pick = utils.get_time_at_point([(el.latitude,el.longitude) for el in route_points],
                                                index_pickup,
                                                of.proposal.departure_time,
                                                of.proposal.arrival_time)
                
                date_drop = utils.get_time_at_point([(el.latitude,el.longitude) for el in route_points],
                                                index_drop,
                                                of.proposal.departure_time,
                                                of.proposal.arrival_time)
                
                pick_point = global_address_cache.get_address((of.pickup_point.latitude, of.pickup_point.longitude))
                drop_point = global_address_cache.get_address((of.drop_point.latitude, of.drop_point.longitude))

                infos = {
                    'driver':False, 'status':of.non_driver_ok, 'other':of.proposal.user,
                    'date_pick':date_pick, 'pick_point': pick_point,
                    'date_drop':date_drop, 'drop_point': drop_point,
                    'fee': of.total_fee, 'id':of.id, 'nb_seat': of.request.nb_requested_seats,
                }
                
                insert_offer(info_offers, infos)

    acc_bal = user.account_balance
    if WaitCallbacksOffer.message_present(request.user):
        notification = WaitCallbacksOffer.get_message(request.user)
        WaitCallbacksOffer.erase_message(request.user)
    return render_to_response('myoffers.html', locals())