core-framework 0.12.6__py3-none-any.whl → 0.12.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- core/__init__.py +1 -1
- core/auth/decorators.py +28 -7
- core/permissions.py +29 -8
- {core_framework-0.12.6.dist-info → core_framework-0.12.7.dist-info}/METADATA +1 -1
- {core_framework-0.12.6.dist-info → core_framework-0.12.7.dist-info}/RECORD +7 -7
- {core_framework-0.12.6.dist-info → core_framework-0.12.7.dist-info}/WHEEL +0 -0
- {core_framework-0.12.6.dist-info → core_framework-0.12.7.dist-info}/entry_points.txt +0 -0
core/__init__.py
CHANGED
core/auth/decorators.py
CHANGED
|
@@ -24,12 +24,33 @@ from typing import Any, TYPE_CHECKING
|
|
|
24
24
|
from fastapi import Depends, HTTPException, Request, status
|
|
25
25
|
|
|
26
26
|
from core.permissions import Permission as PermissionBase
|
|
27
|
-
from core.auth.helpers import get_request_user
|
|
28
27
|
|
|
29
28
|
if TYPE_CHECKING:
|
|
30
29
|
pass
|
|
31
30
|
|
|
32
31
|
|
|
32
|
+
def _get_user(request: Request) -> Any | None:
|
|
33
|
+
"""
|
|
34
|
+
Get authenticated user from request.
|
|
35
|
+
|
|
36
|
+
Internal helper to avoid circular imports.
|
|
37
|
+
Checks both Starlette and legacy patterns.
|
|
38
|
+
"""
|
|
39
|
+
# Pattern 1: request.user (Starlette AuthenticationMiddleware)
|
|
40
|
+
user = getattr(request, "user", None)
|
|
41
|
+
if user is not None:
|
|
42
|
+
if getattr(user, "is_authenticated", False):
|
|
43
|
+
if hasattr(user, "_user"):
|
|
44
|
+
return user._user
|
|
45
|
+
return user
|
|
46
|
+
|
|
47
|
+
# Pattern 2: request.state.user (legacy)
|
|
48
|
+
if hasattr(request, "state"):
|
|
49
|
+
return getattr(request.state, "user", None)
|
|
50
|
+
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
|
|
33
54
|
# =============================================================================
|
|
34
55
|
# Classes de Permissão (para uso em ViewSets)
|
|
35
56
|
# =============================================================================
|
|
@@ -71,7 +92,7 @@ class HasPermission(PermissionBase):
|
|
|
71
92
|
request: Request,
|
|
72
93
|
view: Any = None,
|
|
73
94
|
) -> bool:
|
|
74
|
-
user =
|
|
95
|
+
user = _get_user(request)
|
|
75
96
|
|
|
76
97
|
if user is None:
|
|
77
98
|
return False
|
|
@@ -136,7 +157,7 @@ class IsInGroup(PermissionBase):
|
|
|
136
157
|
request: Request,
|
|
137
158
|
view: Any = None,
|
|
138
159
|
) -> bool:
|
|
139
|
-
user =
|
|
160
|
+
user = _get_user(request)
|
|
140
161
|
|
|
141
162
|
if user is None:
|
|
142
163
|
return False
|
|
@@ -180,7 +201,7 @@ class IsSuperuser(PermissionBase):
|
|
|
180
201
|
request: Request,
|
|
181
202
|
view: Any = None,
|
|
182
203
|
) -> bool:
|
|
183
|
-
user =
|
|
204
|
+
user = _get_user(request)
|
|
184
205
|
|
|
185
206
|
if user is None:
|
|
186
207
|
return False
|
|
@@ -208,7 +229,7 @@ class IsStaff(PermissionBase):
|
|
|
208
229
|
request: Request,
|
|
209
230
|
view: Any = None,
|
|
210
231
|
) -> bool:
|
|
211
|
-
user =
|
|
232
|
+
user = _get_user(request)
|
|
212
233
|
|
|
213
234
|
if user is None:
|
|
214
235
|
return False
|
|
@@ -236,7 +257,7 @@ class IsActive(PermissionBase):
|
|
|
236
257
|
request: Request,
|
|
237
258
|
view: Any = None,
|
|
238
259
|
) -> bool:
|
|
239
|
-
user =
|
|
260
|
+
user = _get_user(request)
|
|
240
261
|
|
|
241
262
|
if user is None:
|
|
242
263
|
return False
|
|
@@ -372,7 +393,7 @@ def login_required():
|
|
|
372
393
|
...
|
|
373
394
|
"""
|
|
374
395
|
async def check(request: Request):
|
|
375
|
-
user =
|
|
396
|
+
user = _get_user(request)
|
|
376
397
|
|
|
377
398
|
if user is None:
|
|
378
399
|
raise HTTPException(
|
core/permissions.py
CHANGED
|
@@ -15,12 +15,33 @@ from typing import Any, TYPE_CHECKING
|
|
|
15
15
|
|
|
16
16
|
from fastapi import HTTPException, Request, status
|
|
17
17
|
|
|
18
|
-
from core.auth.helpers import get_request_user
|
|
19
|
-
|
|
20
18
|
if TYPE_CHECKING:
|
|
21
19
|
from core.views import APIView
|
|
22
20
|
|
|
23
21
|
|
|
22
|
+
def _get_user(request: Request) -> Any | None:
|
|
23
|
+
"""
|
|
24
|
+
Get authenticated user from request.
|
|
25
|
+
|
|
26
|
+
Internal helper to avoid circular imports.
|
|
27
|
+
Checks both Starlette and legacy patterns.
|
|
28
|
+
"""
|
|
29
|
+
# Pattern 1: request.user (Starlette AuthenticationMiddleware)
|
|
30
|
+
user = getattr(request, "user", None)
|
|
31
|
+
if user is not None:
|
|
32
|
+
if getattr(user, "is_authenticated", False):
|
|
33
|
+
# If it's our AuthenticatedUser wrapper, return the underlying model
|
|
34
|
+
if hasattr(user, "_user"):
|
|
35
|
+
return user._user
|
|
36
|
+
return user
|
|
37
|
+
|
|
38
|
+
# Pattern 2: request.state.user (legacy)
|
|
39
|
+
if hasattr(request, "state"):
|
|
40
|
+
return getattr(request.state, "user", None)
|
|
41
|
+
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
|
|
24
45
|
class Permission(ABC):
|
|
25
46
|
"""
|
|
26
47
|
Classe base para permissões.
|
|
@@ -34,7 +55,7 @@ class Permission(ABC):
|
|
|
34
55
|
request: Request,
|
|
35
56
|
view: APIView | None = None,
|
|
36
57
|
) -> bool:
|
|
37
|
-
user =
|
|
58
|
+
user = _get_user(request)
|
|
38
59
|
return user is not None and user.is_admin
|
|
39
60
|
"""
|
|
40
61
|
|
|
@@ -216,7 +237,7 @@ class IsAuthenticated(Permission):
|
|
|
216
237
|
request: Request,
|
|
217
238
|
view: "APIView | None" = None,
|
|
218
239
|
) -> bool:
|
|
219
|
-
user =
|
|
240
|
+
user = _get_user(request)
|
|
220
241
|
return user is not None
|
|
221
242
|
|
|
222
243
|
|
|
@@ -238,7 +259,7 @@ class IsAuthenticatedOrReadOnly(Permission):
|
|
|
238
259
|
if request.method in self.SAFE_METHODS:
|
|
239
260
|
return True
|
|
240
261
|
|
|
241
|
-
user =
|
|
262
|
+
user = _get_user(request)
|
|
242
263
|
return user is not None
|
|
243
264
|
|
|
244
265
|
|
|
@@ -252,7 +273,7 @@ class IsAdmin(Permission):
|
|
|
252
273
|
request: Request,
|
|
253
274
|
view: "APIView | None" = None,
|
|
254
275
|
) -> bool:
|
|
255
|
-
user =
|
|
276
|
+
user = _get_user(request)
|
|
256
277
|
if user is None:
|
|
257
278
|
return False
|
|
258
279
|
|
|
@@ -287,7 +308,7 @@ class IsOwner(Permission):
|
|
|
287
308
|
if obj is None:
|
|
288
309
|
return True
|
|
289
310
|
|
|
290
|
-
user =
|
|
311
|
+
user = _get_user(request)
|
|
291
312
|
if user is None:
|
|
292
313
|
return False
|
|
293
314
|
|
|
@@ -320,7 +341,7 @@ class HasRole(Permission):
|
|
|
320
341
|
request: Request,
|
|
321
342
|
view: "APIView | None" = None,
|
|
322
343
|
) -> bool:
|
|
323
|
-
user =
|
|
344
|
+
user = _get_user(request)
|
|
324
345
|
if user is None:
|
|
325
346
|
return False
|
|
326
347
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: core-framework
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.7
|
|
4
4
|
Summary: Core Framework - Django-inspired, FastAPI-powered. Alta performance, baixo acoplamento, produtividade extrema.
|
|
5
5
|
Project-URL: Homepage, https://github.com/SorPuti/core-framework
|
|
6
6
|
Project-URL: Documentation, https://github.com/SorPuti/core-framework#readme
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
core/__init__.py,sha256=
|
|
1
|
+
core/__init__.py,sha256=iBDdZ1c2d4AF0Ge4SFgwizp-q1o3MkcPJESG69yUKig,12058
|
|
2
2
|
core/app.py,sha256=sCA3mJI696i7MIjrPxfOr5zEYt0njarQfHHy3EAajk4,21071
|
|
3
3
|
core/choices.py,sha256=rhcL3p2dB7RK99zIilpmoTFVcibQEIaRpz0CY0kImCE,10502
|
|
4
4
|
core/config.py,sha256=2-MVF9nLoYmxpYYH_Gzn4-Sa3MU87YZskRPtlNyhg6Q,14049
|
|
@@ -9,7 +9,7 @@ core/exceptions.py,sha256=cdcffeYnMzCbS4hApOYNmPVNbPUpKcrgJbi3nKhqTuI,22702
|
|
|
9
9
|
core/fields.py,sha256=F2NdToowkJ_LFvPN9KVyxIFES1AlVDy7WkEp-8UiBpA,9327
|
|
10
10
|
core/middleware.py,sha256=MZVw7smJ2MiycYvkaYIC2cNpyqYGk3m-eeoDandqZU4,23506
|
|
11
11
|
core/models.py,sha256=jdNdjRPKBZiOBOgg8CmDYBwmuWdD7twCIpqINLGY4Q4,33788
|
|
12
|
-
core/permissions.py,sha256=
|
|
12
|
+
core/permissions.py,sha256=rWfKYHLpWvhWnyHN7QsOmvRkX-23fgSzidFSWOrhQfs,10781
|
|
13
13
|
core/querysets.py,sha256=Z87-U06Un_xA9GKwcjXx0yzw6F_xf_tvG_rBT5UGL9c,22678
|
|
14
14
|
core/relations.py,sha256=UbdRgj0XQGI4lv2FQV1ImSAwu4Pn8yxTkSsdzR3m8cM,21372
|
|
15
15
|
core/routing.py,sha256=vIiJN8bQ2836WW2zUKTJVBTC8RpjtDYgEGdz7mldnGc,15422
|
|
@@ -20,7 +20,7 @@ core/views.py,sha256=Vm2FREET0IJ2JZbClNJ0vvZ6RN5aQKC1sDXsrOb4-SY,43319
|
|
|
20
20
|
core/auth/__init__.py,sha256=_yr4rMMvDt_uKujzkKfqlQZ6x9UiQ6jmRppw14hTQNc,4645
|
|
21
21
|
core/auth/backends.py,sha256=PkLk2RQN2rQdtYSiN0mn7cqSp95hnLjO9xTFZqSsPF8,10486
|
|
22
22
|
core/auth/base.py,sha256=Q7vXgwTmgdmyW7G8eJmDket2bKB_8YFnraZ_kK9_gTs,21425
|
|
23
|
-
core/auth/decorators.py,sha256=
|
|
23
|
+
core/auth/decorators.py,sha256=OE9yMQgwnSN8wYAnYhBjAMz__K5E1yoTGkdZCUsafEg,12826
|
|
24
24
|
core/auth/hashers.py,sha256=0gIf67TU0k5H744FADpyh9_ugxA7m3mhYPZxLh_lEtc,12808
|
|
25
25
|
core/auth/helpers.py,sha256=nuaVL9KzIy6ZkVWz9Z327qe4-sfF0NbbJDFIX3tR6vg,3020
|
|
26
26
|
core/auth/middleware.py,sha256=3Wddxi2MKHrHguKfdW9LRKhHaHcmQ807edVcsFLqhVc,16645
|
|
@@ -79,7 +79,7 @@ example/auth.py,sha256=zBpLutb8lVKnGfQqQ2wnyygsSutHYZzeJBuhnFhxBaQ,4971
|
|
|
79
79
|
example/models.py,sha256=xKdx0kJ9n0tZ7sCce3KhV3BTvKvsh6m7G69eFm3ukf0,4549
|
|
80
80
|
example/schemas.py,sha256=wJ9QofnuHp4PjtM_IuMMBLVFVDJ4YlwcF6uQm1ooKiY,6139
|
|
81
81
|
example/views.py,sha256=GQwgQcW6yoeUIDbF7-lsaZV7cs8G1S1vGVtiwVpZIQE,14338
|
|
82
|
-
core_framework-0.12.
|
|
83
|
-
core_framework-0.12.
|
|
84
|
-
core_framework-0.12.
|
|
85
|
-
core_framework-0.12.
|
|
82
|
+
core_framework-0.12.7.dist-info/METADATA,sha256=ulDjkkAMX9Axdn5SN_mpqSe4oVF4-EKprbwBTA5rwOs,12791
|
|
83
|
+
core_framework-0.12.7.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
84
|
+
core_framework-0.12.7.dist-info/entry_points.txt,sha256=lQ65IAOpieqU1VcHCUReeyandpyy8IKGix6IkJW_4Is,39
|
|
85
|
+
core_framework-0.12.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|