userworkspace.py 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. # -*- coding: utf-8 -*-
  2. import typing
  3. from tracim_backend.config import CFG
  4. from tracim_backend.models.context_models import UserRoleWorkspaceInContext
  5. from tracim_backend.models.roles import WorkspaceRoles
  6. __author__ = 'damien'
  7. from sqlalchemy.orm import Session
  8. from sqlalchemy.orm import Query
  9. from tracim_backend.models.auth import User
  10. from tracim_backend.models.data import Workspace
  11. from tracim_backend.models.data import UserRoleInWorkspace
  12. class RoleApi(object):
  13. # TODO - G.M - 29-06-2018 - [Cleanup] Drop this
  14. # ALL_ROLE_VALUES = UserRoleInWorkspace.get_all_role_values()
  15. # Dict containing readable members roles for given role
  16. # members_read_rights = {
  17. # UserRoleInWorkspace.NOT_APPLICABLE: [],
  18. # UserRoleInWorkspace.READER: [
  19. # UserRoleInWorkspace.WORKSPACE_MANAGER,
  20. # ],
  21. # UserRoleInWorkspace.CONTRIBUTOR: [
  22. # UserRoleInWorkspace.WORKSPACE_MANAGER,
  23. # UserRoleInWorkspace.CONTENT_MANAGER,
  24. # UserRoleInWorkspace.CONTRIBUTOR,
  25. # ],
  26. # UserRoleInWorkspace.CONTENT_MANAGER: [
  27. # UserRoleInWorkspace.WORKSPACE_MANAGER,
  28. # UserRoleInWorkspace.CONTENT_MANAGER,
  29. # UserRoleInWorkspace.CONTRIBUTOR,
  30. # UserRoleInWorkspace.READER,
  31. # ],
  32. # UserRoleInWorkspace.WORKSPACE_MANAGER: [
  33. # UserRoleInWorkspace.WORKSPACE_MANAGER,
  34. # UserRoleInWorkspace.CONTENT_MANAGER,
  35. # UserRoleInWorkspace.CONTRIBUTOR,
  36. # UserRoleInWorkspace.READER,
  37. # ],
  38. # }
  39. # TODO - G.M - 29-06-2018 - [Cleanup] Drop this
  40. # @classmethod
  41. # def role_can_read_member_role(cls, reader_role: int, tested_role: int) \
  42. # -> bool:
  43. # """
  44. # :param reader_role: role as viewer
  45. # :param tested_role: role as viwed
  46. # :return: True if given role can view member role in workspace.
  47. # """
  48. # if reader_role in cls.members_read_rights:
  49. # return tested_role in cls.members_read_rights[reader_role]
  50. # return False
  51. def get_user_role_workspace_with_context(
  52. self,
  53. user_role: UserRoleInWorkspace,
  54. newly_created:bool = None,
  55. email_sent: bool = None,
  56. ) -> UserRoleWorkspaceInContext:
  57. """
  58. Return WorkspaceInContext object from Workspace
  59. """
  60. assert self._config
  61. workspace = UserRoleWorkspaceInContext(
  62. user_role=user_role,
  63. dbsession=self._session,
  64. config=self._config,
  65. newly_created=newly_created,
  66. email_sent=email_sent,
  67. )
  68. return workspace
  69. def __init__(
  70. self,
  71. session: Session,
  72. current_user: typing.Optional[User],
  73. config: CFG,
  74. )-> None:
  75. self._session = session
  76. self._user = current_user
  77. self._config = config
  78. def _get_one_rsc(self, user_id: int, workspace_id: int) -> Query:
  79. """
  80. :param user_id:
  81. :param workspace_id:
  82. :return: a Query object, filtered query but without fetching the object.
  83. """
  84. return self._session.query(UserRoleInWorkspace).\
  85. filter(UserRoleInWorkspace.workspace_id == workspace_id).\
  86. filter(UserRoleInWorkspace.user_id == user_id)
  87. def get_one(self, user_id: int, workspace_id: int) -> UserRoleInWorkspace:
  88. return self._get_one_rsc(user_id, workspace_id).one()
  89. def update_role(
  90. self,
  91. role: UserRoleInWorkspace,
  92. role_level: int,
  93. with_notif: typing.Optional[bool] = None,
  94. save_now: bool=False,
  95. ):
  96. """
  97. Update role of user in this workspace
  98. :param role: UserRoleInWorkspace object
  99. :param role_level: level of new role wanted
  100. :param with_notif: is user notification enabled in this workspace ?
  101. :param save_now: database flush
  102. :return: updated role
  103. """
  104. role.role = role_level
  105. if with_notif is not None:
  106. role.do_notify = with_notif
  107. if save_now:
  108. self.save(role)
  109. return role
  110. def create_one(
  111. self,
  112. user: User,
  113. workspace: Workspace,
  114. role_level: int,
  115. with_notif: bool,
  116. flush: bool=True
  117. ) -> UserRoleInWorkspace:
  118. role = UserRoleInWorkspace()
  119. role.user_id = user.user_id
  120. role.workspace = workspace
  121. role.role = role_level
  122. role.do_notify = with_notif
  123. if flush:
  124. self._session.flush()
  125. return role
  126. def delete_one(self, user_id: int, workspace_id: int, flush=True) -> None:
  127. self._get_one_rsc(user_id, workspace_id).delete()
  128. if flush:
  129. self._session.flush()
  130. def get_all_for_workspace(
  131. self,
  132. workspace:Workspace
  133. ) -> typing.List[UserRoleInWorkspace]:
  134. return self._session.query(UserRoleInWorkspace)\
  135. .filter(UserRoleInWorkspace.workspace_id==workspace.workspace_id)\
  136. .all()
  137. def save(self, role: UserRoleInWorkspace) -> None:
  138. self._session.flush()
  139. # TODO - G.M - 29-06-2018 - [Cleanup] Drop this
  140. # @classmethod
  141. # def role_can_read_member_role(cls, reader_role: int, tested_role: int) \
  142. # -> bool:
  143. # """
  144. # :param reader_role: role as viewer
  145. # :param tested_role: role as viwed
  146. # :return: True if given role can view member role in workspace.
  147. # """
  148. # if reader_role in cls.members_read_rights:
  149. # return tested_role in cls.members_read_rights[reader_role]
  150. # return False
  151. # def _get_all_for_user(self, user_id) -> typing.List[UserRoleInWorkspace]:
  152. # return self._session.query(UserRoleInWorkspace)\
  153. # .filter(UserRoleInWorkspace.user_id == user_id)
  154. #
  155. # def get_all_for_user(self, user: User) -> typing.List[UserRoleInWorkspace]:
  156. # return self._get_all_for_user(user.user_id).all()
  157. #
  158. # def get_all_for_user_order_by_workspace(
  159. # self,
  160. # user_id: int
  161. # ) -> typing.List[UserRoleInWorkspace]:
  162. # return self._get_all_for_user(user_id)\
  163. # .join(UserRoleInWorkspace.workspace).order_by(Workspace.label).all()
  164. # TODO - G.M - 07-06-2018 - [Cleanup] Check if this method is already needed
  165. # @classmethod
  166. # def get_roles_for_select_field(cls) -> typing.List[RoleType]:
  167. # """
  168. #
  169. # :return: list of DictLikeClass instances representing available Roles
  170. # (to be used in select fields)
  171. # """
  172. # result = list()
  173. #
  174. # for role_id in UserRoleInWorkspace.get_all_role_values():
  175. # role = RoleType(role_id)
  176. # result.append(role)
  177. #
  178. # return result