userworkspace.py 4.3KB

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