Browse Source

Merge branch 'master' into 66/dev/radicale_client_url

Bastien Sevajol (Algoo) 8 years ago
parent
commit
1830ab2d3f

+ 19 - 9
install/requirements.txt View File

@@ -1,4 +1,4 @@
1
-Babel==2.2
1
+Babel==2.2.0
2 2
 Beaker==1.6.4
3 3
 CherryPy==3.6.0
4 4
 FormEncode==1.3.0a1
@@ -6,50 +6,60 @@ Genshi==0.7
6 6
 Mako==1.0.3
7 7
 MarkupSafe==0.23
8 8
 PasteDeploy==1.5.2
9
+Radicale==1.1.1
9 10
 SQLAlchemy==1.0.11
10 11
 Tempita==0.5.3dev
11 12
 TurboGears2==2.3.7
13
+Unidecode==0.04.19
12 14
 WebOb==1.6.0a0
13 15
 WebTest==1.4.2
14 16
 alembic==0.8.4
15 17
 argparse==1.2.1
16 18
 backlash==0.0.7
17 19
 beautifulsoup4==4.3.2
20
+caldav==0.4.0
18 21
 cliff==1.8.0
19 22
 cmd2==0.6.7
20 23
 coverage==4.0b1
21 24
 crank==0.7.3
22 25
 decorator==3.4.0
23 26
 gearbox==0.0.7
27
+icalendar==3.10
24 28
 itsdangerous==0.24
29
+ldap3==1.3.1
30
+lxml==3.6.0
25 31
 nose==1.3.4
26 32
 pbr==0.10.0
27 33
 prettytable==0.7.2
28 34
 psycopg2==2.5.4
35
+py4j==0.10.1
36
+pyasn1==0.1.9
29 37
 pyparsing==2.0.3
38
+python-dateutil==2.5.3
39
+python-editor==1.0.1
40
+python-ldap-test==0.2.1
30 41
 pytz==2014.7
31 42
 repoze.lru==0.6
32 43
 repoze.who==2.2
44
+requests==2.10.0
33 45
 six==1.8.0
34 46
 speaklater==1.3
35 47
 sprox==0.9.4
36 48
 stevedore==1.1.0
37 49
 tg.devtools==2.3.7
50
+tgapp-resetpassword==0.1.8
38 51
 tgext.admin==0.6.4
39 52
 tgext.asyncjob==0.3.1
40 53
 tgext.crud==0.7.3
41 54
 tgext.pluggable==0.5.5
55
+## FIXME: could not find svn URL in dependency_links for this package:
56
+tracim==1.0.0dev-r0
42 57
 transaction==1.4.4
43 58
 tw2.core==2.2.2
44 59
 tw2.forms==2.2.2.1
60
+unicode-slugify==0.1.3
61
+vobject==0.9.2
45 62
 waitress==0.8.9
63
+who-ldap==3.1.0
46 64
 zope.interface==4.1.3
47 65
 zope.sqlalchemy==0.7.6
48
-git+https://github.com/algoo/tgapp-resetpassword.git@master
49
-lxml
50
-python-ldap-test==0.2.0
51
-who-ldap==3.1.0
52
-unicode-slugify==0.1.3
53
-Radicale==1.1.1
54
-icalendar==3.10
55
-caldav==0.4.0

+ 1 - 1
tracim/setup.py View File

@@ -40,7 +40,7 @@ install_requires=[
40 40
     "alembic",
41 41
     "repoze.who",
42 42
     "who-ldap==3.1.0",
43
-    "python-ldap-test==0.2.0",
43
+    "python-ldap-test==0.2.1",
44 44
     "unicode-slugify==0.1.3",
45 45
     ]
46 46
 

+ 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)

BIN
tracim/tracim/i18n/fr/LC_MESSAGES/tracim.mo View File


+ 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: