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