django-ninja-aio-crud 2.11.0__tar.gz → 2.11.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.

Potentially problematic release.


This version of django-ninja-aio-crud might be problematic. Click here for more details.

Files changed (104) hide show
  1. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/PKG-INFO +1 -1
  2. django_ninja_aio_crud-2.11.2/docs/api/renderers/orjson_renderer.md +57 -0
  3. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/__init__.py +1 -1
  4. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/models/utils.py +1 -1
  5. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/renders.py +3 -1
  6. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/core/test_renderer_parser.py +23 -0
  7. django_ninja_aio_crud-2.11.0/docs/api/renderers/orjson_renderer.md +0 -20
  8. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/.github/dependabot.yml +0 -0
  9. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/.github/workflows/coverage.yml +0 -0
  10. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/.github/workflows/docs.yml +0 -0
  11. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/.github/workflows/publish.yml +0 -0
  12. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/.gitignore +0 -0
  13. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/.pre-commit-config.yaml +0 -0
  14. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/LICENSE +0 -0
  15. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/README.md +0 -0
  16. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/CNAME +0 -0
  17. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/api/authentication.md +0 -0
  18. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/api/models/model_serializer.md +0 -0
  19. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/api/models/model_util.md +0 -0
  20. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/api/models/serializers.md +0 -0
  21. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/api/pagination.md +0 -0
  22. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/api/views/api_view.md +0 -0
  23. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/api/views/api_view_set.md +0 -0
  24. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/api/views/decorators.md +0 -0
  25. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/api/views/mixins.md +0 -0
  26. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/auth.md +0 -0
  27. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/contributing.md +0 -0
  28. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/extra.css +0 -0
  29. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/getting_started/images/index/foo-index-create-swagger.png +0 -0
  30. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/getting_started/images/index/foo-index-delete-swagger.png +0 -0
  31. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/getting_started/images/index/foo-index-list-swagger.png +0 -0
  32. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/getting_started/images/index/foo-index-retrieve-swagger.png +0 -0
  33. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/getting_started/images/index/foo-index-swagger.png +0 -0
  34. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/getting_started/images/index/foo-index-update-swagger.png +0 -0
  35. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/getting_started/installation.md +0 -0
  36. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/getting_started/quick_start.md +0 -0
  37. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/images/bar-swagger.png +0 -0
  38. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/images/favicon.ico +0 -0
  39. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/images/foo-swagger.png +0 -0
  40. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/images/logo.png +0 -0
  41. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/images/model_util/foo-reverse-relations-swagger.png +0 -0
  42. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/index.md +0 -0
  43. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/release_notes.md +0 -0
  44. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/requirements.txt +0 -0
  45. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/tutorial/authentication.md +0 -0
  46. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/tutorial/crud.md +0 -0
  47. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/tutorial/filtering.md +0 -0
  48. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/docs/tutorial/model.md +0 -0
  49. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/main.py +0 -0
  50. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/mkdocs.yml +0 -0
  51. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/api.py +0 -0
  52. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/auth.py +0 -0
  53. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/decorators/__init__.py +0 -0
  54. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/decorators/operations.py +0 -0
  55. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/decorators/views.py +0 -0
  56. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/exceptions.py +0 -0
  57. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/factory/__init__.py +0 -0
  58. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/factory/operations.py +0 -0
  59. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/helpers/__init__.py +0 -0
  60. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/helpers/api.py +0 -0
  61. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/helpers/query.py +0 -0
  62. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/models/__init__.py +0 -0
  63. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/models/serializers.py +0 -0
  64. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/parsers.py +0 -0
  65. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/schemas/__init__.py +0 -0
  66. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/schemas/api.py +0 -0
  67. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/schemas/filters.py +0 -0
  68. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/schemas/generics.py +0 -0
  69. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/schemas/helpers.py +0 -0
  70. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/types.py +0 -0
  71. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/views/__init__.py +0 -0
  72. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/views/api.py +0 -0
  73. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/ninja_aio/views/mixins.py +0 -0
  74. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/pyproject.toml +0 -0
  75. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/requirements.dev.txt +0 -0
  76. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/run-local-coverage.sh +0 -0
  77. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/__init__.py +0 -0
  78. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/core/__init__.py +0 -0
  79. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/core/test_decorators.py +0 -0
  80. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/core/test_exceptions_api.py +0 -0
  81. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/generics/__init__.py +0 -0
  82. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/generics/literals.py +0 -0
  83. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/generics/models.py +0 -0
  84. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/generics/request.py +0 -0
  85. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/generics/views.py +0 -0
  86. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/helpers/__init__.py +0 -0
  87. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/helpers/test_many_to_many_api.py +0 -0
  88. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/models/__init__.py +0 -0
  89. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/models/test_model_util.py +0 -0
  90. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/models/test_models_extra.py +0 -0
  91. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_app/__init__.py +0 -0
  92. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_app/models.py +0 -0
  93. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_app/schema.py +0 -0
  94. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_app/serializers.py +0 -0
  95. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_app/views.py +0 -0
  96. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_auth.py +0 -0
  97. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_decorators.py +0 -0
  98. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_exceptions.py +0 -0
  99. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_query_util.py +0 -0
  100. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_serializers.py +0 -0
  101. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/test_settings.py +0 -0
  102. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/views/__init__.py +0 -0
  103. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/views/test_views.py +0 -0
  104. {django_ninja_aio_crud-2.11.0 → django_ninja_aio_crud-2.11.2}/tests/views/test_viewset.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-ninja-aio-crud
3
- Version: 2.11.0
3
+ Version: 2.11.2
4
4
  Summary: Django Ninja AIO CRUD - Rest Framework
5
5
  Author: Giuseppe Casillo
6
6
  Requires-Python: >=3.10, <3.15
@@ -0,0 +1,57 @@
1
+ # ORJSON Renderer
2
+
3
+ This package uses an internal ORJSON-based renderer that automatically handles JSON serialization with support for special types.
4
+
5
+ ## Configuration
6
+
7
+ Configure serialization options via Django settings:
8
+
9
+ ```python
10
+ # settings.py
11
+ import orjson
12
+
13
+ # Single option
14
+ NINJA_AIO_ORJSON_RENDERER_OPTION = orjson.OPT_INDENT_2
15
+
16
+ # Multiple options (bitwise OR)
17
+ NINJA_AIO_ORJSON_RENDERER_OPTION = (
18
+ orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS
19
+ )
20
+ ```
21
+
22
+ Notes:
23
+
24
+ - The value is an orjson option bitmask (e.g., `orjson.OPT_INDENT_2`, `orjson.OPT_NON_STR_KEYS`), and you can combine multiple options using `|`.
25
+ - If not set, the default `orjson.dumps` options are used.
26
+
27
+ ## HttpResponse Passthrough
28
+
29
+ The renderer automatically detects when you return a Django `HttpResponse` (or any `HttpResponseBase` subclass) and passes it through without JSON serialization. This allows you to return custom responses with different content types.
30
+
31
+ ```python
32
+ from django.http import HttpResponse
33
+
34
+ @api.get("/public-key")
35
+ def get_public_key(request):
36
+ return HttpResponse(
37
+ settings.JWT_PUBLIC_KEY.as_pem(),
38
+ content_type="application/x-pem-file",
39
+ status=200,
40
+ )
41
+ ```
42
+
43
+ This also works with `StreamingHttpResponse` for large files:
44
+
45
+ ```python
46
+ from django.http import StreamingHttpResponse
47
+
48
+ @api.get("/download")
49
+ def download_file(request):
50
+ return StreamingHttpResponse(
51
+ file_iterator(),
52
+ content_type="application/octet-stream",
53
+ )
54
+ ```
55
+
56
+ !!! note
57
+ When returning an `HttpResponse` directly, the response bypasses the renderer entirely. Set the `status` parameter on the `HttpResponse` itself rather than using a tuple return like `return 200, HttpResponse(...)`.
@@ -1,6 +1,6 @@
1
1
  """Django Ninja AIO CRUD - Rest Framework"""
2
2
 
3
- __version__ = "2.11.0"
3
+ __version__ = "2.11.2"
4
4
 
5
5
  from .api import NinjaAIO
6
6
 
@@ -601,7 +601,7 @@ class ModelUtil:
601
601
  async def _bump_object_from_schema(
602
602
  self, obj: type["ModelSerializer"] | models.Model, schema: Schema
603
603
  ):
604
- return (await sync_to_async(schema.from_orm)(obj)).model_dump(mode="json")
604
+ return (await sync_to_async(schema.from_orm)(obj)).model_dump()
605
605
 
606
606
  def _validate_read_params(self, request: HttpRequest, query_data: QuerySchema):
607
607
  """Validate required parameters for read operations."""
@@ -3,7 +3,7 @@ from ipaddress import IPv4Address, IPv6Address
3
3
  from typing import Any
4
4
 
5
5
  import orjson
6
- from django.http import HttpRequest
6
+ from django.http import HttpRequest, HttpResponseBase
7
7
  from django.conf import settings
8
8
  from ninja.renderers import BaseRenderer
9
9
  from pydantic import AnyUrl
@@ -14,6 +14,8 @@ class ORJSONRenderer(BaseRenderer):
14
14
  option = getattr(settings, "NINJA_AIO_ORJSON_RENDERER_OPTION", None)
15
15
 
16
16
  def render(self, request: HttpRequest, data: dict, *, response_status):
17
+ if isinstance(data, HttpResponseBase):
18
+ return data
17
19
  try:
18
20
  old_d = data
19
21
  for k, v in old_d.items():
@@ -1,6 +1,7 @@
1
1
  import base64
2
2
  from ipaddress import IPv4Address, IPv6Address
3
3
 
4
+ from django.http import HttpResponse, StreamingHttpResponse
4
5
  from django.test import TestCase, tag
5
6
  import orjson
6
7
  from ninja_aio.renders import ORJSONRenderer
@@ -73,3 +74,25 @@ class ORJSONRendererParserTestCase(TestCase):
73
74
  rendered = self.renderer.render(DummyRequest(), int_data, response_status=200)
74
75
  decoded = orjson.loads(rendered)
75
76
  self.assertEqual(decoded, 42)
77
+
78
+ def test_renderer_http_response_passthrough(self):
79
+ """Test that renderer returns HttpResponse as-is without serialization."""
80
+ response = HttpResponse(
81
+ b"-----BEGIN PUBLIC KEY-----\ntest\n-----END PUBLIC KEY-----",
82
+ content_type="application/x-pem-file",
83
+ status=200,
84
+ )
85
+ rendered = self.renderer.render(DummyRequest(), response, response_status=200)
86
+ self.assertIs(rendered, response)
87
+ self.assertEqual(rendered.content, b"-----BEGIN PUBLIC KEY-----\ntest\n-----END PUBLIC KEY-----")
88
+ self.assertEqual(rendered["Content-Type"], "application/x-pem-file")
89
+
90
+ def test_renderer_streaming_http_response_passthrough(self):
91
+ """Test that renderer returns StreamingHttpResponse as-is."""
92
+ response = StreamingHttpResponse(
93
+ iter([b"chunk1", b"chunk2"]),
94
+ content_type="application/octet-stream",
95
+ )
96
+ rendered = self.renderer.render(DummyRequest(), response, response_status=200)
97
+ self.assertIs(rendered, response)
98
+ self.assertEqual(rendered["Content-Type"], "application/octet-stream")
@@ -1,20 +0,0 @@
1
- # ORJSON renderer option
2
-
3
- This package uses an internal ORJSON-based renderer. Configure serialization options via Django settings:
4
-
5
- ```python
6
- # settings.py
7
- import orjson
8
-
9
- # Single option
10
- NINJA_AIO_ORJSON_RENDERER_OPTION = orjson.OPT_INDENT_2
11
-
12
- # Multiple options (bitwise OR)
13
- NINJA_AIO_ORJSON_RENDERER_OPTION = (
14
- orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS
15
- )
16
- ```
17
-
18
- Notes:
19
- - The value is an orjson option bitmask (e.g., `orjson.OPT_INDENT_2`, `orjson.OPT_NON_STR_KEYS`), and you can combine multiple options using `|`.
20
- - If not set, the default `orjson.dumps` options are used.