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 ) ))
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 ))
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())
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())