dynamicforms-fastapi-viewsets 0.6.0__tar.gz → 0.6.1__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.1}/PKG-INFO +1 -1
  2. dynamicforms_fastapi_viewsets-0.6.1/fastapi_viewsets/__init__.py +1 -0
  3. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/primary_key_model_helper.py +19 -4
  4. dynamicforms_fastapi_viewsets-0.6.0/fastapi_viewsets/__init__.py +0 -1
  5. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/.gitignore +0 -0
  6. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/LICENSE +0 -0
  7. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/README.md +0 -0
  8. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/action_configuration.py +0 -0
  9. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/backends/__init__.py +0 -0
  10. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/backends/django_orm.py +0 -0
  11. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/collection_viewset.py +0 -0
  12. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/conf.py +0 -0
  13. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/context/__init__.py +0 -0
  14. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/context/auth/__init__.py +0 -0
  15. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/context/auth/django.py +0 -0
  16. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/context/auth/jwt.py +0 -0
  17. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/context/auth/static.py +0 -0
  18. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/cursor.py +0 -0
  19. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/__init__.py +0 -0
  20. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/build_schema.py +0 -0
  21. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/celery_viewset/__init__.py +0 -0
  22. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/celery_viewset/client.py +0 -0
  23. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/celery_viewset/result_reader.py +0 -0
  24. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/celery_viewset/server.py +0 -0
  25. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/conftest.py +0 -0
  26. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/lifecycle_runner.py +0 -0
  27. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/decorators/route_viewset.py +0 -0
  28. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/endpoint_docs.py +0 -0
  29. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/exceptions.py +0 -0
  30. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/filters/__init__.py +0 -0
  31. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/filters/base.py +0 -0
  32. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/filters/declaration.py +0 -0
  33. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/filters/operators.py +0 -0
  34. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/filters/registry.py +0 -0
  35. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/list_query.py +0 -0
  36. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/list_shapes.py +0 -0
  37. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/middleware/__init__.py +0 -0
  38. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/middleware/auth/__init__.py +0 -0
  39. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/middleware/auth/authorization.py +0 -0
  40. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/middleware/rate_limiter.py +0 -0
  41. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/mixins.py +0 -0
  42. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/mux_ws/__init__.py +0 -0
  43. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/mux_ws/asgi.py +0 -0
  44. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/mux_ws/protocol.py +0 -0
  45. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/mux_ws/registry.py +0 -0
  46. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/mux_ws/server.py +0 -0
  47. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/mux_ws/transports.py +0 -0
  48. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/py.typed +0 -0
  49. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/response_classes.py +0 -0
  50. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/save_state/__init__.py +0 -0
  51. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/save_state/save_state.py +0 -0
  52. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/fastapi_viewsets/save_state/serialize_state.py +0 -0
  53. {dynamicforms_fastapi_viewsets-0.6.0 → dynamicforms_fastapi_viewsets-0.6.1}/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.1
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.1"
@@ -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"