Bladeren bron

Add decorator to check profile

Guénaël Muller 7 jaren geleden
bovenliggende
commit
2542187fee
3 gewijzigde bestanden met toevoegingen van 74 en 53 verwijderingen
  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 Bestand weergeven

73
     pass
73
     pass
74
 
74
 
75
 
75
 
76
+class InsufficientUserProfile(TracimException):
77
+    pass
78
+
79
+
76
 class ImmutableAttribute(TracimException):
80
 class ImmutableAttribute(TracimException):
77
     pass
81
     pass

+ 24 - 3
tracim/lib/utils/authorization.py Bestand weergeven

8
 except ImportError:  # python3.4
8
 except ImportError:  # python3.4
9
     JSONDecodeError = ValueError
9
     JSONDecodeError = ValueError
10
 
10
 
11
-from tracim.exceptions import InsufficientUserWorkspaceRole
11
+from tracim.exceptions import InsufficientUserWorkspaceRole, \
12
+    InsufficientUserProfile
13
+
12
 if TYPE_CHECKING:
14
 if TYPE_CHECKING:
13
     from tracim import TracimRequest
15
     from tracim import TracimRequest
14
 ###
16
 ###
42
 # We prefer to use decorators
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
 def require_workspace_role(minimal_required_role):
65
 def require_workspace_role(minimal_required_role):
46
     """
66
     """
47
     Decorator for view to restrict access of tracim request if role
67
     Decorator for view to restrict access of tracim request if role
48
     is not high enough
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
     def decorator(func):
73
     def decorator(func):
53
 
74
 

+ 46 - 50
tracim/views/default/default_controller.py Bestand weergeven

2
 from pyramid.request import Request
2
 from pyramid.request import Request
3
 
3
 
4
 from tracim import TracimRequest
4
 from tracim import TracimRequest
5
+from tracim.models import Group
5
 from tracim.models.data import UserRoleInWorkspace
6
 from tracim.models.data import UserRoleInWorkspace
6
 from tracim.views.controllers import Controller
7
 from tracim.views.controllers import Controller
7
 from pyramid.config import Configurator
8
 from pyramid.config import Configurator
11
 from pyramid.httpexceptions import HTTPForbidden
12
 from pyramid.httpexceptions import HTTPForbidden
12
 from pyramid.security import forget, authenticated_userid
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
 class DefaultController(Controller):
19
 class DefaultController(Controller):
30
             response = HTTPForbidden()
32
             response = HTTPForbidden()
31
         return response
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
         app_config = request.registry.settings['CFG']
36
         app_config = request.registry.settings['CFG']
37
         project = app_config.WEBSITE_TITLE
37
         project = app_config.WEBSITE_TITLE
38
-        request.current_user = "lapin"
39
         return {'project': project}
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
     # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
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
     # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
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
     # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
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
     # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
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
     def bind(self, configurator: Configurator):
64
     def bind(self, configurator: Configurator):
79
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop static files
65
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop static files
87
         )
73
         )
88
 
74
 
89
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
75
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
90
-        configurator.add_route('test_config', '/')
76
+        configurator.add_route('home', '/')
91
         configurator.add_view(
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
             renderer='tracim:templates/mytemplate.jinja2',
87
             renderer='tracim:templates/mytemplate.jinja2',
95
         )
88
         )
96
 
89
 
97
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
90
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
98
         configurator.add_route('test_contributor', '/test_contributor')
91
         configurator.add_route('test_contributor', '/test_contributor')
99
         configurator.add_view(
92
         configurator.add_view(
100
-            self.test_contributor_page,
93
+            self.test_contributor,
101
             route_name='test_contributor',
94
             route_name='test_contributor',
102
             renderer='tracim:templates/mytemplate.jinja2',
95
             renderer='tracim:templates/mytemplate.jinja2',
103
         )
96
         )
104
-
105
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
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
         configurator.add_view(
99
         configurator.add_view(
108
-            self.test_admin_page,
109
-            route_name='test_admin',
100
+            self.test_contributor,
101
+            route_name='test_reader',
110
             renderer='tracim:templates/mytemplate.jinja2',
102
             renderer='tracim:templates/mytemplate.jinja2',
111
         )
103
         )
112
-
113
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
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
         configurator.add_view(
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
             renderer='tracim:templates/mytemplate.jinja2',
112
             renderer='tracim:templates/mytemplate.jinja2',
119
         )
113
         )
120
 
114
 
121
         # TODO - G.M - 10-04-2018 - [cleanup][tempExample] - Drop this method
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
         configurator.add_view(
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
             renderer='tracim:templates/mytemplate.jinja2',
123
             renderer='tracim:templates/mytemplate.jinja2',
127
         )
124
         )
128
-
129
         configurator.add_forbidden_view(self.forbidden_view)
125
         configurator.add_forbidden_view(self.forbidden_view)