Browse Source

Add decorator to check profile

Guénaël Muller 7 years ago
parent
commit
2542187fee
3 changed files with 74 additions and 53 deletions
  1. 4 0
      tracim/exceptions.py
  2. 24 3
      tracim/lib/utils/authorization.py
  3. 46 50
      tracim/views/default/default_controller.py

+ 4 - 0
tracim/exceptions.py View File

@@ -73,5 +73,9 @@ class InsufficientUserWorkspaceRole(TracimException):
73 73
     pass
74 74
 
75 75
 
76
+class InsufficientUserProfile(TracimException):
77
+    pass
78
+
79
+
76 80
 class ImmutableAttribute(TracimException):
77 81
     pass

+ 24 - 3
tracim/lib/utils/authorization.py View File

@@ -8,7 +8,9 @@ try:
8 8
 except ImportError:  # python3.4
9 9
     JSONDecodeError = ValueError
10 10
 
11
-from tracim.exceptions import InsufficientUserWorkspaceRole
11
+from tracim.exceptions import InsufficientUserWorkspaceRole, \
12
+    InsufficientUserProfile
13
+
12 14
 if TYPE_CHECKING:
13 15
     from tracim import TracimRequest
14 16
 ###
@@ -42,12 +44,31 @@ class AcceptAllAuthorizationPolicy(object):
42 44
 # We prefer to use decorators
43 45
 
44 46
 
47
+def require_profile(group):
48
+    """
49
+    Decorator for view to restrict access of tracim request if profile is
50
+    not high enough
51
+    :param group: value from Group Object
52
+    like Group.TIM_USER or Group.TIM_MANAGER
53
+    :return:
54
+    """
55
+    def decorator(func):
56
+        def wrapper(self, request: 'TracimRequest'):
57
+            user = request.current_user
58
+            if user.profile.id >= group:
59
+                return func(self, request)
60
+            raise InsufficientUserProfile()
61
+        return wrapper
62
+    return decorator
63
+
64
+
45 65
 def require_workspace_role(minimal_required_role):
46 66
     """
47 67
     Decorator for view to restrict access of tracim request if role
48 68
     is not high enough
49
-    :param minimal_required_role:
50
-    :return:
69
+    :param minimal_required_role: value from UserInWorkspace Object like
70
+    UserRoleInWorkspace.CONTRIBUTOR or UserRoleInWorkspace.READER
71
+    :return: decorator
51 72
     """
52 73
     def decorator(func):
53 74
 

+ 46 - 50
tracim/views/default/default_controller.py View File

@@ -2,6 +2,7 @@
2 2
 from pyramid.request import Request
3 3
 
4 4
 from tracim import TracimRequest
5
+from tracim.models import Group
5 6
 from tracim.models.data import UserRoleInWorkspace
6 7
 from tracim.views.controllers import Controller
7 8
 from pyramid.config import Configurator
@@ -11,7 +12,8 @@ from pyramid.httpexceptions import HTTPUnauthorized
11 12
 from pyramid.httpexceptions import HTTPForbidden
12 13
 from pyramid.security import forget, authenticated_userid
13 14
 
14
-from tracim.lib.utils.authorization import require_workspace_role
15
+from tracim.lib.utils.authorization import require_workspace_role, \
16
+    require_profile
15 17
 
16 18
 
17 19
 class DefaultController(Controller):
@@ -30,50 +32,34 @@ class DefaultController(Controller):
30 32
             response = HTTPForbidden()
31 33
         return response
32 34
 
33
-    # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
34
-    @require_workspace_role(UserRoleInWorkspace.READER)
35
-    def test_config(self, request: TracimRequest):
35
+    def home(self, request: TracimRequest):
36 36
         app_config = request.registry.settings['CFG']
37 37
         project = app_config.WEBSITE_TITLE
38
-        request.current_user = "lapin"
39 38
         return {'project': project}
40 39
 
40
+    @require_profile(Group.TIM_USER)
41
+    def user(self, request: TracimRequest):
42
+        return self.home(request)
43
+
41 44
     # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
42
-    @require_workspace_role(UserRoleInWorkspace.CONTRIBUTOR)
43
-    def test_contributor_page(self, request):
44
-        try:
45
-            app_config = request.registry.settings['CFG']
46
-            project = 'contributor'
47
-        except Exception as e:
48
-            return Response(e, content_type='text/plain', status=500)
49
-        return {'project': project}
45
+    @require_workspace_role(UserRoleInWorkspace.READER)
46
+    def test_reader(self, request: TracimRequest):
47
+        return self.home(request)
50 48
 
51 49
     # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
52
-    def test_admin_page(self, request):
53
-        try:
54
-            app_config = request.registry.settings['CFG']
55
-            project = 'admin'
56
-        except Exception as e:
57
-            return Response(e, content_type='text/plain', status=500)
58
-        return {'project': project}
50
+    @require_workspace_role(UserRoleInWorkspace.CONTRIBUTOR)
51
+    def test_contributor(self, request):
52
+        return self.home(request)
59 53
 
60 54
     # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
61
-    def test_manager_page(self, request):
62
-        try:
63
-            app_config = request.registry.settings['CFG']
64
-            project = 'manager'
65
-        except Exception as e:
66
-            return Response(e, content_type='text/plain', status=500)
67
-        return {'project': project}
55
+    @require_workspace_role(UserRoleInWorkspace.WORKSPACE_MANAGER)
56
+    def test_workspace_manager(self, request):
57
+        return self.home(request)
68 58
 
69 59
     # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
70
-    def test_user_page(self, request):
71
-        try:
72
-            app_config = request.registry.settings['CFG']
73
-            project = 'user'
74
-        except Exception as e:
75
-            return Response(e, content_type='text/plain', status=500)
76
-        return {'project': project}
60
+    @require_workspace_role(UserRoleInWorkspace.CONTENT_MANAGER)
61
+    def test_content_manager(self, request):
62
+        return self.home(request)
77 63
 
78 64
     def bind(self, configurator: Configurator):
79 65
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop static files
@@ -87,43 +73,53 @@ class DefaultController(Controller):
87 73
         )
88 74
 
89 75
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
90
-        configurator.add_route('test_config', '/')
76
+        configurator.add_route('home', '/')
91 77
         configurator.add_view(
92
-            self.test_config,
93
-            route_name='test_config',
78
+            self.home,
79
+            route_name='home',
80
+            renderer='tracim:templates/mytemplate.jinja2',
81
+        )
82
+        # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
83
+        configurator.add_route('user', '/user')
84
+        configurator.add_view(
85
+            self.user,
86
+            route_name='user',
94 87
             renderer='tracim:templates/mytemplate.jinja2',
95 88
         )
96 89
 
97 90
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
98 91
         configurator.add_route('test_contributor', '/test_contributor')
99 92
         configurator.add_view(
100
-            self.test_contributor_page,
93
+            self.test_contributor,
101 94
             route_name='test_contributor',
102 95
             renderer='tracim:templates/mytemplate.jinja2',
103 96
         )
104
-
105 97
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
106
-        configurator.add_route('test_admin', '/test_admin')
98
+        configurator.add_route('test_reader', '/test_reader')
107 99
         configurator.add_view(
108
-            self.test_admin_page,
109
-            route_name='test_admin',
100
+            self.test_contributor,
101
+            route_name='test_reader',
110 102
             renderer='tracim:templates/mytemplate.jinja2',
111 103
         )
112
-
113 104
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
114
-        configurator.add_route('test_manager', '/test_manager')
105
+        configurator.add_route(
106
+            'test_workspace_manager',
107
+            '/test_workspace_manager'
108
+        )
115 109
         configurator.add_view(
116
-            self.test_user_page,
117
-            route_name='test_manager',
110
+            self.test_workspace_manager,
111
+            route_name='test_workspace_manager',
118 112
             renderer='tracim:templates/mytemplate.jinja2',
119 113
         )
120 114
 
121 115
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
122
-        configurator.add_route('test_user', '/test_user')
116
+        configurator.add_route(
117
+            'test_content_manager',
118
+            '/test_content_manager'
119
+        )
123 120
         configurator.add_view(
124
-            self.test_user_page,
125
-            route_name='test_user',
121
+            self.test_content_manager,
122
+            route_name='test_content_manager',
126 123
             renderer='tracim:templates/mytemplate.jinja2',
127 124
         )
128
-
129 125
         configurator.add_forbidden_view(self.forbidden_view)