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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-ninja-aio-crud
3
- Version: 0.11.1
3
+ Version: 0.11.3
4
4
  Summary: Django Ninja AIO CRUD - Rest Framework
5
5
  Author: Giuseppe Casillo
6
6
  Requires-Python: >=3.10
@@ -1,6 +1,6 @@
1
1
  """Django Ninja AIO CRUD - Rest Framework"""
2
2
 
3
- __version__ = "0.11.1"
3
+ __version__ = "0.11.3"
4
4
 
5
5
  from .api import NinjaAIO
6
6
 
@@ -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 = rel_util.verbose_name_path_resolver()
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
- get_related.__name__ = f"get_{self.model_util.model_name}_{rel_path}"
423
-
424
- if self.m2m_add or self.m2m_remove:
425
- 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()}"
426
- 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()}"
427
- schema_in = (
428
- M2MSchemaIn
429
- if self.m2m_add and self.m2m_remove
430
- else M2MAddSchemaIn
431
- if self.m2m_add
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
- @self.router.post(
436
- f"{self.path_retrieve}{rel_path}/",
437
- response={
438
- 200: M2MSchemaOut,
439
- self.error_codes: GenericMessageSchema,
440
- },
441
- auth=self.m2m_auth,
442
- summary=summary,
443
- description=description,
444
- )
445
- async def manage_related(
446
- request: HttpRequest,
447
- pk: Path[self.path_schema], # type: ignore
448
- data: schema_in, # type: ignore
449
- ):
450
- obj = await self.model_util.get_object(
451
- request, self._get_pk(pk)
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
- related_manager: QuerySet = getattr(obj, related_name)
454
- add_errors, add_details, add_objs = [], [], []
455
- remove_errors, remove_details, remove_objs = [], [], []
456
-
457
- if self.m2m_add and hasattr(data, "add"):
458
- (
459
- add_errors,
460
- add_details,
461
- add_objs,
462
- ) = await self._check_m2m_objs(
463
- request, data.add, model, related_manager
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
- results = add_details + remove_details
483
- errors = add_errors + remove_errors
484
-
485
- return {
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())