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 CHANGED
@@ -278,7 +278,7 @@ from core.exceptions import (
278
278
  MissingDependency,
279
279
  )
280
280
 
281
- __version__ = "0.12.6"
281
+ __version__ = "0.12.7"
282
282
  __all__ = [
283
283
  # Models
284
284
  "Model",
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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 = get_request_user(request)
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.6
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=vm-wiEtrmCVt8WjZQ0iEghsZqmiC5CYPifbNP_BY8kk,12058
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=HhIXtmK9nehfRpTLoxKaBA-g-aCWOlDpLigo06fsEew,10144
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=Db8ihM7E2d658500aZwYKoSPduXC5nPjkQLzPakc1Mc,12269
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.6.dist-info/METADATA,sha256=LsQ-RfhBtAvm3GxcRMBLur-3lVBeig9b0pE3Hp_WXkg,12791
83
- core_framework-0.12.6.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
84
- core_framework-0.12.6.dist-info/entry_points.txt,sha256=lQ65IAOpieqU1VcHCUReeyandpyy8IKGix6IkJW_4Is,39
85
- core_framework-0.12.6.dist-info/RECORD,,
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,,