wcs: explicite wcs response on WcsApiError (#78967)

This commit is contained in:
Nicolas Roche 2023-06-26 14:41:42 +02:00 committed by Nicolas Roche
parent 16fd6aae41
commit a8bab7fa01
4 changed files with 32 additions and 8 deletions

View File

@ -4486,12 +4486,16 @@ class Subscription(models.Model):
try:
result = wcs_api.post_json(obj.wcs_trigger_payload, [], headers=headers)
except WcsApiError as e:
wcs_response = getattr(e.args[2], 'response', None)
if wcs_response is not None and wcs_response.status_code == 404:
if e.request_response is not None and e.request_response.status_code == 404:
try:
json_response = json.loads(e.request_response.text)
except ValueError:
self.resource.logger.warning(e)
return
# stop triggering a removed wcs demand
self.resource.logger.info(e)
obj.wcs_trigger_date = now()
obj.wcs_trigger_response = json.loads(e.args[2].response.text)
obj.wcs_trigger_response = json_response
obj.save()
else:
self.resource.logger.warning(e)

View File

@ -505,7 +505,7 @@ class SmartRequest(models.Model):
result = wcs_api.post_json(self.payload, [], headers=headers)
except WcsApiError as e:
try:
result = json.loads(e.args[3])
result = json.loads(e.request_response.text)
except ValueError:
return False
self.result = result

View File

@ -35,7 +35,14 @@ from passerelle.base import signature
class WcsApiError(Exception):
pass
def __init__(self, *args, **kwargs):
self.request_exception = kwargs.pop('request_exception')
self.__dict__.update(kwargs)
super().__init__(*args, **kwargs)
@property
def request_response(self):
return getattr(self.request_exception, 'response', None)
class JSONFile:
@ -573,7 +580,7 @@ class WcsApi:
response.raise_for_status()
except requests.RequestException as e:
content = getattr(getattr(e, 'response', None), 'content', None)
raise WcsApiError('GET request failed', final_url, e, content)
raise WcsApiError('GET request failed', final_url, e, content, request_exception=e)
else:
try:
return response.json()
@ -600,7 +607,7 @@ class WcsApi:
response.raise_for_status()
except requests.RequestException as e:
content = getattr(getattr(e, 'response', None), 'content', None)
raise WcsApiError('POST request failed', final_url, e, content)
raise WcsApiError('POST request failed', final_url, e, content, request_exception=e)
else:
try:
return response.json()

View File

@ -11371,6 +11371,19 @@ def test_trigger_wcs_api_error(family_service, activity_service, wcs_service, co
assert subscription.trigger_status() == 'triggering'
assert subscription.wcs_trigger_response is None
# bad wcs 404 response
wcs_service.add(
responses.POST,
'https://wcs.example.com/api/forms/exemple-inscription-loisirs-1/12/hooks/update_subscription/',
body='not a json content',
status=404,
)
con.hourly()
assert len([x for x in wcs_service.calls if '/hooks/' in x.request.url]) == 4
subscription = con.subscription_set.get(wcs_form_number='13-12')
assert subscription.trigger_status() == 'triggering'
assert subscription.wcs_trigger_response is None
# stop triggering a removed wcs demand
wcs_service.add(
responses.POST,
@ -11379,7 +11392,7 @@ def test_trigger_wcs_api_error(family_service, activity_service, wcs_service, co
status=404,
)
con.hourly()
assert len([x for x in wcs_service.calls if '/hooks/' in x.request.url]) == 4
assert len([x for x in wcs_service.calls if '/hooks/' in x.request.url]) == 5
subscription = con.subscription_set.get(wcs_form_number='13-12')
assert subscription.trigger_status() == 'triggered'
assert subscription.wcs_trigger_response == {'err': 1, 'err_class': 'Page non trouvée', 'err_desc': None}