user_controller.py 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. from pyramid.config import Configurator
  2. from tracim.lib.core.content import ContentApi
  3. from tracim.lib.utils.authorization import require_same_user_or_profile
  4. from tracim.models import Group
  5. try: # Python 3.5+
  6. from http import HTTPStatus
  7. except ImportError:
  8. from http import client as HTTPStatus
  9. from tracim import hapic, TracimRequest
  10. from tracim.lib.core.workspace import WorkspaceApi
  11. from tracim.views.controllers import Controller
  12. from tracim.views.core_api.schemas import UserIdPathSchema, ReadStatusSchema, \
  13. ContentIdsQuerySchema
  14. from tracim.views.core_api.schemas import NoContentSchema
  15. from tracim.views.core_api.schemas import UserWorkspaceIdPathSchema
  16. from tracim.views.core_api.schemas import UserWorkspaceAndContentIdPathSchema
  17. from tracim.views.core_api.schemas import ContentDigestSchema
  18. from tracim.views.core_api.schemas import ActiveContentFilterQuerySchema
  19. from tracim.views.core_api.schemas import WorkspaceDigestSchema
  20. from tracim.models.contents import ContentTypeLegacy as ContentType
  21. USER_ENDPOINTS_TAG = 'Users'
  22. class UserController(Controller):
  23. @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
  24. @require_same_user_or_profile(Group.TIM_ADMIN)
  25. @hapic.input_path(UserIdPathSchema())
  26. @hapic.output_body(WorkspaceDigestSchema(many=True),)
  27. def user_workspace(self, context, request: TracimRequest, hapic_data=None):
  28. """
  29. Get list of user workspaces
  30. """
  31. app_config = request.registry.settings['CFG']
  32. wapi = WorkspaceApi(
  33. current_user=request.candidate_user, # User
  34. session=request.dbsession,
  35. config=app_config,
  36. )
  37. workspaces = wapi.get_all_for_user(request.candidate_user)
  38. return [
  39. wapi.get_workspace_with_context(workspace)
  40. for workspace in workspaces
  41. ]
  42. @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
  43. @require_same_user_or_profile(Group.TIM_ADMIN)
  44. @hapic.input_path(UserWorkspaceIdPathSchema())
  45. @hapic.input_query(ActiveContentFilterQuerySchema())
  46. @hapic.output_body(ContentDigestSchema(many=True))
  47. def last_active_content(self, context, request: TracimRequest, hapic_data=None): # nopep8
  48. """
  49. Get last_active_content for user
  50. """
  51. app_config = request.registry.settings['CFG']
  52. content_filter = hapic_data.query
  53. api = ContentApi(
  54. current_user=request.candidate_user, # User
  55. session=request.dbsession,
  56. config=app_config,
  57. )
  58. wapi = WorkspaceApi(
  59. current_user=request.candidate_user, # User
  60. session=request.dbsession,
  61. config=app_config,
  62. )
  63. workspace = None
  64. if hapic_data.path.workspace_id:
  65. workspace = wapi.get_one(hapic_data.path.workspace_id)
  66. last_actives = api.get_last_active(
  67. workspace=workspace,
  68. limit=content_filter.limit or None,
  69. before_datetime=content_filter.before_datetime or None,
  70. )
  71. return [
  72. api.get_content_in_context(content)
  73. for content in last_actives
  74. ]
  75. @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
  76. @require_same_user_or_profile(Group.TIM_ADMIN)
  77. @hapic.input_path(UserWorkspaceIdPathSchema())
  78. @hapic.input_query(ContentIdsQuerySchema(), as_list=['contents_ids'])
  79. @hapic.output_body(ReadStatusSchema(many=True)) # nopep8
  80. def contents_read_status(self, context, request: TracimRequest, hapic_data=None): # nopep8
  81. """
  82. get user_read status of contents
  83. """
  84. app_config = request.registry.settings['CFG']
  85. content_filter = hapic_data.query
  86. api = ContentApi(
  87. current_user=request.candidate_user, # User
  88. session=request.dbsession,
  89. config=app_config,
  90. )
  91. wapi = WorkspaceApi(
  92. current_user=request.candidate_user, # User
  93. session=request.dbsession,
  94. config=app_config,
  95. )
  96. workspace = None
  97. if hapic_data.path.workspace_id:
  98. workspace = wapi.get_one(hapic_data.path.workspace_id)
  99. last_actives = api.get_last_active(
  100. workspace=workspace,
  101. limit=None,
  102. before_datetime=None,
  103. content_ids=hapic_data.query.contents_ids or None
  104. )
  105. return [
  106. api.get_content_in_context(content)
  107. for content in last_actives
  108. ]
  109. @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
  110. @require_same_user_or_profile(Group.TIM_ADMIN)
  111. @hapic.input_path(UserWorkspaceAndContentIdPathSchema())
  112. @hapic.output_body(NoContentSchema(), default_http_code=HTTPStatus.NO_CONTENT) # nopep8
  113. def set_content_as_read(self, context, request: TracimRequest, hapic_data=None): # nopep8
  114. """
  115. set user_read status of content to read
  116. """
  117. app_config = request.registry.settings['CFG']
  118. api = ContentApi(
  119. current_user=request.candidate_user,
  120. session=request.dbsession,
  121. config=app_config,
  122. )
  123. api.mark_read(request.current_content, do_flush=True)
  124. return
  125. @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
  126. @require_same_user_or_profile(Group.TIM_ADMIN)
  127. @hapic.input_path(UserWorkspaceAndContentIdPathSchema())
  128. @hapic.output_body(NoContentSchema(), default_http_code=HTTPStatus.NO_CONTENT) # nopep8
  129. def set_content_as_unread(self, context, request: TracimRequest, hapic_data=None): # nopep8
  130. """
  131. set user_read status of content to unread
  132. """
  133. app_config = request.registry.settings['CFG']
  134. api = ContentApi(
  135. current_user=request.candidate_user,
  136. session=request.dbsession,
  137. config=app_config,
  138. )
  139. api.mark_unread(request.current_content, do_flush=True)
  140. return
  141. @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
  142. @require_same_user_or_profile(Group.TIM_ADMIN)
  143. @hapic.input_path(UserWorkspaceIdPathSchema())
  144. @hapic.output_body(NoContentSchema(), default_http_code=HTTPStatus.NO_CONTENT) # nopep8
  145. def set_workspace_as_read(self, context, request: TracimRequest, hapic_data=None): # nopep8
  146. """
  147. set user_read status of all content of workspace to read
  148. """
  149. app_config = request.registry.settings['CFG']
  150. api = ContentApi(
  151. current_user=request.candidate_user,
  152. session=request.dbsession,
  153. config=app_config,
  154. )
  155. api.mark_read__workspace(request.current_workspace)
  156. return
  157. def bind(self, configurator: Configurator) -> None:
  158. """
  159. Create all routes and views using pyramid configurator
  160. for this controller
  161. """
  162. # user worskpace
  163. configurator.add_route('user_workspace', '/users/{user_id}/workspaces', request_method='GET') # nopep8
  164. configurator.add_view(self.user_workspace, route_name='user_workspace')
  165. # user content
  166. configurator.add_route('contents_read_status', '/users/{user_id}/workspaces/{workspace_id}/contents/read_status', request_method='GET') # nopep8
  167. configurator.add_view(self.contents_read_status, route_name='contents_read_status') # nopep8
  168. # last active content for user
  169. configurator.add_route('last_active_content', '/users/{user_id}/workspaces/{workspace_id}/contents/recently_active', request_method='GET') # nopep8
  170. configurator.add_view(self.last_active_content, route_name='last_active_content') # nopep8
  171. # set content as read/unread
  172. configurator.add_route('read_content', '/users/{user_id}/workspaces/{workspace_id}/contents/{content_id}/read', request_method='PUT') # nopep8
  173. configurator.add_view(self.set_content_as_read, route_name='read_content') # nopep8
  174. configurator.add_route('unread_content', '/users/{user_id}/workspaces/{workspace_id}/contents/{content_id}/unread', request_method='PUT') # nopep8
  175. configurator.add_view(self.set_content_as_unread, route_name='unread_content') # nopep8
  176. # set workspace as read
  177. configurator.add_route('read_workspace', '/users/{user_id}/workspaces/{workspace_id}/read', request_method='PUT') # nopep8
  178. configurator.add_view(self.set_workspace_as_read, route_name='read_workspace') # nopep8