django-ninja-aio-crud 0.11.1__tar.gz → 0.11.3__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.
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/PKG-INFO +1 -1
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/__init__.py +1 -1
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/views.py +80 -77
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/LICENSE +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/README.md +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/api.py +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/auth.py +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/decorators.py +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/exceptions.py +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/models.py +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/parsers.py +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/renders.py +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/schemas.py +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/ninja_aio/types.py +0 -0
- {django_ninja_aio_crud-0.11.1 → django_ninja_aio_crud-0.11.3}/pyproject.toml +0 -0
|
@@ -150,11 +150,12 @@ class APIViewSet:
|
|
|
150
150
|
retrieve_docs = "Retrieve a specific object by its primary key."
|
|
151
151
|
update_docs = "Update an object by its primary key."
|
|
152
152
|
delete_docs = "Delete an object by its primary key."
|
|
153
|
-
m2m_relations: tuple[ModelSerializer | Model, str] = []
|
|
153
|
+
m2m_relations: list[tuple[ModelSerializer | Model, str]] = []
|
|
154
154
|
m2m_add = True
|
|
155
155
|
m2m_remove = True
|
|
156
156
|
m2m_get = True
|
|
157
157
|
m2m_auth: list | None = NOT_SET
|
|
158
|
+
m2m_path: str = ""
|
|
158
159
|
|
|
159
160
|
def __init__(self) -> None:
|
|
160
161
|
self.error_codes = ERROR_CODES
|
|
@@ -247,6 +248,7 @@ class APIViewSet:
|
|
|
247
248
|
@unique_view(self)
|
|
248
249
|
async def create(request: HttpRequest, data: self.schema_in): # type: ignore
|
|
249
250
|
return 201, await self.model_util.create_s(request, data, self.schema_out)
|
|
251
|
+
|
|
250
252
|
return create
|
|
251
253
|
|
|
252
254
|
def list_view(self):
|
|
@@ -279,6 +281,7 @@ class APIViewSet:
|
|
|
279
281
|
async for obj in qs.all()
|
|
280
282
|
]
|
|
281
283
|
return objs
|
|
284
|
+
|
|
282
285
|
return list
|
|
283
286
|
|
|
284
287
|
def retrieve_view(self):
|
|
@@ -293,6 +296,7 @@ class APIViewSet:
|
|
|
293
296
|
async def retrieve(request: HttpRequest, pk: Path[self.path_schema]): # type: ignore
|
|
294
297
|
obj = await self.model_util.get_object(request, self._get_pk(pk))
|
|
295
298
|
return await self.model_util.read_s(request, obj, self.schema_out)
|
|
299
|
+
|
|
296
300
|
return retrieve
|
|
297
301
|
|
|
298
302
|
def update_view(self):
|
|
@@ -312,6 +316,7 @@ class APIViewSet:
|
|
|
312
316
|
return await self.model_util.update_s(
|
|
313
317
|
request, data, self._get_pk(pk), self.schema_out
|
|
314
318
|
)
|
|
319
|
+
|
|
315
320
|
return update
|
|
316
321
|
|
|
317
322
|
def delete_view(self):
|
|
@@ -322,10 +327,10 @@ class APIViewSet:
|
|
|
322
327
|
description=self.delete_docs,
|
|
323
328
|
response={204: None, self.error_codes: GenericMessageSchema},
|
|
324
329
|
)
|
|
325
|
-
|
|
326
330
|
@unique_view(self)
|
|
327
331
|
async def delete(request: HttpRequest, pk: Path[self.path_schema]): # type: ignore
|
|
328
332
|
return 204, await self.model_util.delete_s(request, self._get_pk(pk))
|
|
333
|
+
|
|
329
334
|
return delete
|
|
330
335
|
|
|
331
336
|
def views(self):
|
|
@@ -393,7 +398,11 @@ class APIViewSet:
|
|
|
393
398
|
def _m2m_views(self):
|
|
394
399
|
for model, related_name in self.m2m_relations:
|
|
395
400
|
rel_util = ModelUtil(model)
|
|
396
|
-
rel_path =
|
|
401
|
+
rel_path = (
|
|
402
|
+
rel_util.verbose_name_path_resolver()
|
|
403
|
+
if not self.m2m_path
|
|
404
|
+
else self.m2m_path
|
|
405
|
+
)
|
|
397
406
|
if self.m2m_get:
|
|
398
407
|
|
|
399
408
|
@self.router.get(
|
|
@@ -406,6 +415,7 @@ class APIViewSet:
|
|
|
406
415
|
summary=f"Get {rel_util.model._meta.verbose_name_plural.capitalize()}",
|
|
407
416
|
description=f"Get all related {rel_util.model._meta.verbose_name_plural.capitalize()}",
|
|
408
417
|
)
|
|
418
|
+
@unique_view(f"get_{self.model_util.model_name}_{rel_path}")
|
|
409
419
|
@paginate(self.pagination_class)
|
|
410
420
|
async def get_related(request: HttpRequest, pk: Path[self.path_schema]): # type: ignore
|
|
411
421
|
obj = await self.model_util.get_object(request, self._get_pk(pk))
|
|
@@ -419,83 +429,76 @@ class APIViewSet:
|
|
|
419
429
|
]
|
|
420
430
|
return related_objs
|
|
421
431
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
if self.m2m_add
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
else M2MRemoveSchemaIn
|
|
433
|
-
)
|
|
432
|
+
if self.m2m_add or self.m2m_remove:
|
|
433
|
+
summary = f"{'Add or Remove' if self.m2m_add and self.m2m_remove else 'Add' if self.m2m_add else 'Remove'} {rel_util.model._meta.verbose_name_plural.capitalize()}"
|
|
434
|
+
description = f"{'Add or remove' if self.m2m_add and self.m2m_remove else 'Add' if self.m2m_add else 'Remove'} {rel_util.model._meta.verbose_name_plural.capitalize()}"
|
|
435
|
+
schema_in = (
|
|
436
|
+
M2MSchemaIn
|
|
437
|
+
if self.m2m_add and self.m2m_remove
|
|
438
|
+
else M2MAddSchemaIn
|
|
439
|
+
if self.m2m_add
|
|
440
|
+
else M2MRemoveSchemaIn
|
|
441
|
+
)
|
|
434
442
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
443
|
+
@self.router.post(
|
|
444
|
+
f"{self.path_retrieve}{rel_path}/",
|
|
445
|
+
response={
|
|
446
|
+
200: M2MSchemaOut,
|
|
447
|
+
self.error_codes: GenericMessageSchema,
|
|
448
|
+
},
|
|
449
|
+
auth=self.m2m_auth,
|
|
450
|
+
summary=summary,
|
|
451
|
+
description=description,
|
|
452
|
+
)
|
|
453
|
+
@unique_view(f"manage_{self.model_util.model_name}_{rel_path}")
|
|
454
|
+
async def manage_related(
|
|
455
|
+
request: HttpRequest,
|
|
456
|
+
pk: Path[self.path_schema], # type: ignore
|
|
457
|
+
data: schema_in, # type: ignore
|
|
458
|
+
):
|
|
459
|
+
obj = await self.model_util.get_object(request, self._get_pk(pk))
|
|
460
|
+
related_manager: QuerySet = getattr(obj, related_name)
|
|
461
|
+
add_errors, add_details, add_objs = [], [], []
|
|
462
|
+
remove_errors, remove_details, remove_objs = [], [], []
|
|
463
|
+
|
|
464
|
+
if self.m2m_add and hasattr(data, "add"):
|
|
465
|
+
(
|
|
466
|
+
add_errors,
|
|
467
|
+
add_details,
|
|
468
|
+
add_objs,
|
|
469
|
+
) = await self._check_m2m_objs(
|
|
470
|
+
request, data.add, model, related_manager
|
|
452
471
|
)
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
)
|
|
465
|
-
if self.m2m_remove and hasattr(data, "remove"):
|
|
466
|
-
(
|
|
467
|
-
remove_errors,
|
|
468
|
-
remove_details,
|
|
469
|
-
remove_objs,
|
|
470
|
-
) = await self._check_m2m_objs(
|
|
471
|
-
request,
|
|
472
|
-
data.remove,
|
|
473
|
-
model,
|
|
474
|
-
related_manager,
|
|
475
|
-
remove=True,
|
|
476
|
-
)
|
|
477
|
-
|
|
478
|
-
await asyncio.gather(
|
|
479
|
-
related_manager.aadd(*add_objs),
|
|
480
|
-
related_manager.aremove(*remove_objs),
|
|
472
|
+
if self.m2m_remove and hasattr(data, "remove"):
|
|
473
|
+
(
|
|
474
|
+
remove_errors,
|
|
475
|
+
remove_details,
|
|
476
|
+
remove_objs,
|
|
477
|
+
) = await self._check_m2m_objs(
|
|
478
|
+
request,
|
|
479
|
+
data.remove,
|
|
480
|
+
model,
|
|
481
|
+
related_manager,
|
|
482
|
+
remove=True,
|
|
481
483
|
)
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
"results": {
|
|
487
|
-
"count": len(results),
|
|
488
|
-
"details": results,
|
|
489
|
-
},
|
|
490
|
-
"errors": {
|
|
491
|
-
"count": len(errors),
|
|
492
|
-
"details": errors,
|
|
493
|
-
},
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
manage_related.__name__ = (
|
|
497
|
-
f"manage_{self.model_util.model_name}_{rel_path}"
|
|
484
|
+
|
|
485
|
+
await asyncio.gather(
|
|
486
|
+
related_manager.aadd(*add_objs),
|
|
487
|
+
related_manager.aremove(*remove_objs),
|
|
498
488
|
)
|
|
489
|
+
results = add_details + remove_details
|
|
490
|
+
errors = add_errors + remove_errors
|
|
491
|
+
|
|
492
|
+
return {
|
|
493
|
+
"results": {
|
|
494
|
+
"count": len(results),
|
|
495
|
+
"details": results,
|
|
496
|
+
},
|
|
497
|
+
"errors": {
|
|
498
|
+
"count": len(errors),
|
|
499
|
+
"details": errors,
|
|
500
|
+
},
|
|
501
|
+
}
|
|
499
502
|
|
|
500
503
|
def _add_views(self):
|
|
501
504
|
if "all" in self.disable:
|
|
@@ -516,4 +519,4 @@ class APIViewSet:
|
|
|
516
519
|
return self.router
|
|
517
520
|
|
|
518
521
|
def add_views_to_route(self):
|
|
519
|
-
return self.api.add_router(f"{self.api_route_path}", self._add_views())
|
|
522
|
+
return self.api.add_router(f"{self.api_route_path}", self._add_views())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|