Browse Source

Closes #59: Ne pas montrer tous les utilisateurs à tout le monde

Bastien Sevajol (Algoo) 8 years ago
parent
commit
d15aecdcd5

+ 5 - 4
tracim/tracim/controllers/workspace.py View File

@@ -53,10 +53,11 @@ class UserWorkspaceRestController(TIMRestController):
53 53
 
54 54
         dictified_current_user = Context(CTX.CURRENT_USER).toDict(user)
55 55
         dictified_folders = self.folders.get_all_fake(workspace).result
56
-        fake_api = DictLikeClass(current_user=dictified_current_user,
57
-                                 current_workspace_folders=dictified_folders)\
58
-        # ,
59
-        #                      sub_items=Context(CTX.FOLDER_CONTENT_LIST).toDict(dictified_folders))
56
+        fake_api = DictLikeClass(
57
+            current_user=dictified_current_user,
58
+            current_workspace_folders=dictified_folders,
59
+            current_user_workspace_role=workspace.get_user_role(user)
60
+        )
60 61
 
61 62
         fake_api.sub_items = Context(CTX.FOLDER_CONTENT_LIST).toDict(
62 63
             workspace.get_valid_children(ContentApi.DISPLAYABLE_CONTENTS)

+ 4 - 0
tracim/tracim/i18n/fr/LC_MESSAGES/tracim.po View File

@@ -1925,6 +1925,10 @@ msgstr "Modifier l'espace de travail courant"
1925 1925
 msgid "Delete current workspace"
1926 1926
 msgstr "Supprimer l'espace de travail"
1927 1927
 
1928
+#: tracim/templates/workspace/getone.mak:75
1929
+msgid "whose"
1930
+msgstr "dont"
1931
+
1928 1932
 #~ msgid "You have no document yet."
1929 1933
 #~ msgstr "Vous n'avez pas de document pour le moment."
1930 1934
 

+ 20 - 0
tracim/tracim/lib/helpers.py View File

@@ -18,7 +18,9 @@ from tracim.lib import app_globals as plag
18 18
 from tracim.lib import CST
19 19
 from tracim.lib.base import logger
20 20
 from tracim.lib.content import ContentApi
21
+from tracim.lib.userworkspace import RoleApi
21 22
 from tracim.lib.workspace import WorkspaceApi
23
+from tracim.model import User
22 24
 
23 25
 from tracim.model.data import ContentStatus
24 26
 from tracim.model.data import Content
@@ -221,3 +223,21 @@ def is_user_externalized_field(field_name):
221 223
 
222 224
 def slug(string):
223 225
     return slugify.slugify(string, only_ascii=True)
226
+
227
+
228
+def get_viewable_members_for_role(role: int, members: [dict]) -> [dict]:
229
+    """
230
+    Return given users list with viewable members by given role.
231
+    :param role: One of tracim.model.data.UserRoleInWorkspace roles
232
+    :param members: list of workspace members. Where member object own "role"
233
+    property containing tracim.model.data.UserRoleInWorkspace role.
234
+    :return: filtered member list
235
+    """
236
+    viewable_users = []
237
+    for member in members:
238
+        if RoleApi.role_can_read_member_role(
239
+                reader_role=role,
240
+                tested_role=member.role
241
+        ):
242
+            viewable_users.append(member)
243
+    return viewable_users

+ 36 - 0
tracim/tracim/lib/userworkspace.py View File

@@ -28,6 +28,42 @@ from tracim.model.serializers import DictLikeClass
28 28
 class RoleApi(object):
29 29
 
30 30
     ALL_ROLE_VALUES = UserRoleInWorkspace.get_all_role_values()
31
+    # Dict containing readable members roles for given role
32
+    members_read_rights = {
33
+        UserRoleInWorkspace.NOT_APPLICABLE: [],
34
+        UserRoleInWorkspace.READER: [
35
+            UserRoleInWorkspace.WORKSPACE_MANAGER,
36
+        ],
37
+        UserRoleInWorkspace.CONTRIBUTOR: [
38
+            UserRoleInWorkspace.WORKSPACE_MANAGER,
39
+            UserRoleInWorkspace.CONTENT_MANAGER,
40
+            UserRoleInWorkspace.CONTRIBUTOR,
41
+        ],
42
+        UserRoleInWorkspace.CONTENT_MANAGER: [
43
+            UserRoleInWorkspace.WORKSPACE_MANAGER,
44
+            UserRoleInWorkspace.CONTENT_MANAGER,
45
+            UserRoleInWorkspace.CONTRIBUTOR,
46
+            UserRoleInWorkspace.READER,
47
+        ],
48
+        UserRoleInWorkspace.WORKSPACE_MANAGER: [
49
+            UserRoleInWorkspace.WORKSPACE_MANAGER,
50
+            UserRoleInWorkspace.CONTENT_MANAGER,
51
+            UserRoleInWorkspace.CONTRIBUTOR,
52
+            UserRoleInWorkspace.READER,
53
+        ],
54
+    }
55
+
56
+    @classmethod
57
+    def role_can_read_member_role(cls, reader_role: int, tested_role: int) \
58
+            -> bool:
59
+        """
60
+        :param reader_role: role as viewer
61
+        :param tested_role: role as viwed
62
+        :return: True if given role can view member role in workspace.
63
+        """
64
+        if reader_role in cls.members_read_rights:
65
+            return tested_role in cls.members_read_rights[reader_role]
66
+        return False
31 67
 
32 68
     def __init__(self, current_user: User):
33 69
         self._user = current_user

+ 16 - 1
tracim/tracim/templates/workspace/getone.mak View File

@@ -61,6 +61,8 @@
61 61
         % endif
62 62
 
63 63
         <% member_nb = len(result.workspace.members) %>
64
+        <% viewable_members = h.get_viewable_members_for_role(fake_api.current_user_workspace_role, result.workspace.members) %>
65
+        <% viewable_member_nb = len(viewable_members) %>
64 66
         % if member_nb<=0:
65 67
             ${P.EMPTY_CONTENT(_('There are no members in this workspace'))}
66 68
         % else:
@@ -69,11 +71,14 @@
69 71
                     ${_('This workspace has {a_open}one member{a_close}').format(a_open='<a data-toggle="collapse" href="#memberList" aria-expanded="false" aria-controls="memberList">', a_close='</a>')|n}
70 72
                 % else:
71 73
                     ${_('This workspace has {a_open}{member_nb} members{a_close}').format(a_open='<a data-toggle="collapse" href="#memberList" aria-expanded="false" aria-controls="memberList">', member_nb=member_nb, a_close='</a>')|n}
74
+                    % if viewable_member_nb != member_nb:
75
+                        <span id="members-whose" style="display: none;">${ _('whose') }:</span>
76
+                    % endif
72 77
                 % endif
73 78
             </p>
74 79
             <div class="collapse" id="memberList">
75 80
                 <table class="table">
76
-                    % for member in result.workspace.members:
81
+                    % for member in viewable_members:
77 82
                         <tr>
78 83
                             <td><strong>${member.name}</strong></td>
79 84
                             <td>
@@ -84,6 +89,16 @@
84 89
                     % endfor
85 90
                 </table>
86 91
             </div>
92
+            <script>
93
+                $(document).ready(function(){
94
+                    $('#memberList').on('show.bs.collapse', function() {
95
+                        $('#members-whose').show();
96
+                    });
97
+                    $('#memberList').on('hide.bs.collapse', function() {
98
+                        $('#members-whose').hide();
99
+                    });
100
+                });
101
+            </script>
87 102
         % endif
88 103
 
89 104
         % if result.workspace.calendar_enabled: