example_api_controller.py 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. # -*- coding: utf-8 -*-
  2. # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this file
  3. from datetime import datetime
  4. try: # Python 3.5+
  5. from http import HTTPStatus
  6. except ImportError:
  7. from http import client as HTTPStatus
  8. from pyramid.config import Configurator
  9. from hapic.data import HapicData
  10. from tracim.exceptions import InsufficientUserWorkspaceRole, NotAuthentificated
  11. from tracim.extensions import hapic
  12. from tracim.lib.utils.authorization import require_workspace_role
  13. from tracim.models.data import UserRoleInWorkspace
  14. from tracim.views.controllers import Controller
  15. from tracim.views.example_api.schema import *
  16. class ExampleApiController(Controller):
  17. @hapic.with_api_doc()
  18. @hapic.output_body(AboutResponseSchema())
  19. def about(self, context, request):
  20. """
  21. General information about this API.
  22. """
  23. return {
  24. 'version': '1.2.3',
  25. 'datetime': datetime(2017, 12, 7, 10, 55, 8, 488996),
  26. }
  27. @hapic.handle_exception(
  28. NotAuthentificated,
  29. http_code=HTTPStatus.BAD_REQUEST
  30. )
  31. @hapic.with_api_doc()
  32. @hapic.output_body(ListsUserSchema())
  33. @require_workspace_role(UserRoleInWorkspace.READER)
  34. def get_users(self, context, request):
  35. """
  36. Obtain users list.
  37. """
  38. return {
  39. 'item_nb': 1,
  40. 'items': [
  41. {
  42. 'id': 4,
  43. 'username': 'some_user',
  44. 'display_name': 'Damien Accorsi',
  45. 'company': 'Algoo',
  46. },
  47. ],
  48. 'pagination': {
  49. 'first_id': 0,
  50. 'last_id': 5,
  51. 'current_id': 0,
  52. }
  53. }
  54. @hapic.with_api_doc()
  55. @hapic.input_path(UserPathSchema())
  56. @hapic.output_body(UserSchema())
  57. def get_user(self, context, request, hapic_data: HapicData):
  58. """
  59. Obtain one user
  60. """
  61. return {
  62. 'id': 4,
  63. 'username': 'some_user',
  64. 'email_address': 'some.user@hapic.com',
  65. 'first_name': 'Damien',
  66. 'last_name': 'Accorsi',
  67. 'display_name': 'Damien Accorsi',
  68. 'company': 'Algoo',
  69. }
  70. @hapic.with_api_doc()
  71. # TODO - G.M - 2017-12-5 - Support input_forms ?
  72. # TODO - G.M - 2017-12-5 - Support exclude, only ?
  73. @hapic.input_body(UserSchema(exclude=('id',)))
  74. @hapic.output_body(UserSchema())
  75. def add_user(self, context, request, hapic_data: HapicData):
  76. """
  77. Add new user
  78. """
  79. return {
  80. 'id': 4,
  81. 'username': 'some_user',
  82. 'email_address': 'some.user@hapic.com',
  83. 'first_name': 'Damien',
  84. 'last_name': 'Accorsi',
  85. 'display_name': 'Damien Accorsi',
  86. 'company': 'Algoo',
  87. }
  88. @hapic.with_api_doc()
  89. @hapic.output_body(NoContentSchema(),
  90. default_http_code=204)
  91. @hapic.input_path(UserPathSchema())
  92. def del_user(self, context, request, hapic_data: HapicData):
  93. """
  94. delete user
  95. """
  96. return NoContentSchema()
  97. def bind(self, configurator: Configurator):
  98. configurator.add_route('about', '/about', request_method='GET')
  99. configurator.add_view(self.about, route_name='about', renderer='json')
  100. configurator.add_route('get_users', '/users', request_method='GET') # nopep8
  101. configurator.add_view(self.get_users, route_name='get_users', renderer='json') # nopep8
  102. configurator.add_route('get_user', '/users/{id}', request_method='GET') # nopep8
  103. configurator.add_view(self.get_user, route_name='get_user', renderer='json') # nopep8
  104. configurator.add_route('add_user', '/users/', request_method='POST') # nopep8
  105. configurator.add_view(self.add_user, route_name='add_user', renderer='json') # nopep8
  106. configurator.add_route('del_user', '/users/{id}', request_method='DELETE') # nopep8
  107. configurator.add_view(self.del_user, route_name='del_user', renderer='json') # nopep8