workspace.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. # -*- coding: utf-8 -*-
  2. import transaction
  3. from sqlalchemy.orm import Query
  4. from tg.i18n import ugettext as _
  5. from tracim.lib.userworkspace import RoleApi
  6. from tracim.model.auth import Group
  7. from tracim.model.auth import User
  8. from tracim.model.data import Workspace
  9. from tracim.model.data import UserRoleInWorkspace
  10. from tracim.model import DBSession
  11. __author__ = 'damien'
  12. class WorkspaceApi(object):
  13. def __init__(self, current_user: User, force_role: bool=False):
  14. """
  15. :param current_user: Current user of context
  16. :param force_role: If True, app role in queries even if admin
  17. """
  18. self._user = current_user
  19. self._force_role = force_role
  20. def _base_query_without_roles(self):
  21. return DBSession.query(Workspace).filter(Workspace.is_deleted==False)
  22. def _base_query(self):
  23. if not self._force_role and self._user.profile.id>=Group.TIM_ADMIN:
  24. return self._base_query_without_roles()
  25. return DBSession.query(Workspace).\
  26. join(Workspace.roles).\
  27. filter(UserRoleInWorkspace.user_id==self._user.user_id).\
  28. filter(Workspace.is_deleted==False)
  29. def create_workspace(
  30. self,
  31. label: str='',
  32. description: str='',
  33. calendar_enabled: bool=False,
  34. save_now: bool=False,
  35. ) -> Workspace:
  36. if not label:
  37. label = self.generate_label()
  38. workspace = Workspace()
  39. workspace.label = label
  40. workspace.description = description
  41. workspace.calendar_enabled = calendar_enabled
  42. # By default, we force the current user to be the workspace manager
  43. # And to receive email notifications
  44. role = RoleApi(self._user).create_one(self._user, workspace,
  45. UserRoleInWorkspace.WORKSPACE_MANAGER,
  46. with_notif=True)
  47. DBSession.add(workspace)
  48. DBSession.add(role)
  49. if save_now:
  50. DBSession.flush()
  51. if calendar_enabled:
  52. self.execute_created_workspace_actions(workspace)
  53. return workspace
  54. def get_one(self, id):
  55. return self._base_query().filter(Workspace.workspace_id==id).one()
  56. def get_one_by_label(self, label: str) -> Workspace:
  57. return self._base_query().filter(Workspace.label == label).one()
  58. """
  59. def get_one_for_current_user(self, id):
  60. return self._base_query().filter(Workspace.workspace_id==id).\
  61. session.query(ZKContact).filter(ZKContact.groups.any(ZKGroup.id.in_([1,2,3])))
  62. filter(sqla.).one()
  63. """
  64. def get_all(self):
  65. return self._base_query().all()
  66. def get_all_for_user(self, user: User, ignored_ids=None):
  67. workspaces = []
  68. for role in user.roles:
  69. if not role.workspace.is_deleted:
  70. if not ignored_ids:
  71. workspaces.append(role.workspace)
  72. elif role.workspace.workspace_id not in ignored_ids:
  73. workspaces.append(role.workspace)
  74. else:
  75. pass # do not return workspace
  76. workspaces.sort(key=lambda workspace: workspace.label.lower())
  77. return workspaces
  78. def disable_notifications(self, user: User, workspace: Workspace):
  79. for role in user.roles:
  80. if role.workspace==workspace:
  81. role.do_notify = False
  82. def enable_notifications(self, user: User, workspace: Workspace):
  83. for role in user.roles:
  84. if role.workspace==workspace:
  85. role.do_notify = True
  86. def get_notifiable_roles(self, workspace: Workspace) -> [UserRoleInWorkspace]:
  87. roles = []
  88. for role in workspace.roles:
  89. if role.do_notify==True \
  90. and role.user!=self._user \
  91. and role.user.is_active:
  92. roles.append(role)
  93. return roles
  94. def save(self, workspace: Workspace):
  95. DBSession.flush()
  96. def delete_one(self, workspace_id, flush=True):
  97. workspace = self.get_one(workspace_id)
  98. workspace.is_deleted = True
  99. if flush:
  100. DBSession.flush()
  101. def restore_one(self, workspace_id, flush=True):
  102. workspace = DBSession.query(Workspace).filter(Workspace.is_deleted==True).filter(Workspace.workspace_id==workspace_id).one()
  103. workspace.is_deleted = False
  104. if flush:
  105. DBSession.flush()
  106. return workspace
  107. def execute_created_workspace_actions(self, workspace: Workspace) -> None:
  108. self.ensure_calendar_exist(workspace)
  109. def ensure_calendar_exist(self, workspace: Workspace) -> None:
  110. # Note: Cyclic imports
  111. from tracim.lib.calendar import CalendarManager
  112. from tracim.model.organisational import WorkspaceCalendar
  113. if workspace.calendar_enabled:
  114. self._user.ensure_auth_token()
  115. # Ensure database is up-to-date
  116. DBSession.flush()
  117. transaction.commit()
  118. calendar_manager = CalendarManager(self._user)
  119. calendar_manager.create_then_remove_fake_event(
  120. calendar_class=WorkspaceCalendar,
  121. related_object_id=workspace.workspace_id,
  122. )
  123. def get_base_query(self) -> Query:
  124. return self._base_query()
  125. def generate_label(self) -> str:
  126. """
  127. :return: Generated workspace label
  128. """
  129. query = self._base_query_without_roles() \
  130. .filter(Workspace.label.ilike('{0}%'.format(
  131. _('Workspace'),
  132. )))
  133. return _('Workspace {}').format(
  134. query.count() + 1,
  135. )
  136. class UnsafeWorkspaceApi(WorkspaceApi):
  137. def _base_query(self):
  138. return DBSession.query(Workspace).filter(Workspace.is_deleted==False)