userworkspace.py 4.8KB

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