Now return proper error payload on subsonic API

This commit is contained in:
Eliot Berriot 2018-05-10 17:31:49 +02:00
parent f5225d3285
commit 6f79dd475d
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
2 changed files with 29 additions and 16 deletions

View File

@ -15,6 +15,9 @@ class SubsonicJSONRenderer(renderers.JSONRenderer):
} }
} }
final['subsonic-response'].update(data) final['subsonic-response'].update(data)
if 'error' in final:
# an error was returned
final['subsonic-response']['status'] = 'failed'
return super().render(final, accepted_media_type, renderer_context) return super().render(final, accepted_media_type, renderer_context)
@ -31,6 +34,9 @@ class SubsonicXMLRenderer(renderers.JSONRenderer):
'version': '1.16.0', 'version': '1.16.0',
} }
final.update(data) final.update(data)
if 'error' in final:
# an error was returned
final['status'] = 'failed'
tree = dict_to_xml_tree('subsonic-response', final) tree = dict_to_xml_tree('subsonic-response', final)
return b'<?xml version="1.0" encoding="UTF-8"?>\n' + ET.tostring(tree, encoding='utf-8') return b'<?xml version="1.0" encoding="UTF-8"?>\n' + ET.tostring(tree, encoding='utf-8')

View File

@ -31,15 +31,19 @@ def find_object(queryset, model_field='pk', field='id', cast=int):
raw_value = data[field] raw_value = data[field]
except KeyError: except KeyError:
return response.Response({ return response.Response({
'error': {
'code': 10, 'code': 10,
'message': "required parameter '{}' not present".format(field) 'message': "required parameter '{}' not present".format(field)
}
}) })
try: try:
value = cast(raw_value) value = cast(raw_value)
except (TypeError, ValidationError): except (TypeError, ValidationError):
return response.Response({ return response.Response({
'error': {
'code': 0, 'code': 0,
'message': 'For input string "{}"'.format(raw_value) 'message': 'For input string "{}"'.format(raw_value)
}
}) })
qs = queryset qs = queryset
if hasattr(qs, '__call__'): if hasattr(qs, '__call__'):
@ -48,9 +52,11 @@ def find_object(queryset, model_field='pk', field='id', cast=int):
obj = qs.get(**{model_field: value}) obj = qs.get(**{model_field: value})
except qs.model.DoesNotExist: except qs.model.DoesNotExist:
return response.Response({ return response.Response({
'error': {
'code': 70, 'code': 70,
'message': '{} not found'.format( 'message': '{} not found'.format(
qs.model.__class__.__name__) qs.model.__class__.__name__)
}
}) })
kwargs['obj'] = obj kwargs['obj'] = obj
return func(self, request, *args, **kwargs) return func(self, request, *args, **kwargs)
@ -83,11 +89,10 @@ class SubsonicViewSet(viewsets.GenericViewSet):
payload = { payload = {
'status': 'failed' 'status': 'failed'
} }
try: if exc.__class__ in mapping:
code, message = mapping[exc.__class__] code, message = mapping[exc.__class__]
except KeyError:
return super().handle_exception(exc)
else: else:
return super().handle_exception(exc)
payload['error'] = { payload['error'] = {
'code': code, 'code': code,
'message': message 'message': message
@ -450,8 +455,10 @@ class SubsonicViewSet(viewsets.GenericViewSet):
name = data.get('name', '') name = data.get('name', '')
if not name: if not name:
return response.Response({ return response.Response({
'error': {
'code': 10, 'code': 10,
'message': 'Playlist ID or name must be specified.' 'message': 'Playlist ID or name must be specified.'
}
}, data) }, data)
playlist = request.user.playlists.create( playlist = request.user.playlists.create(