def process_request(request_id, user_id): try: request = TaxiRequest.objects.get(id=request_id) except TaxiRequest.DoesNotExist as e: # TODO: log this return cars = User.objects.select_related( 'profile' ).prefetch_related( Prefetch('crequests') ).annotate( distance=Distance('profile__point', request.point) ).filter( profile__type=0, distance__lte=settings.DISTANCE, ).exclude( crequests__status=TaxiRequest.RUNNING ).distinct().order_by('-distance') if cars: request.car = cars[0] request.status = TaxiRequest.RUNNING request.save(update_fields=('car', 'status')) log_action(request, user_id, message='Run') else: request.status = TaxiRequest.QUEUED request.save(update_fields=('status',)) log_action(request, user_id, message='Queued')
def process_queued_requests(): requests = TaxiRequest.objects.filter(status=TaxiRequest.QUEUED) if not requests: return for request in requests: cars = User.objects.select_related( 'profile' ).prefetch_related( Prefetch('crequests') ).annotate( distance=Distance('profile__point', request.point) ).filter( profile__type=0, distance__lte=settings.DISTANCE, ).exclude( crequests__status=TaxiRequest.RUNNING ).distinct().order_by('-distance') if cars: request.car = cars[0] request.status = TaxiRequest.RUNNING request.save(update_fields=('car', 'status')) log_action(request, request.passenger_id, message='Queued') else: break
def perform_update(self, serializer): profile = serializer.instance.profile profile.point = Point(serializer.validated_data['profile']['point']['get_x'], serializer.validated_data['profile']['point']['get_y']) profile.save(update_fields=('point',)) log_action(serializer.instance, self.request.user.id, message='Updated point')