userworkspace.py 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. workspace = UserRoleWorkspaceInContext(
  46. user_role=user_role,
  47. dbsession=self._session,
  48. config=self._config,
  49. )
  50. return workspace
  51. @classmethod
  52. def role_can_read_member_role(cls, reader_role: int, tested_role: int) \
  53. -> bool:
  54. """
  55. :param reader_role: role as viewer
  56. :param tested_role: role as viwed
  57. :return: True if given role can view member role in workspace.
  58. """
  59. if reader_role in cls.members_read_rights:
  60. return tested_role in cls.members_read_rights[reader_role]
  61. return False
  62. @classmethod
  63. def create_role(cls) -> UserRoleInWorkspace:
  64. role = UserRoleInWorkspace()
  65. return role
  66. def __init__(
  67. self,
  68. session: Session,
  69. current_user: typing.Optional[User],
  70. config: CFG,
  71. )-> None:
  72. self._session = session
  73. self._user = current_user
  74. self._config = config
  75. def _get_one_rsc(self, user_id: int, workspace_id: int) -> Query:
  76. """
  77. :param user_id:
  78. :param workspace_id:
  79. :return: a Query object, filtered query but without fetching the object.
  80. """
  81. return self._session.query(UserRoleInWorkspace).\
  82. filter(UserRoleInWorkspace.workspace_id == workspace_id).\
  83. filter(UserRoleInWorkspace.user_id == user_id)
  84. def get_one(self, user_id: int, workspace_id: int) -> UserRoleInWorkspace:
  85. return self._get_one_rsc(user_id, workspace_id).one()
  86. def create_one(
  87. self,
  88. user: User,
  89. workspace: Workspace,
  90. role_level: int,
  91. with_notif: bool,
  92. flush: bool=True
  93. ) -> UserRoleInWorkspace:
  94. role = self.create_role()
  95. role.user_id = user.user_id
  96. role.workspace = workspace
  97. role.role = role_level
  98. role.do_notify = with_notif
  99. if flush:
  100. self._session.flush()
  101. return role
  102. def delete_one(self, user_id: int, workspace_id: int, flush=True) -> None:
  103. self._get_one_rsc(user_id, workspace_id).delete()
  104. if flush:
  105. self._session.flush()
  106. def _get_all_for_user(self, user_id) -> typing.List[UserRoleInWorkspace]:
  107. return self._session.query(UserRoleInWorkspace)\
  108. .filter(UserRoleInWorkspace.user_id == user_id)
  109. def get_all_for_user(self, user: User) -> typing.List[UserRoleInWorkspace]:
  110. return self._get_all_for_user(user.user_id).all()
  111. def get_all_for_user_order_by_workspace(
  112. self,
  113. user_id: int
  114. ) -> typing.List[UserRoleInWorkspace]:
  115. return self._get_all_for_user(user_id)\
  116. .join(UserRoleInWorkspace.workspace).order_by(Workspace.label).all()
  117. def get_all_for_workspace(
  118. self,
  119. workspace:Workspace
  120. ) -> typing.List[UserRoleInWorkspace]:
  121. return self._session.query(UserRoleInWorkspace)\
  122. .filter(UserRoleInWorkspace.workspace_id == workspace.workspace_id).all() # nopep8
  123. def save(self, role: UserRoleInWorkspace) -> None:
  124. self._session.flush()
  125. # TODO - G.M - 07-06-2018 - [Cleanup] Check if this method is already needed
  126. @classmethod
  127. def get_roles_for_select_field(cls) -> typing.List[RoleType]:
  128. """
  129. :return: list of DictLikeClass instances representing available Roles
  130. (to be used in select fields)
  131. """
  132. result = list()
  133. for role_id in UserRoleInWorkspace.get_all_role_values():
  134. role = RoleType(role_id)
  135. result.append(role)
  136. return result