userworkspace.py 4.2KB

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