ソースを参照

Merge pull request #333 from tracim/fix/328/admin_workspaces_access

Damien Accorsi 6 年 前
コミット
2b6f72bf63
共有3 個のファイルを変更した63 個の追加11 個の削除を含む
  1. 12 8
      tracim/tracim/controllers/admin/workspace.py
  2. 19 3
      tracim/tracim/lib/workspace.py
  3. 32 0
      tracim/tracim/tests/library/test_workspace.py

+ 12 - 8
tracim/tracim/controllers/admin/workspace.py ファイルの表示

@@ -157,17 +157,21 @@ class WorkspaceRestController(TIMRestController, BaseController):
157 157
 
158 158
     @tg.expose('tracim.templates.admin.workspace_getall')
159 159
     def get_all(self, *args, **kw):
160
-
161 160
         user = tmpl_context.current_user
162 161
         workspace_api_controller = WorkspaceApi(user)
163
-
164
-        workspaces = workspace_api_controller.get_all()
165
-
162
+        workspaces = workspace_api_controller.get_all_manageable()
166 163
         current_user_content = Context(CTX.CURRENT_USER).toDict(user)
167
-        fake_api = Context(CTX.ADMIN_WORKSPACE).toDict({'current_user': current_user_content})
168
-
169
-        dictified_workspaces = Context(CTX.ADMIN_WORKSPACES).toDict(workspaces, 'workspaces', 'workspace_nb')
170
-        return DictLikeClass(result = dictified_workspaces, fake_api=fake_api)
164
+        fake_api = Context(CTX.ADMIN_WORKSPACE) \
165
+            .toDict(
166
+                {'current_user': current_user_content}
167
+            )
168
+        dictified_workspaces = Context(CTX.ADMIN_WORKSPACES) \
169
+            .toDict(
170
+                workspaces,
171
+                'workspaces',
172
+                'workspace_nb',
173
+            )
174
+        return DictLikeClass(result=dictified_workspaces, fake_api=fake_api)
171 175
 
172 176
     @tg.expose('tracim.templates.admin.workspace_getone')
173 177
     def get_one(self, workspace_id):

+ 19 - 3
tracim/tracim/lib/workspace.py ファイルの表示

@@ -1,15 +1,16 @@
1 1
 # -*- coding: utf-8 -*-
2
-import transaction
2
+import typing
3 3
 
4 4
 from sqlalchemy.orm import Query
5 5
 from tg.i18n import ugettext as _
6
+import transaction
6 7
 
7 8
 from tracim.lib.userworkspace import RoleApi
9
+from tracim.model import DBSession
8 10
 from tracim.model.auth import Group
9 11
 from tracim.model.auth import User
10
-from tracim.model.data import Workspace
11 12
 from tracim.model.data import UserRoleInWorkspace
12
-from tracim.model import DBSession
13
+from tracim.model.data import Workspace
13 14
 
14 15
 __author__ = 'damien'
15 16
 
@@ -101,6 +102,21 @@ class WorkspaceApi(object):
101 102
         workspaces.sort(key=lambda workspace: workspace.label.lower())
102 103
         return workspaces
103 104
 
105
+    def get_all_manageable(self) -> typing.List[Workspace]:
106
+        """Get all workspaces the current user has manager rights on."""
107
+        workspaces = []  # type: typing.List[Workspace]
108
+        if self._user.profile.id == Group.TIM_ADMIN:
109
+            workspaces = self._base_query().order_by(Workspace.label).all()
110
+        elif self._user.profile.id == Group.TIM_MANAGER:
111
+            workspaces = self._base_query() \
112
+                .filter(
113
+                    UserRoleInWorkspace.role ==
114
+                    UserRoleInWorkspace.WORKSPACE_MANAGER
115
+                ) \
116
+                .order_by(Workspace.label) \
117
+                .all()
118
+        return workspaces
119
+
104 120
     def disable_notifications(self, user: User, workspace: Workspace):
105 121
         for role in user.roles:
106 122
             if role.workspace==workspace:

+ 32 - 0
tracim/tracim/tests/library/test_workspace.py ファイルの表示

@@ -2,12 +2,14 @@
2 2
 from nose.tools import eq_
3 3
 
4 4
 from tracim.lib.content import ContentApi
5
+from tracim.lib.group import GroupApi
5 6
 from tracim.lib.user import UserApi
6 7
 from tracim.lib.userworkspace import RoleApi
7 8
 from tracim.lib.workspace import WorkspaceApi
8 9
 from tracim.model import Content
9 10
 from tracim.model import DBSession
10 11
 from tracim.model import User
12
+from tracim.model.auth import Group
11 13
 from tracim.model.data import UserRoleInWorkspace
12 14
 from tracim.model.data import Workspace
13 15
 from tracim.tests import BaseTestThread
@@ -41,3 +43,33 @@ class TestThread(BaseTestThread, TestStandard):
41 43
         eq_([r, ], wapi.get_notifiable_roles(workspace=w))
42 44
         u.is_active = False
43 45
         eq_([], wapi.get_notifiable_roles(workspace=w))
46
+
47
+    def test_unit__get_all_manageable(self):
48
+        admin = DBSession.query(User) \
49
+            .filter(User.email == 'admin@admin.admin').one()
50
+        uapi = UserApi(admin)
51
+        # Checks a case without workspaces.
52
+        wapi = WorkspaceApi(current_user=admin)
53
+        eq_([], wapi.get_all_manageable())
54
+        # Checks an admin gets all workspaces.
55
+        w4 = wapi.create_workspace(label='w4')
56
+        w3 = wapi.create_workspace(label='w3')
57
+        w2 = wapi.create_workspace(label='w2')
58
+        w1 = wapi.create_workspace(label='w1')
59
+        eq_([w1, w2, w3, w4], wapi.get_all_manageable())
60
+        # Checks a regular user gets none workspace.
61
+        gapi = GroupApi(None)
62
+        u = uapi.create_user('u.s@e.r', [gapi.get_one(Group.TIM_USER)], True)
63
+        wapi = WorkspaceApi(current_user=u)
64
+        rapi = RoleApi(current_user=u)
65
+        off = 'off'
66
+        rapi.create_one(u, w4, UserRoleInWorkspace.READER, off)
67
+        rapi.create_one(u, w3, UserRoleInWorkspace.CONTRIBUTOR, off)
68
+        rapi.create_one(u, w2, UserRoleInWorkspace.CONTENT_MANAGER, off)
69
+        rapi.create_one(u, w1, UserRoleInWorkspace.WORKSPACE_MANAGER, off)
70
+        eq_([], wapi.get_all_manageable())
71
+        # Checks a manager gets only its own workspaces.
72
+        u.groups.append(gapi.get_one(Group.TIM_MANAGER))
73
+        rapi.delete_one(u.user_id, w2.workspace_id)
74
+        rapi.create_one(u, w2, UserRoleInWorkspace.WORKSPACE_MANAGER, off)
75
+        eq_([w1, w2], wapi.get_all_manageable())