123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- from pyramid.config import Configurator
-
- from tracim.lib.core.content import ContentApi
- from tracim.lib.utils.authorization import require_same_user_or_profile
- from tracim.models import Group
-
- try: # Python 3.5+
- from http import HTTPStatus
- except ImportError:
- from http import client as HTTPStatus
-
- from tracim import hapic, TracimRequest
-
- from tracim.lib.core.workspace import WorkspaceApi
- from tracim.views.controllers import Controller
- from tracim.views.core_api.schemas import UserIdPathSchema, ReadStatusSchema, \
- ContentIdsQuerySchema
- from tracim.views.core_api.schemas import NoContentSchema
- from tracim.views.core_api.schemas import UserWorkspaceIdPathSchema
- from tracim.views.core_api.schemas import UserWorkspaceAndContentIdPathSchema
- from tracim.views.core_api.schemas import ContentDigestSchema
- from tracim.views.core_api.schemas import ActiveContentFilterQuerySchema
- from tracim.views.core_api.schemas import WorkspaceDigestSchema
- from tracim.models.contents import ContentTypeLegacy as ContentType
-
- USER_ENDPOINTS_TAG = 'Users'
-
-
- class UserController(Controller):
-
- @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
- @require_same_user_or_profile(Group.TIM_ADMIN)
- @hapic.input_path(UserIdPathSchema())
- @hapic.output_body(WorkspaceDigestSchema(many=True),)
- def user_workspace(self, context, request: TracimRequest, hapic_data=None):
- """
- Get list of user workspaces
- """
- app_config = request.registry.settings['CFG']
- wapi = WorkspaceApi(
- current_user=request.candidate_user, # User
- session=request.dbsession,
- config=app_config,
- )
-
- workspaces = wapi.get_all_for_user(request.candidate_user)
- return [
- wapi.get_workspace_with_context(workspace)
- for workspace in workspaces
- ]
-
- @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
- @require_same_user_or_profile(Group.TIM_ADMIN)
- @hapic.input_path(UserWorkspaceIdPathSchema())
- @hapic.input_query(ActiveContentFilterQuerySchema())
- @hapic.output_body(ContentDigestSchema(many=True))
- def last_active_content(self, context, request: TracimRequest, hapic_data=None): # nopep8
- """
- Get last_active_content for user
- """
- app_config = request.registry.settings['CFG']
- content_filter = hapic_data.query
- api = ContentApi(
- current_user=request.candidate_user, # User
- session=request.dbsession,
- config=app_config,
- )
- wapi = WorkspaceApi(
- current_user=request.candidate_user, # User
- session=request.dbsession,
- config=app_config,
- )
- workspace = None
- if hapic_data.path.workspace_id:
- workspace = wapi.get_one(hapic_data.path.workspace_id)
- last_actives = api.get_last_active(
- workspace=workspace,
- limit=content_filter.limit or None,
- before_datetime=content_filter.before_datetime or None,
- )
- return [
- api.get_content_in_context(content)
- for content in last_actives
- ]
-
- @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
- @require_same_user_or_profile(Group.TIM_ADMIN)
- @hapic.input_path(UserWorkspaceIdPathSchema())
- @hapic.input_query(ContentIdsQuerySchema(), as_list=['contents_ids'])
- @hapic.output_body(ReadStatusSchema(many=True)) # nopep8
- def contents_read_status(self, context, request: TracimRequest, hapic_data=None): # nopep8
- """
- get user_read status of contents
- """
- app_config = request.registry.settings['CFG']
- content_filter = hapic_data.query
- api = ContentApi(
- current_user=request.candidate_user, # User
- session=request.dbsession,
- config=app_config,
- )
- wapi = WorkspaceApi(
- current_user=request.candidate_user, # User
- session=request.dbsession,
- config=app_config,
- )
- workspace = None
- if hapic_data.path.workspace_id:
- workspace = wapi.get_one(hapic_data.path.workspace_id)
- last_actives = api.get_last_active(
- workspace=workspace,
- limit=None,
- before_datetime=None,
- content_ids=hapic_data.query.contents_ids or None
- )
- return [
- api.get_content_in_context(content)
- for content in last_actives
- ]
-
- @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
- @require_same_user_or_profile(Group.TIM_ADMIN)
- @hapic.input_path(UserWorkspaceAndContentIdPathSchema())
- @hapic.output_body(NoContentSchema(), default_http_code=HTTPStatus.NO_CONTENT) # nopep8
- def set_content_as_read(self, context, request: TracimRequest, hapic_data=None): # nopep8
- """
- set user_read status of content to read
- """
- app_config = request.registry.settings['CFG']
- api = ContentApi(
- current_user=request.candidate_user,
- session=request.dbsession,
- config=app_config,
- )
- api.mark_read(request.current_content, do_flush=True)
- return
-
- @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
- @require_same_user_or_profile(Group.TIM_ADMIN)
- @hapic.input_path(UserWorkspaceAndContentIdPathSchema())
- @hapic.output_body(NoContentSchema(), default_http_code=HTTPStatus.NO_CONTENT) # nopep8
- def set_content_as_unread(self, context, request: TracimRequest, hapic_data=None): # nopep8
- """
- set user_read status of content to unread
- """
- app_config = request.registry.settings['CFG']
- api = ContentApi(
- current_user=request.candidate_user,
- session=request.dbsession,
- config=app_config,
- )
- api.mark_unread(request.current_content, do_flush=True)
- return
-
- @hapic.with_api_doc(tags=[USER_ENDPOINTS_TAG])
- @require_same_user_or_profile(Group.TIM_ADMIN)
- @hapic.input_path(UserWorkspaceIdPathSchema())
- @hapic.output_body(NoContentSchema(), default_http_code=HTTPStatus.NO_CONTENT) # nopep8
- def set_workspace_as_read(self, context, request: TracimRequest, hapic_data=None): # nopep8
- """
- set user_read status of all content of workspace to read
- """
- app_config = request.registry.settings['CFG']
- api = ContentApi(
- current_user=request.candidate_user,
- session=request.dbsession,
- config=app_config,
- )
- api.mark_read__workspace(request.current_workspace)
- return
-
- def bind(self, configurator: Configurator) -> None:
- """
- Create all routes and views using pyramid configurator
- for this controller
- """
-
- # user worskpace
- configurator.add_route('user_workspace', '/users/{user_id}/workspaces', request_method='GET') # nopep8
- configurator.add_view(self.user_workspace, route_name='user_workspace')
-
- # user content
- configurator.add_route('contents_read_status', '/users/{user_id}/workspaces/{workspace_id}/contents/read_status', request_method='GET') # nopep8
- configurator.add_view(self.contents_read_status, route_name='contents_read_status') # nopep8
- # last active content for user
- configurator.add_route('last_active_content', '/users/{user_id}/workspaces/{workspace_id}/contents/recently_active', request_method='GET') # nopep8
- configurator.add_view(self.last_active_content, route_name='last_active_content') # nopep8
-
- # set content as read/unread
- configurator.add_route('read_content', '/users/{user_id}/workspaces/{workspace_id}/contents/{content_id}/read', request_method='PUT') # nopep8
- configurator.add_view(self.set_content_as_read, route_name='read_content') # nopep8
- configurator.add_route('unread_content', '/users/{user_id}/workspaces/{workspace_id}/contents/{content_id}/unread', request_method='PUT') # nopep8
- configurator.add_view(self.set_content_as_unread, route_name='unread_content') # nopep8
-
- # set workspace as read
- configurator.add_route('read_workspace', '/users/{user_id}/workspaces/{workspace_id}/read', request_method='PUT') # nopep8
- configurator.add_view(self.set_workspace_as_read, route_name='read_workspace') # nopep8
|