|
@@ -1,8 +1,11 @@
|
1
|
|
-import typing
|
|
1
|
+# -*- coding: utf-8 -*-
|
|
2
|
+"""
|
|
3
|
+TracimRequest and related functions
|
|
4
|
+"""
|
2
|
5
|
from pyramid.request import Request
|
3
|
6
|
from sqlalchemy.orm.exc import NoResultFound
|
4
|
7
|
|
5
|
|
-from tracim.exceptions import NotAuthentificated
|
|
8
|
+from tracim.exceptions import NotAuthentificated, UserNotExist
|
6
|
9
|
from tracim.exceptions import WorkspaceNotFound
|
7
|
10
|
from tracim.exceptions import ImmutableAttribute
|
8
|
11
|
from tracim.lib.core.user import UserApi
|
|
@@ -32,8 +35,13 @@ class TracimRequest(Request):
|
32
|
35
|
decode_param_names,
|
33
|
36
|
**kw
|
34
|
37
|
)
|
|
38
|
+ # Current workspace, found by request headers or content
|
35
|
39
|
self._current_workspace = None # type: Workspace
|
|
40
|
+ # Authenticated user
|
36
|
41
|
self._current_user = None # type: User
|
|
42
|
+ # User found from request headers, content, distinct from authenticated
|
|
43
|
+ # user
|
|
44
|
+ self._user_candidate = None # type: User
|
37
|
45
|
|
38
|
46
|
@property
|
39
|
47
|
def current_workspace(self) -> Workspace:
|
|
@@ -62,8 +70,11 @@ class TracimRequest(Request):
|
62
|
70
|
|
63
|
71
|
@property
|
64
|
72
|
def current_user(self) -> User:
|
|
73
|
+ """
|
|
74
|
+ Get user from authentication mecanism.
|
|
75
|
+ """
|
65
|
76
|
if self._current_user is None:
|
66
|
|
- self.current_user = get_safe_user(self)
|
|
77
|
+ self.current_user = get_auth_safe_user(self)
|
67
|
78
|
return self._current_user
|
68
|
79
|
|
69
|
80
|
@current_user.setter
|
|
@@ -74,11 +85,55 @@ class TracimRequest(Request):
|
74
|
85
|
)
|
75
|
86
|
self._current_user = user
|
76
|
87
|
|
|
88
|
+ # TODO - G.M - 24-05-2018 - Find a better naming for this ?
|
|
89
|
+ @property
|
|
90
|
+ def candidate_user(self) -> User:
|
|
91
|
+ """
|
|
92
|
+ Get user from headers/body request. This user is not
|
|
93
|
+ the one found by authentication mecanism. This user
|
|
94
|
+ can help user to know about who one page is about in
|
|
95
|
+ a similar way as current_workspace.
|
|
96
|
+ """
|
|
97
|
+ if self._user_candidate is None:
|
|
98
|
+ self.candidate_user = get_candidate_user(self)
|
|
99
|
+ return self._user_candidate
|
|
100
|
+
|
|
101
|
+ @candidate_user.setter
|
|
102
|
+ def candidate_user(self, user: User) -> None:
|
|
103
|
+ if self._user_candidate is not None:
|
|
104
|
+ raise ImmutableAttribute(
|
|
105
|
+ "Can't modify already setted candidate_user"
|
|
106
|
+ )
|
|
107
|
+ self._user_candidate = user
|
77
|
108
|
###
|
78
|
109
|
# Utils for TracimRequest
|
79
|
110
|
###
|
80
|
111
|
|
81
|
|
-def get_safe_user(
|
|
112
|
+
|
|
113
|
+def get_candidate_user(
|
|
114
|
+ request: TracimRequest
|
|
115
|
+) -> User:
|
|
116
|
+ """
|
|
117
|
+ Get candidate user
|
|
118
|
+ :param request: pyramid request
|
|
119
|
+ :return: user found from header/body
|
|
120
|
+ """
|
|
121
|
+ app_config = request.registry.settings['CFG']
|
|
122
|
+ uapi = UserApi(None, session=request.dbsession, config=app_config)
|
|
123
|
+
|
|
124
|
+ try:
|
|
125
|
+ login = None
|
|
126
|
+ if 'user_id' in request.matchdict:
|
|
127
|
+ login = request.matchdict['user_id']
|
|
128
|
+ if not login:
|
|
129
|
+ raise UserNotExist('no user_id found, incorrect request ?')
|
|
130
|
+ user = uapi.get_one(login)
|
|
131
|
+ except NoResultFound:
|
|
132
|
+ raise NotAuthentificated('User not found')
|
|
133
|
+ return user
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+def get_auth_safe_user(
|
82
|
137
|
request: TracimRequest,
|
83
|
138
|
) -> User:
|
84
|
139
|
"""
|