userworkspace.py 5.1KB

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