Example #1
0
    def post(self, request, *args, **kwargs):
        # request.body already confirmed to be a valid json dict in ZiplineOrderStatusView
        data = json.loads(request.body.decode('utf-8'))

        try:
            self.validate_and_clean_int(data, 'orderId')
            self.validate_and_clean_timestamp(data, 'timestamp')
        except OrderStatusValidationError as e:
            return get_error_response(e.error_message)

        order_id = data['orderId']

        with CriticalSection([get_order_update_critical_section_key(order_id)]), transaction.atomic():
            try:
                order = EmergencyOrder.objects.get(pk=order_id)
            except EmergencyOrder.DoesNotExist:
                return get_error_response('Order not found')

            if order.domain != self.domain:
                return get_error_response('Order not found')

            try:
                self.validate_and_clean_payload(order, data)
            except OrderStatusValidationError as e:
                return get_error_response(e.error_message)

            send_sms_response, response_dict = self.process_status_update(order, data)

        if send_sms_response:
            # This should be done outside of the transaction to prevent issues with QueuedSMS pk's
            # being available immediately.
            self.send_sms_for_status_update(order, data)

        return JsonResponse(response_dict)
Example #2
0
    def post(self, request, *args, **kwargs):
        # request.body already confirmed to be a valid json dict in ZiplineOrderStatusView
        data = json.loads(request.body)

        try:
            self.validate_and_clean_int(data, 'orderId')
            self.validate_and_clean_timestamp(data, 'timestamp')
        except OrderStatusValidationError as e:
            return get_error_response(e.error_message)

        order_id = data['orderId']

        with CriticalSection([get_order_update_critical_section_key(order_id)]), transaction.atomic():
            try:
                order = EmergencyOrder.objects.get(pk=order_id)
            except EmergencyOrder.DoesNotExist:
                return get_error_response('Order not found')

            if order.domain != self.domain:
                return get_error_response('Order not found')

            try:
                self.validate_and_clean_payload(order, data)
            except OrderStatusValidationError as e:
                return get_error_response(e.error_message)

            send_sms_response, response_dict = self.process_status_update(order, data)

        if send_sms_response:
            # This should be done outside of the transaction to prevent issues with QueuedSMS pk's
            # being available immediately.
            self.send_sms_for_status_update(order, data)

        return JsonResponse(response_dict)
Example #3
0
def send_emergency_order_request(order_id, attempt=1):
    try:
        with CriticalSection([get_order_update_critical_section_key(order_id)],
                             timeout=(REQUEST_TIMEOUT + 10)):
            order = EmergencyOrder.objects.get(pk=order_id)
            order.status = _send_emergency_order_request(order, attempt)
            order.save()
    except Exception as e:
        notify_exception(None,
                         message='[ZIPLINE] Error while sending order',
                         details={
                             'order_id': order_id,
                             'attempt': attempt,
                         })
        create_error_record(order, 'Internal error: {}'.format(str(e)))
        handle_emergency_order_request_retry(order, attempt)
Example #4
0
def send_emergency_order_request(order_id, attempt=1):
    try:
        with CriticalSection(
            [get_order_update_critical_section_key(order_id)],
            timeout=(REQUEST_TIMEOUT + 10)
        ):
            order = EmergencyOrder.objects.get(pk=order_id)
            order.status = _send_emergency_order_request(order, attempt)
            order.save()
    except Exception as e:
        notify_exception(
            None,
            message='[ZIPLINE] Error while sending order',
            details={
                'order_id': order_id,
                'attempt': attempt,
            }
        )
        create_error_record(order, 'Internal error: {}'.format(str(e)))
        handle_emergency_order_request_retry(order, attempt)