session_controller.py 3.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. # coding=utf-8
  2. from pyramid.config import Configurator
  3. try: # Python 3.5+
  4. from http import HTTPStatus
  5. except ImportError:
  6. from http import client as HTTPStatus
  7. from tracim_backend import TracimRequest
  8. from tracim_backend.extensions import hapic
  9. from tracim_backend.lib.core.user import UserApi
  10. from tracim_backend.views.controllers import Controller
  11. from tracim_backend.views.core_api.schemas import UserSchema
  12. from tracim_backend.views.core_api.schemas import NoContentSchema
  13. from tracim_backend.views.core_api.schemas import LoginOutputHeaders
  14. from tracim_backend.views.core_api.schemas import BasicAuthSchema
  15. from tracim_backend.exceptions import NotAuthenticated
  16. from tracim_backend.exceptions import AuthenticationFailed
  17. SWAGGER_TAG__SESSION_ENDPOINTS = 'Session'
  18. class SessionController(Controller):
  19. @hapic.with_api_doc(tags=[SWAGGER_TAG__SESSION_ENDPOINTS])
  20. @hapic.input_headers(LoginOutputHeaders())
  21. @hapic.input_body(BasicAuthSchema())
  22. # TODO - G.M - 17-04-2018 - fix output header ?
  23. # @hapic.output_headers()
  24. @hapic.output_body(UserSchema(),)
  25. def login(self, context, request: TracimRequest, hapic_data=None):
  26. """
  27. Logs user into the system
  28. """
  29. login = hapic_data.body
  30. app_config = request.registry.settings['CFG']
  31. uapi = UserApi(
  32. None,
  33. session=request.dbsession,
  34. config=app_config,
  35. )
  36. user = uapi.authenticate_user(login.email, login.password)
  37. return uapi.get_user_with_context(user)
  38. @hapic.with_api_doc(tags=[SWAGGER_TAG__SESSION_ENDPOINTS])
  39. @hapic.output_body(NoContentSchema(), default_http_code=HTTPStatus.NO_CONTENT) # nopep8
  40. def logout(self, context, request: TracimRequest, hapic_data=None):
  41. """
  42. Logs out current logged in user session
  43. """
  44. return
  45. @hapic.with_api_doc(tags=[SWAGGER_TAG__SESSION_ENDPOINTS])
  46. @hapic.output_body(UserSchema(),)
  47. def whoami(self, context, request: TracimRequest, hapic_data=None):
  48. """
  49. Return current logged in user or 401
  50. """
  51. app_config = request.registry.settings['CFG']
  52. uapi = UserApi(
  53. request.current_user,
  54. session=request.dbsession,
  55. config=app_config,
  56. )
  57. user = uapi.get_current_user() # User
  58. return uapi.get_user_with_context(user)
  59. def bind(self, configurator: Configurator):
  60. # Login
  61. configurator.add_route('login', '/sessions/login', request_method='POST') # nopep8
  62. configurator.add_view(self.login, route_name='login')
  63. # Logout
  64. configurator.add_route('logout', '/sessions/logout', request_method='POST') # nopep8
  65. configurator.add_view(self.logout, route_name='logout')
  66. configurator.add_route('logout_get', '/sessions/logout', request_method='GET') # nopep8
  67. configurator.add_view(self.logout, route_name='logout_get')
  68. # Whoami
  69. configurator.add_route('whoami', '/sessions/whoami', request_method='GET') # nopep8
  70. configurator.add_view(self.whoami, route_name='whoami',)