django-ninja-aio-crud 0.1.3__tar.gz → 0.1.4__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.1
2
2
  Name: django-ninja-aio-crud
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: Django Ninja AIO CRUD - Rest Framework
5
5
  Author: Giuseppe Casillo
6
6
  Requires-Python: >=3.10
@@ -300,11 +300,11 @@ BarAPI().add_views_to_route()
300
300
 
301
301
  - Foo Schemas
302
302
 
303
- ![Swagger UI](ninja_aio/docs/images/foo-swagger.png)
303
+ ![Swagger UI](docs/images/foo-swagger.png)
304
304
 
305
305
  - Bar Schemas with reverse relation
306
306
 
307
- ![Swagger UI](ninja_aio/docs/images/bar-swagger.png)
307
+ ![Swagger UI](docs/images/bar-swagger.png)
308
308
 
309
309
  ## 🔒 Authentication
310
310
 
@@ -271,11 +271,11 @@ BarAPI().add_views_to_route()
271
271
 
272
272
  - Foo Schemas
273
273
 
274
- ![Swagger UI](ninja_aio/docs/images/foo-swagger.png)
274
+ ![Swagger UI](docs/images/foo-swagger.png)
275
275
 
276
276
  - Bar Schemas with reverse relation
277
277
 
278
- ![Swagger UI](ninja_aio/docs/images/bar-swagger.png)
278
+ ![Swagger UI](docs/images/bar-swagger.png)
279
279
 
280
280
  ## 🔒 Authentication
281
281
 
@@ -1,3 +1,3 @@
1
1
  """ Django Ninja AIO CRUD - Rest Framework """
2
2
 
3
- __version__ = "0.1.3"
3
+ __version__ = "0.1.4"
@@ -87,20 +87,24 @@ class ModelSerializer(models.Model):
87
87
  for f in cls.ReadSerializer.fields:
88
88
  field_obj = getattr(cls, f)
89
89
  if isinstance(field_obj, ReverseManyToOneDescriptor):
90
- reverse_rels.append(field_obj.field.__dict__.get("_related_name"))
90
+ reverse_rels.append(field_obj.field._related_name)
91
91
  if isinstance(field_obj, ReverseOneToOneDescriptor):
92
- reverse_rels.append(
93
- list(field_obj.__dict__.values())[0].__dict__.get("related_name")
94
- )
92
+ reverse_rels.append(list(field_obj[0].related_name))
95
93
  return reverse_rels
96
94
 
97
95
  @classmethod
98
96
  def get_reverse_relation_schema(
99
97
  cls, obj: type["ModelSerializer"], rel_type: type[REL_TYPES], field: str
100
98
  ):
101
- for index, rel_f in enumerate(obj.ReadSerializer.fields):
102
- if rel_f == cls._meta.model_name:
103
- obj.ReadSerializer.fields.pop(index)
99
+ cls_f = []
100
+ for rel_f in obj.ReadSerializer.fields:
101
+ rel_f_obj = getattr(obj, rel_f).field
102
+ if (
103
+ isinstance(rel_f_obj, (models.ForeignKey, models.OneToOneField))
104
+ and rel_f_obj.related_model == cls
105
+ ):
106
+ cls_f.append(rel_f)
107
+ obj.ReadSerializer.fields.remove(rel_f)
104
108
  break
105
109
  rel_schema = obj.generate_read_s(depth=0)
106
110
  if rel_type == "many":
@@ -110,7 +114,8 @@ class ModelSerializer(models.Model):
110
114
  rel_schema | None,
111
115
  None,
112
116
  )
113
- obj.ReadSerializer.fields.append(cls._meta.model_name)
117
+ if len(cls_f) > 0:
118
+ obj.ReadSerializer.fields.append(*cls_f)
114
119
  return rel_data
115
120
 
116
121
  @classmethod
@@ -120,14 +125,12 @@ class ModelSerializer(models.Model):
120
125
  for f in cls.ReadSerializer.fields:
121
126
  field_obj = getattr(cls, f)
122
127
  if isinstance(field_obj, ReverseManyToOneDescriptor):
123
- rel_obj: ModelSerializer = field_obj.field.__dict__.get("model")
128
+ rel_obj: ModelSerializer = field_obj.field.model
124
129
  rel_data = cls.get_reverse_relation_schema(rel_obj, "many", f)
125
130
  reverse_rels.append(rel_data)
126
131
  continue
127
132
  if isinstance(field_obj, ReverseOneToOneDescriptor):
128
- rel_obj: ModelSerializer = list(field_obj.__dict__.values())[
129
- 0
130
- ].__dict__.get("related_model")
133
+ rel_obj: ModelSerializer = list(field_obj)[0].related_model
131
134
  rel_data = cls.get_reverse_relation_schema(rel_obj, "one", f)
132
135
  reverse_rels.append(rel_data)
133
136
  continue
@@ -149,9 +152,10 @@ class ModelSerializer(models.Model):
149
152
  continue
150
153
  field_obj = getattr(cls, k).field
151
154
  if isinstance(field_obj, models.BinaryField):
152
- if not v.endswith(b"=="):
153
- v = v + b"=="
154
- payload |= {k: base64.b64decode(v)}
155
+ try:
156
+ payload |= {k: base64.b64decode(v)}
157
+ except Exception as exc:
158
+ raise SerializeError({k: ". ".join(exc.args)}, 400)
155
159
  if isinstance(field_obj, models.ForeignKey):
156
160
  try:
157
161
  rel: ModelSerializer = await field_obj.related_model.get_object(
@@ -8,9 +8,11 @@ from ninja.renderers import BaseRenderer
8
8
  class ORJSONRenderer(BaseRenderer):
9
9
  media_type = "application/json"
10
10
 
11
- def render(self, request: HttpRequest, data: dict | list, *, response_status):
12
- if isinstance(data, list):
13
- return orjson.dumps(self.render_list(data))
11
+ def render(self, request: HttpRequest, data: dict, *, response_status):
12
+ old_d = data
13
+ for k, v in old_d.items():
14
+ if isinstance(v, list):
15
+ data |= {k: self.render_list(v)}
14
16
  return orjson.dumps(self.render_dict(data))
15
17
 
16
18
  @classmethod
@@ -33,11 +35,9 @@ class ORJSONRenderer(BaseRenderer):
33
35
  v |= {k_rel: base64.b64encode(v_rel).decode()}
34
36
  data |= {k: v}
35
37
  if isinstance(v, list):
36
- index_rel = 0
37
- for f_rel in v:
38
+ for index_rel, f_rel in enumerate(v):
38
39
  for k_rel, v_rel in f_rel.items():
39
40
  if isinstance(v_rel, bytes):
40
41
  v[index_rel] |= {k_rel: base64.b64encode(v_rel).decode()}
41
- index_rel += 1
42
42
  data |= {k: v}
43
43
  return data