dynamicforms-fastapi-viewsets 0.5.5__tar.gz → 0.5.7__tar.gz

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.
Files changed (52) hide show
  1. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/PKG-INFO +1 -1
  2. dynamicforms_fastapi_viewsets-0.5.7/fastapi_viewsets/__init__.py +1 -0
  3. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/celery_viewset/server.py +6 -1
  4. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/middleware/auth/authorization.py +15 -9
  5. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/mux_ws/protocol.py +2 -2
  6. dynamicforms_fastapi_viewsets-0.5.5/fastapi_viewsets/__init__.py +0 -1
  7. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/.gitignore +0 -0
  8. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/LICENSE +0 -0
  9. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/README.md +0 -0
  10. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/action_configuration.py +0 -0
  11. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/backends/__init__.py +0 -0
  12. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/backends/django_orm.py +0 -0
  13. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/collection_viewset.py +0 -0
  14. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/conf.py +0 -0
  15. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/context/__init__.py +0 -0
  16. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/context/auth/__init__.py +0 -0
  17. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/context/auth/django.py +0 -0
  18. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/context/auth/jwt.py +0 -0
  19. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/context/auth/static.py +0 -0
  20. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/cursor.py +0 -0
  21. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/__init__.py +0 -0
  22. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/build_schema.py +0 -0
  23. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/celery_viewset/__init__.py +0 -0
  24. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/celery_viewset/client.py +0 -0
  25. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/celery_viewset/result_reader.py +0 -0
  26. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/conftest.py +0 -0
  27. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/lifecycle_runner.py +0 -0
  28. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/primary_key_model_helper.py +0 -0
  29. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/decorators/route_viewset.py +0 -0
  30. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/endpoint_docs.py +0 -0
  31. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/filters/__init__.py +0 -0
  32. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/filters/base.py +0 -0
  33. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/filters/declaration.py +0 -0
  34. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/filters/operators.py +0 -0
  35. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/filters/registry.py +0 -0
  36. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/list_query.py +0 -0
  37. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/list_shapes.py +0 -0
  38. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/middleware/__init__.py +0 -0
  39. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/middleware/auth/__init__.py +0 -0
  40. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/middleware/rate_limiter.py +0 -0
  41. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/mixins.py +0 -0
  42. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/mux_ws/__init__.py +0 -0
  43. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/mux_ws/asgi.py +0 -0
  44. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/mux_ws/registry.py +0 -0
  45. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/mux_ws/server.py +0 -0
  46. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/mux_ws/transports.py +0 -0
  47. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/py.typed +0 -0
  48. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/response_classes.py +0 -0
  49. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/save_state/__init__.py +0 -0
  50. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/save_state/save_state.py +0 -0
  51. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/fastapi_viewsets/save_state/serialize_state.py +0 -0
  52. {dynamicforms_fastapi_viewsets-0.5.5 → dynamicforms_fastapi_viewsets-0.5.7}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dynamicforms-fastapi-viewsets
3
- Version: 0.5.5
3
+ Version: 0.5.7
4
4
  Summary: Django REST Framework-style viewsets for FastAPI, with optional Celery-backed async execution and a Vue/TypeScript client counterpart.
5
5
  Project-URL: Homepage, https://github.com/dynamicforms/fastapi-viewsets
6
6
  Project-URL: Repository, https://github.com/dynamicforms/fastapi-viewsets
@@ -0,0 +1 @@
1
+ __version__ = "0.5.7"
@@ -175,7 +175,12 @@ def celery_viewset_server(
175
175
  continue
176
176
  seen_tasks.add(task_name)
177
177
 
178
- celery_app.task(name=task_name)(get_sync_wrapper(route.endpoint, task_name))
178
+ # ignore_result=True - celery_viewset_client never reads Celery's own result backend,
179
+ # it awaits the redis_client.rpush() queue above instead (see client.py). Without this,
180
+ # Celery still calls task.backend.mark_as_done(retval=result) on every task, and a raw
181
+ # Pydantic model (or list of them) returned by the endpoint isn't JSON-serializable by
182
+ # Celery's own encoder, crashing that unused store.
183
+ celery_app.task(name=task_name, ignore_result=True)(get_sync_wrapper(route.endpoint, task_name))
179
184
 
180
185
  cls.__celery_viewset_metadata__ = {"task_prefix": task_prefix, "lifecycle": lifecycle, "celery_app": celery_app}
181
186
 
@@ -23,14 +23,18 @@ class Authorization(Middleware):
23
23
  - If it's callable, it's evaluated as `check(request, cls, context)` (sync or async) in
24
24
  `depends()` - bridged onto FastAPI's own `Depends()` by route_viewset - a falsy result
25
25
  rejects the request with 403 before `perform_*` (or even FastAPI's own body parsing) ever
26
- runs. Use this for checks that don't need a specific record (e.g. a role check).
27
- - Either way (callable or not, or even unconfigured), the resolved value is made available as
28
- `context.authorization` (set in `__call__`, unconditionally, in the onion chain - there's no
29
- reject decision here, so there's no benefit to doing this any earlier) - `perform_*` can
30
- inspect it once it has whatever record-specific info a check needs (e.g. the object a `pk`
31
- resolved to) and reject itself (`raise HTTPException(403, ...)`) if it decides to. This is
32
- the "no hook in the middleware layer needed" case - just raise, same as anywhere else in the
33
- pipeline (see docs/guide/action-configuration.md's "Rejecting a request: just raise").
26
+ runs. Use this for checks that don't need a specific record (e.g. a role check). A callable
27
+ config is consumed entirely by `depends()` and never reaches `context.authorization` - there
28
+ is nothing left for `perform_*` to do with the check function itself, and a bare function
29
+ isn't something a `celery_viewset` worker could receive anyway.
30
+ - Otherwise (non-callable, or unconfigured/`None`), nothing is enforced by the middleware
31
+ itself; the value is made available as `context.authorization` (set in `__call__`, in the
32
+ onion chain - there's no reject decision here, so there's no benefit to doing this any
33
+ earlier) - `perform_*` can inspect it once it has whatever record-specific info a check
34
+ needs (e.g. the object a `pk` resolved to) and reject itself (`raise HTTPException(403,
35
+ ...)`) if it decides to. This is the "no hook in the middleware layer needed" case - just
36
+ raise, same as anywhere else in the pipeline (see docs/guide/action-configuration.md's
37
+ "Rejecting a request: just raise").
34
38
 
35
39
  Unconfigured (no `@action_configuration` entry for `Authorization` at all): nothing is
36
40
  enforced, `context.authorization` resolves to `None`.
@@ -63,5 +67,7 @@ class Authorization(Middleware):
63
67
  context: "Context",
64
68
  call_next: Callable[[], Awaitable[ViewSetResult]],
65
69
  ) -> ViewSetResult:
66
- context.set("authorization", self.config_from(context))
70
+ config = self.config_from(context)
71
+ if not callable(config):
72
+ context.set("authorization", config)
67
73
  return await call_next()
@@ -37,8 +37,6 @@ consume the whole body before learning whether it was an error at all.
37
37
  from typing import Any
38
38
  from urllib.parse import urlencode
39
39
 
40
- from muxws.frames import ABSENT
41
-
42
40
  METHOD_KEY = ":method"
43
41
  PATH_KEY = ":path"
44
42
  QUERY_KEY = ":query"
@@ -120,4 +118,6 @@ def build_response_meta(status: int, headers: dict[str, str]) -> dict[str, Any]:
120
118
 
121
119
  def body_to_payload(body: Any) -> Any:
122
120
  """`ABSENT` is muxws' "no payload at all", which is a different frame from a null payload."""
121
+ from muxws.frames import ABSENT
122
+
123
123
  return ABSENT if body is None else body
@@ -1 +0,0 @@
1
- __version__ = "0.5.5"