userworkspace.py 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 tracim.models.auth import User
  8. from tracim.models.auth import Group
  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__(self,
  67. session: Session,
  68. current_user: typing.Optional[User],
  69. config: CFG):
  70. self._session = session
  71. self._user = current_user
  72. self._config = config
  73. def _get_one_rsc(self, user_id, workspace_id):
  74. """
  75. :param user_id:
  76. :param workspace_id:
  77. :return: a Query object, filtered query but without fetching the object.
  78. """
  79. return self._session.query(UserRoleInWorkspace).\
  80. filter(UserRoleInWorkspace.workspace_id == workspace_id).\
  81. filter(UserRoleInWorkspace.user_id == user_id)
  82. def get_one(self, user_id, workspace_id):
  83. return self._get_one_rsc(user_id, workspace_id).one()
  84. def create_one(
  85. self,
  86. user: User,
  87. workspace: Workspace,
  88. role_level: int,
  89. with_notif: bool,
  90. flush: bool=True
  91. ) -> UserRoleInWorkspace:
  92. role = self.create_role()
  93. role.user_id = user.user_id
  94. role.workspace = workspace
  95. role.role = role_level
  96. role.do_notify = with_notif
  97. if flush:
  98. self._session.flush()
  99. return role
  100. def delete_one(self, user_id, workspace_id, flush=True):
  101. self._get_one_rsc(user_id, workspace_id).delete()
  102. if flush:
  103. self._session.flush()
  104. def _get_all_for_user(self, user_id):
  105. return self._session.query(UserRoleInWorkspace)\
  106. .filter(UserRoleInWorkspace.user_id == user_id)
  107. def get_all_for_user(self, user: User):
  108. return self._get_all_for_user(user.user_id).all()
  109. def get_all_for_user_order_by_workspace(
  110. self,
  111. user_id: int
  112. ) -> UserRoleInWorkspace:
  113. return self._get_all_for_user(user_id)\
  114. .join(UserRoleInWorkspace.workspace).order_by(Workspace.label).all()
  115. def get_all_for_workspace(self, workspace:Workspace):
  116. return self._session.query(UserRoleInWorkspace)\
  117. .filter(UserRoleInWorkspace.workspace_id == workspace.workspace_id).all() # nopep8
  118. def save(self, role: UserRoleInWorkspace):
  119. self._session.flush()
  120. @classmethod
  121. def get_roles_for_select_field(cls):
  122. """
  123. :return: list of DictLikeClass instances representing available Roles
  124. (to be used in select fields)
  125. """
  126. result = list()
  127. for role_id in UserRoleInWorkspace.get_all_role_values():
  128. role = RoleType(role_id)
  129. result.append(role)
  130. return result