django-ninja-aio-crud 0.1.4__py3-none-any.whl → 0.2.0__py3-none-any.whl

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.1
2
2
  Name: django-ninja-aio-crud
3
- Version: 0.1.4
3
+ Version: 0.2.0
4
4
  Summary: Django Ninja AIO CRUD - Rest Framework
5
5
  Author: Giuseppe Casillo
6
6
  Requires-Python: >=3.10
@@ -0,0 +1,11 @@
1
+ ninja_aio/__init__.py,sha256=jH3E7Jd2rKwk2oPVFUmf7KjKwvfN4qijMsg7QdGJ9SM,70
2
+ ninja_aio/auth.py,sha256=hGgiblvffpHmmakjaxdNT3G0tq39-Bvc5oLNqjn4qd8,1300
3
+ ninja_aio/exceptions.py,sha256=PPNr1CdC7M7Kx1MtiBGuR4hATYQqEuvxCRU6uSG7rgM,543
4
+ ninja_aio/models.py,sha256=xUZ0998bYkWumwZgnVC7P-CLdbfTzFflmJVbusU2UMY,11276
5
+ ninja_aio/parsers.py,sha256=e_4lGCPV7zs-HTqtdJTc8yQD2KPAn9njbL8nF_Mmgkc,153
6
+ ninja_aio/renders.py,sha256=wLQisbIsMJlGYJMO4Ud-qiaVCvz4yxiZ4mYommixAeQ,1453
7
+ ninja_aio/schemas.py,sha256=EgRkfhnzZqwGvdBmqlZixMtMcoD1ZxV_qzJ3fmaAy20,113
8
+ ninja_aio/views.py,sha256=ejn6adCe91YKo0-0bRePbuARHkz8YWMmP54WxQLLqxY,6322
9
+ django_ninja_aio_crud-0.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
10
+ django_ninja_aio_crud-0.2.0.dist-info/METADATA,sha256=HPVwB-vF9GmJALzGam7lD_V4WJHMRLswMouJl6-j1w4,10440
11
+ django_ninja_aio_crud-0.2.0.dist-info/RECORD,,
ninja_aio/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """ Django Ninja AIO CRUD - Rest Framework """
2
2
 
3
- __version__ = "0.1.4"
3
+ __version__ = "0.2.0"
ninja_aio/models.py CHANGED
@@ -7,10 +7,10 @@ from ninja.orm import create_schema
7
7
  from django.db import models
8
8
  from django.http import HttpResponse, HttpRequest
9
9
  from django.core.exceptions import ObjectDoesNotExist
10
- from django.db.models.fields.related import OneToOneRel
11
10
  from django.db.models.fields.related_descriptors import (
12
11
  ReverseManyToOneDescriptor,
13
12
  ReverseOneToOneDescriptor,
13
+ ManyToManyDescriptor,
14
14
  )
15
15
 
16
16
  from .exceptions import SerializeError
@@ -46,6 +46,10 @@ class ModelSerializer(models.Model):
46
46
  def has_custom_fields(self):
47
47
  return self.has_custom_fields_create or self.has_custom_fields_update
48
48
 
49
+ @classmethod
50
+ def verbose_name_path_resolver(cls) -> str:
51
+ return "-".join(cls._meta.verbose_name_plural.split(" "))
52
+
49
53
  def has_changed(self, field: str) -> bool:
50
54
  """
51
55
  Check if a model field has changed
@@ -86,10 +90,14 @@ class ModelSerializer(models.Model):
86
90
  reverse_rels = []
87
91
  for f in cls.ReadSerializer.fields:
88
92
  field_obj = getattr(cls, f)
93
+ if isinstance(field_obj, ManyToManyDescriptor):
94
+ reverse_rels.append(f)
95
+ continue
89
96
  if isinstance(field_obj, ReverseManyToOneDescriptor):
90
97
  reverse_rels.append(field_obj.field._related_name)
98
+ continue
91
99
  if isinstance(field_obj, ReverseOneToOneDescriptor):
92
- reverse_rels.append(list(field_obj[0].related_name))
100
+ reverse_rels.append(field_obj.related.name)
93
101
  return reverse_rels
94
102
 
95
103
  @classmethod
@@ -98,14 +106,24 @@ class ModelSerializer(models.Model):
98
106
  ):
99
107
  cls_f = []
100
108
  for rel_f in obj.ReadSerializer.fields:
101
- rel_f_obj = getattr(obj, rel_f).field
109
+ rel_f_obj = getattr(obj, rel_f)
102
110
  if (
103
- isinstance(rel_f_obj, (models.ForeignKey, models.OneToOneField))
104
- and rel_f_obj.related_model == cls
111
+ isinstance(
112
+ rel_f_obj.field,
113
+ (
114
+ models.ForeignKey,
115
+ models.OneToOneField,
116
+ ),
117
+ )
118
+ and rel_f_obj.field.related_model == cls
105
119
  ):
106
120
  cls_f.append(rel_f)
107
121
  obj.ReadSerializer.fields.remove(rel_f)
108
- break
122
+ continue
123
+ if isinstance(rel_f_obj.field, models.ManyToManyField):
124
+ cls_f.append(rel_f)
125
+ obj.ReadSerializer.fields.remove(rel_f)
126
+
109
127
  rel_schema = obj.generate_read_s(depth=0)
110
128
  if rel_type == "many":
111
129
  rel_schema = list[rel_schema]
@@ -124,13 +142,20 @@ class ModelSerializer(models.Model):
124
142
  reverse_rels = []
125
143
  for f in cls.ReadSerializer.fields:
126
144
  field_obj = getattr(cls, f)
145
+ if isinstance(field_obj, ManyToManyDescriptor):
146
+ rel_obj: ModelSerializer = field_obj.field.related_model
147
+ if field_obj.reverse:
148
+ rel_obj: ModelSerializer = field_obj.field.model
149
+ rel_data = cls.get_reverse_relation_schema(rel_obj, "many", f)
150
+ reverse_rels.append(rel_data)
151
+ continue
127
152
  if isinstance(field_obj, ReverseManyToOneDescriptor):
128
153
  rel_obj: ModelSerializer = field_obj.field.model
129
154
  rel_data = cls.get_reverse_relation_schema(rel_obj, "many", f)
130
155
  reverse_rels.append(rel_data)
131
156
  continue
132
157
  if isinstance(field_obj, ReverseOneToOneDescriptor):
133
- rel_obj: ModelSerializer = list(field_obj)[0].related_model
158
+ rel_obj: ModelSerializer = field_obj.related.related_model
134
159
  rel_data = cls.get_reverse_relation_schema(rel_obj, "one", f)
135
160
  reverse_rels.append(rel_data)
136
161
  continue
@@ -178,7 +203,7 @@ class ModelSerializer(models.Model):
178
203
  field_obj = getattr(cls, k).related
179
204
  if isinstance(v, dict) and (
180
205
  isinstance(field_obj, models.ForeignKey)
181
- or isinstance(field_obj, OneToOneRel)
206
+ or isinstance(field_obj, models.OneToOneField)
182
207
  ):
183
208
  rel: ModelSerializer = await field_obj.related_model.get_object(
184
209
  request, list(v.values())[0]
@@ -280,10 +305,10 @@ class ModelSerializer(models.Model):
280
305
  for k, v in payload.items():
281
306
  if v is not None:
282
307
  setattr(obj, k, v)
283
- payload |= customs
284
- await obj.custom_actions(payload)
308
+ await obj.custom_actions(customs)
285
309
  await obj.asave()
286
- return await cls.read_s(request, obj)
310
+ updated_object = await cls.get_object(request, pk)
311
+ return await cls.read_s(request, updated_object)
287
312
 
288
313
  @classmethod
289
314
  async def delete_s(cls, request: HttpRequest, pk: int | str):
ninja_aio/views.py CHANGED
@@ -192,6 +192,6 @@ class APIViewSet:
192
192
 
193
193
  def add_views_to_route(self):
194
194
  return self.api.add_router(
195
- f"{self.model._meta.verbose_name_plural}/",
195
+ f"{self.model.verbose_name_path_resolver()}/",
196
196
  self.add_views(),
197
197
  )
@@ -1,11 +0,0 @@
1
- ninja_aio/__init__.py,sha256=ezfuNggZR9pW5CRIDO17RBPn9EANhL9Rz5SZVc2_7OM,70
2
- ninja_aio/auth.py,sha256=hGgiblvffpHmmakjaxdNT3G0tq39-Bvc5oLNqjn4qd8,1300
3
- ninja_aio/exceptions.py,sha256=PPNr1CdC7M7Kx1MtiBGuR4hATYQqEuvxCRU6uSG7rgM,543
4
- ninja_aio/models.py,sha256=m_agSUXIEbt_qOHQhc1G2t-W5-jTofquZDpiBf2y8so,10293
5
- ninja_aio/parsers.py,sha256=e_4lGCPV7zs-HTqtdJTc8yQD2KPAn9njbL8nF_Mmgkc,153
6
- ninja_aio/renders.py,sha256=wLQisbIsMJlGYJMO4Ud-qiaVCvz4yxiZ4mYommixAeQ,1453
7
- ninja_aio/schemas.py,sha256=EgRkfhnzZqwGvdBmqlZixMtMcoD1ZxV_qzJ3fmaAy20,113
8
- ninja_aio/views.py,sha256=j72V0GHlTNdFDsO2f8ZMy_0aS7Hb4CKWN1t_st1ohDM,6319
9
- django_ninja_aio_crud-0.1.4.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
10
- django_ninja_aio_crud-0.1.4.dist-info/METADATA,sha256=ejUKHqdUYxzqDHQOidGtEnOCe2shkLnLCH2ok7t9hac,10440
11
- django_ninja_aio_crud-0.1.4.dist-info/RECORD,,