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