Browse Source

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

Damien Accorsi 7 years ago
parent
commit
2b6f72bf63

+ 12 - 8
tracim/tracim/controllers/admin/workspace.py View File

157
 
157
 
158
     @tg.expose('tracim.templates.admin.workspace_getall')
158
     @tg.expose('tracim.templates.admin.workspace_getall')
159
     def get_all(self, *args, **kw):
159
     def get_all(self, *args, **kw):
160
-
161
         user = tmpl_context.current_user
160
         user = tmpl_context.current_user
162
         workspace_api_controller = WorkspaceApi(user)
161
         workspace_api_controller = WorkspaceApi(user)
163
-
164
-        workspaces = workspace_api_controller.get_all()
165
-
162
+        workspaces = workspace_api_controller.get_all_manageable()
166
         current_user_content = Context(CTX.CURRENT_USER).toDict(user)
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
     @tg.expose('tracim.templates.admin.workspace_getone')
176
     @tg.expose('tracim.templates.admin.workspace_getone')
173
     def get_one(self, workspace_id):
177
     def get_one(self, workspace_id):

+ 19 - 3
tracim/tracim/lib/workspace.py View File

1
 # -*- coding: utf-8 -*-
1
 # -*- coding: utf-8 -*-
2
-import transaction
2
+import typing
3
 
3
 
4
 from sqlalchemy.orm import Query
4
 from sqlalchemy.orm import Query
5
 from tg.i18n import ugettext as _
5
 from tg.i18n import ugettext as _
6
+import transaction
6
 
7
 
7
 from tracim.lib.userworkspace import RoleApi
8
 from tracim.lib.userworkspace import RoleApi
9
+from tracim.model import DBSession
8
 from tracim.model.auth import Group
10
 from tracim.model.auth import Group
9
 from tracim.model.auth import User
11
 from tracim.model.auth import User
10
-from tracim.model.data import Workspace
11
 from tracim.model.data import UserRoleInWorkspace
12
 from tracim.model.data import UserRoleInWorkspace
12
-from tracim.model import DBSession
13
+from tracim.model.data import Workspace
13
 
14
 
14
 __author__ = 'damien'
15
 __author__ = 'damien'
15
 
16
 
101
         workspaces.sort(key=lambda workspace: workspace.label.lower())
102
         workspaces.sort(key=lambda workspace: workspace.label.lower())
102
         return workspaces
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
     def disable_notifications(self, user: User, workspace: Workspace):
120
     def disable_notifications(self, user: User, workspace: Workspace):
105
         for role in user.roles:
121
         for role in user.roles:
106
             if role.workspace==workspace:
122
             if role.workspace==workspace:

+ 32 - 0
tracim/tracim/tests/library/test_workspace.py View File

2
 from nose.tools import eq_
2
 from nose.tools import eq_
3
 
3
 
4
 from tracim.lib.content import ContentApi
4
 from tracim.lib.content import ContentApi
5
+from tracim.lib.group import GroupApi
5
 from tracim.lib.user import UserApi
6
 from tracim.lib.user import UserApi
6
 from tracim.lib.userworkspace import RoleApi
7
 from tracim.lib.userworkspace import RoleApi
7
 from tracim.lib.workspace import WorkspaceApi
8
 from tracim.lib.workspace import WorkspaceApi
8
 from tracim.model import Content
9
 from tracim.model import Content
9
 from tracim.model import DBSession
10
 from tracim.model import DBSession
10
 from tracim.model import User
11
 from tracim.model import User
12
+from tracim.model.auth import Group
11
 from tracim.model.data import UserRoleInWorkspace
13
 from tracim.model.data import UserRoleInWorkspace
12
 from tracim.model.data import Workspace
14
 from tracim.model.data import Workspace
13
 from tracim.tests import BaseTestThread
15
 from tracim.tests import BaseTestThread
41
         eq_([r, ], wapi.get_notifiable_roles(workspace=w))
43
         eq_([r, ], wapi.get_notifiable_roles(workspace=w))
42
         u.is_active = False
44
         u.is_active = False
43
         eq_([], wapi.get_notifiable_roles(workspace=w))
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())