decorators.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import functools
  2. import collections
  3. def standardize_api_response(function):
  4. """ Creates a standardized response. This function should be used as a deco
  5. rator.
  6. :function: The function decorated should return a dict with one of
  7. the keys bellow:
  8. success -> GET, 200
  9. error -> Bad Request, 400
  10. created -> POST, 201
  11. updated -> PUT, 200
  12. deleted -> DELETE, 200
  13. no-data -> No Content, 204
  14. :returns: json.dumps(response), staus code
  15. """
  16. available_result_keys = [
  17. 'success', 'error', 'created', 'updated', 'deleted', 'no-data']
  18. status_code_and_descriptions = {
  19. 'success': (200, 'Successful Operation'),
  20. 'error': (400, 'Bad Request'),
  21. 'created': (201, 'Successfully created'),
  22. 'updated': (200, 'Successfully updated'),
  23. 'deleted': (200, 'Successfully deleted'),
  24. 'no-data': (204, '')
  25. }
  26. @functools.wraps(function)
  27. def make_response(*args, **kwargs):
  28. result = function(*args, **kwargs)
  29. if not set(available_result_keys) & set(result):
  30. raise ValueError('Invalid result key.')
  31. status_code, description = status_code_and_descriptions[
  32. next(iter(result.keys()))
  33. ]
  34. status_code = ('status_code', status_code)
  35. description = (
  36. ('description', description) if status_code[1] != 400 else
  37. ('error', description)
  38. )
  39. data = (
  40. ('data', next(iter(result.values()))) if status_code[1] != 204 else
  41. ('data', '')
  42. )
  43. return collections.OrderedDict([
  44. status_code, description, data]), status_code[-1]
  45. return make_response