dynamicforms-fastapi-viewsets 0.6.0__tar.gz → 0.6.2__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 (53) hide show
  1. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/PKG-INFO +1 -1
  2. dynamicforms_fastapi_viewsets-0.6.2/fastapi_viewsets/__init__.py +1 -0
  3. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/celery_viewset/client.py +5 -1
  4. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/primary_key_model_helper.py +19 -4
  5. dynamicforms_fastapi_viewsets-0.6.0/fastapi_viewsets/__init__.py +0 -1
  6. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/.gitignore +0 -0
  7. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/LICENSE +0 -0
  8. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/README.md +0 -0
  9. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/action_configuration.py +0 -0
  10. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/backends/__init__.py +0 -0
  11. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/backends/django_orm.py +0 -0
  12. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/collection_viewset.py +0 -0
  13. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/conf.py +0 -0
  14. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/context/__init__.py +0 -0
  15. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/context/auth/__init__.py +0 -0
  16. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/context/auth/django.py +0 -0
  17. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/context/auth/jwt.py +0 -0
  18. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/context/auth/static.py +0 -0
  19. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/cursor.py +0 -0
  20. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/__init__.py +0 -0
  21. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/build_schema.py +0 -0
  22. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/celery_viewset/__init__.py +0 -0
  23. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/celery_viewset/result_reader.py +0 -0
  24. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/celery_viewset/server.py +0 -0
  25. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/conftest.py +0 -0
  26. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/lifecycle_runner.py +0 -0
  27. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/decorators/route_viewset.py +0 -0
  28. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/endpoint_docs.py +0 -0
  29. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/exceptions.py +0 -0
  30. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/filters/__init__.py +0 -0
  31. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/filters/base.py +0 -0
  32. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/filters/declaration.py +0 -0
  33. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/filters/operators.py +0 -0
  34. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/filters/registry.py +0 -0
  35. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/list_query.py +0 -0
  36. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/list_shapes.py +0 -0
  37. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/middleware/__init__.py +0 -0
  38. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/middleware/auth/__init__.py +0 -0
  39. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/middleware/auth/authorization.py +0 -0
  40. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/middleware/rate_limiter.py +0 -0
  41. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/mixins.py +0 -0
  42. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/mux_ws/__init__.py +0 -0
  43. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/mux_ws/asgi.py +0 -0
  44. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/mux_ws/protocol.py +0 -0
  45. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/mux_ws/registry.py +0 -0
  46. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/mux_ws/server.py +0 -0
  47. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/mux_ws/transports.py +0 -0
  48. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/py.typed +0 -0
  49. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/response_classes.py +0 -0
  50. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/save_state/__init__.py +0 -0
  51. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/save_state/save_state.py +0 -0
  52. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/fastapi_viewsets/save_state/serialize_state.py +0 -0
  53. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.2}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dynamicforms-fastapi-viewsets
3
- Version: 0.6.0
3
+ Version: 0.6.2
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.6.2"
@@ -84,11 +84,15 @@ def celery_viewset_client(
84
84
 
85
85
 
86
86
  async def _serialize_value(value):
87
- """Convert a Context or BaseModel value into a JSON-safe structure for Celery/Kombu transport."""
87
+ """Convert a Context, BaseModel, list, or dict value into a JSON-safe structure for Celery/Kombu transport."""
88
88
  if isinstance(value, Context):
89
89
  return await serialize_context(value.raw())
90
90
  if isinstance(value, BaseModel):
91
91
  return value.model_dump(mode="json")
92
+ if isinstance(value, dict):
93
+ return {k: await _serialize_value(v) for k, v in value.items()}
94
+ if isinstance(value, (list, tuple)):
95
+ return [await _serialize_value(v) for v in value]
92
96
  return value
93
97
 
94
98
 
@@ -1,4 +1,6 @@
1
- from typing import Annotated, Any, get_args, get_origin, TypeVar
1
+ import types
2
+
3
+ from typing import Annotated, Any, get_args, get_origin, TypeVar, Union
2
4
 
3
5
  from pydantic import BaseModel, create_model
4
6
 
@@ -25,14 +27,27 @@ def typecast_to_original_model(value: Any, original_annotation: type[T]) -> T:
25
27
  annotation = original_annotation
26
28
  if get_origin(annotation) is Annotated:
27
29
  annotation = get_args(annotation)[0]
28
- origin = get_origin(annotation) or annotation
30
+
31
+ origin = get_origin(annotation)
32
+ if origin is Union or origin is types.UnionType:
33
+ # Optional[Model] / Model | None: unwrap to the model member so isinstance() and
34
+ # model_validate()/model_construct() below run against the model class rather than
35
+ # the union object itself (which has neither).
36
+ annotation = next(
37
+ (arg for arg in get_args(annotation) if isinstance(arg, type) and issubclass(arg, BaseModel)),
38
+ annotation,
39
+ )
40
+ origin = get_origin(annotation) or annotation
41
+ else:
42
+ origin = origin or annotation
43
+
29
44
  if not isinstance(value, BaseModel) or isinstance(value, origin):
30
45
  return value
31
46
 
32
47
  # noinspection PyBroadException
33
48
  try:
34
- return original_annotation.model_validate(value.model_dump())
49
+ return annotation.model_validate(value.model_dump())
35
50
  except Exception:
36
51
  # Fallback: create instance with model_construct if validation fails
37
52
  # (e.g. required field missing but it will be filled by autoinc)
38
- return original_annotation.model_construct(**value.model_dump())
53
+ return annotation.model_construct(**value.model_dump())
@@ -1 +0,0 @@
1
- __version__ = "0.6.0"