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
 
53
 
54
         dictified_current_user = Context(CTX.CURRENT_USER).toDict(user)
54
         dictified_current_user = Context(CTX.CURRENT_USER).toDict(user)
55
         dictified_folders = self.folders.get_all_fake(workspace).result
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
         fake_api.sub_items = Context(CTX.FOLDER_CONTENT_LIST).toDict(
62
         fake_api.sub_items = Context(CTX.FOLDER_CONTENT_LIST).toDict(
62
             workspace.get_valid_children(ContentApi.DISPLAYABLE_CONTENTS)
63
             workspace.get_valid_children(ContentApi.DISPLAYABLE_CONTENTS)

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

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

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

18
 from tracim.lib import CST
18
 from tracim.lib import CST
19
 from tracim.lib.base import logger
19
 from tracim.lib.base import logger
20
 from tracim.lib.content import ContentApi
20
 from tracim.lib.content import ContentApi
21
+from tracim.lib.userworkspace import RoleApi
21
 from tracim.lib.workspace import WorkspaceApi
22
 from tracim.lib.workspace import WorkspaceApi
23
+from tracim.model import User
22
 
24
 
23
 from tracim.model.data import ContentStatus
25
 from tracim.model.data import ContentStatus
24
 from tracim.model.data import Content
26
 from tracim.model.data import Content
221
 
223
 
222
 def slug(string):
224
 def slug(string):
223
     return slugify.slugify(string, only_ascii=True)
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
 class RoleApi(object):
28
 class RoleApi(object):
29
 
29
 
30
     ALL_ROLE_VALUES = UserRoleInWorkspace.get_all_role_values()
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
     def __init__(self, current_user: User):
68
     def __init__(self, current_user: User):
33
         self._user = current_user
69
         self._user = current_user

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

61
         % endif
61
         % endif
62
 
62
 
63
         <% member_nb = len(result.workspace.members) %>
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
         % if member_nb<=0:
66
         % if member_nb<=0:
65
             ${P.EMPTY_CONTENT(_('There are no members in this workspace'))}
67
             ${P.EMPTY_CONTENT(_('There are no members in this workspace'))}
66
         % else:
68
         % else:
69
                     ${_('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}
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
                 % else:
72
                 % else:
71
                     ${_('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}
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
                 % endif
77
                 % endif
73
             </p>
78
             </p>
74
             <div class="collapse" id="memberList">
79
             <div class="collapse" id="memberList">
75
                 <table class="table">
80
                 <table class="table">
76
-                    % for member in result.workspace.members:
81
+                    % for member in viewable_members:
77
                         <tr>
82
                         <tr>
78
                             <td><strong>${member.name}</strong></td>
83
                             <td><strong>${member.name}</strong></td>
79
                             <td>
84
                             <td>
84
                     % endfor
89
                     % endfor
85
                 </table>
90
                 </table>
86
             </div>
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
         % endif
102
         % endif
88
 
103
 
89
         % if result.workspace.calendar_enabled:
104
         % if result.workspace.calendar_enabled: