Skip to content

Commit f476dc1

Browse files
committed
revert
1 parent c4ed485 commit f476dc1

File tree

4 files changed

+100
-91
lines changed

4 files changed

+100
-91
lines changed

ninja_extra/controllers/base.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import inspect
22
import re
3+
import traceback
34
import uuid
45
from abc import ABC
56
from typing import (
@@ -38,7 +39,6 @@
3839
from ninja_extra.operation import Operation, PathView
3940
from ninja_extra.permissions import AllowAny, BasePermission
4041
from ninja_extra.permissions.base import OperationHolderMixin
41-
from ninja_extra.schemas import ModelControllerSchema
4242
from ninja_extra.shortcuts import (
4343
fail_silently,
4444
get_object_or_exception,
@@ -228,9 +228,9 @@ def create_response(
228228
class ModelControllerBase(ControllerBase):
229229
model: Model = None
230230

231-
model_schema: Type[ModelControllerSchema] = None
232-
create_schema: Type[ModelControllerSchema] = None
233-
update_schema: Type[ModelControllerSchema] = None
231+
model_schema: Type[PydanticModel] = None
232+
create_schema: Type[PydanticModel] = None
233+
update_schema: Type[PydanticModel] = None
234234

235235
pagination_class: Type[PaginationBase] = PageNumberPaginationExtra
236236
pagination_response_schema: Type[PydanticModel] = PaginatedResponseSchema
@@ -239,6 +239,51 @@ class ModelControllerBase(ControllerBase):
239239
def get_queryset(self) -> QuerySet:
240240
return self.model.objects.all()
241241

242+
def perform_create(self, schema: PydanticModel, **kwargs: Any) -> Any:
243+
data = schema.dict(by_alias=True)
244+
data.update(kwargs)
245+
246+
try:
247+
instance = self.model._default_manager.create(**data)
248+
return instance
249+
except TypeError:
250+
tb = traceback.format_exc()
251+
msg = (
252+
"Got a `TypeError` when calling `%s.%s.create()`. "
253+
"This may be because you have a writable field on the "
254+
"serializer class that is not a valid argument to "
255+
"`%s.%s.create()`. You may need to make the field "
256+
"read-only, or override the %s.create() method to handle "
257+
"this correctly.\nOriginal exception was:\n %s"
258+
% (
259+
self.model.__name__,
260+
self.model._default_manager.name,
261+
self.model.__name__,
262+
self.model._default_manager.name,
263+
self.__class__.__name__,
264+
tb,
265+
)
266+
)
267+
raise TypeError(msg)
268+
269+
def perform_update(
270+
self, instance: Model, schema: PydanticModel, **kwargs: Any
271+
) -> Any:
272+
data = schema.dict(exclude_none=True)
273+
data.update(kwargs)
274+
for attr, value in data.items():
275+
setattr(instance, attr, value)
276+
instance.save()
277+
return instance
278+
279+
def perform_patch(
280+
self, instance: Model, schema: PydanticModel, **kwargs: Any
281+
) -> Any:
282+
return self.perform_update(instance=instance, schema=schema, **kwargs)
283+
284+
def perform_delete(self, instance: Model) -> Any:
285+
instance.delete()
286+
242287

243288
class APIController:
244289
_PATH_PARAMETER_COMPONENT_RE = r"{(?:(?P<converter>[^>:]+):)?(?P<parameter>[^>]+)}"

ninja_extra/controllers/model_controller_builder.py

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import typing as t
2-
32
from ninja.orm.fields import TYPES
43
from ninja.params import Body, Path
5-
6-
from ninja_extra.schemas import ModelControllerSchema
7-
84
from .. import status
95
from ..pagination import paginate
106
from .response import Detail
117
from .route import http_delete, http_get, http_patch, http_post, http_put
12-
8+
from pydantic import BaseModel as PydanticModel
139
if t.TYPE_CHECKING:
1410
from .base import APIController, ModelControllerBase
1511

@@ -23,11 +19,11 @@ def __init__(
2319
self._base_cls = controller_base_cls
2420
self._api_controller_instance = api_controller_instance
2521
self._pagination_class = controller_base_cls.pagination_class
26-
self._create_schema: t.Type[ModelControllerSchema] = (
22+
self._create_schema: t.Type[PydanticModel] = (
2723
controller_base_cls.create_schema or controller_base_cls.model_schema
2824
)
2925

30-
self._update_schema: t.Type[ModelControllerSchema] = (
26+
self._update_schema: t.Type[PydanticModel] = (
3127
controller_base_cls.update_schema or controller_base_cls.model_schema
3228
)
3329
self._model_schema = controller_base_cls.model_schema
@@ -52,7 +48,7 @@ def _register_create_endpoint(self) -> None:
5248
def create_item(
5349
self: "ModelControllerBase", data: create_schema = Body(default=...)
5450
):
55-
instance = data.perform_create()
51+
instance = self.perform_create(data)
5652
assert instance, "`perform_create()` must return a value"
5753
return instance
5854

@@ -79,7 +75,7 @@ def update_item(
7975
):
8076
obj = self.get_object_or_exception(self.model, pk=pk)
8177
self.check_object_permissions(obj)
82-
instance = data.perform_update(instance=obj)
78+
instance = self.perform_update(instance=obj, schema=data)
8379
assert instance, "`perform_update()` must return a value"
8480
return instance
8581

@@ -106,7 +102,7 @@ def patch_item(
106102
):
107103
obj = self.get_object_or_exception(self.model, pk=pk)
108104
self.check_object_permissions(obj)
109-
instance = data.perform_patch(instance=obj)
105+
instance = self.perform_patch(instance=obj, schema=data)
110106
assert instance, "`perform_patch()` must return a value"
111107
return instance
112108

@@ -173,7 +169,7 @@ def delete_item(
173169
):
174170
obj = self.get_object_or_exception(self.model, pk=pk)
175171
self.check_object_permissions(obj)
176-
obj.delete()
172+
self.perform_delete(instance=obj)
177173
return self.Detail(message="", status_code=status.HTTP_204_NO_CONTENT)
178174

179175
delete_item.api_controller = self._api_controller_instance
@@ -186,31 +182,3 @@ def register_model_routes(self) -> None:
186182
self._register_patch_endpoint()
187183
self._register_list_items_endpoint()
188184
self._register_update_endpoint()
189-
190-
def validate_model_builder(self):
191-
if self._model_schema:
192-
if not issubclass(self._model_schema, ModelControllerSchema):
193-
raise Exception(
194-
f"{self._model_schema} must be a subclass of `ModelControllerSchema`"
195-
)
196-
assert (
197-
self._model_schema.Config.model
198-
), f"{self._model_schema} must define model attr in Config"
199-
200-
if self._update_schema:
201-
if not issubclass(self._update_schema, ModelControllerSchema):
202-
raise Exception(
203-
f"{self._update_schema} must be a subclass of `ModelControllerSchema`"
204-
)
205-
assert (
206-
self._update_schema.Config.model
207-
), f"{self._update_schema} must define model attr in Config"
208-
209-
if self._create_schema:
210-
if not issubclass(self._create_schema, ModelControllerSchema):
211-
raise Exception(
212-
f"{self._create_schema} must be a subclass of `ModelControllerSchema`"
213-
)
214-
assert (
215-
self._create_schema.Config.model
216-
), f"{self._create_schema} must define model attr in Config"

ninja_extra/schemas/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import typing as t
22

33
from .response import (
4-
ModelControllerSchema,
54
NinjaPaginationResponseSchema,
65
PaginatedResponseSchema,
76
RouteParameter,
@@ -10,8 +9,7 @@
109
__all__ = [
1110
"PaginatedResponseSchema",
1211
"RouteParameter",
13-
"NinjaPaginationResponseSchema",
14-
"ModelControllerSchema"
12+
"NinjaPaginationResponseSchema"
1513
]
1614

1715

ninja_extra/schemas/response.py

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import traceback
2-
from typing import Any, Dict, Generic, List, Optional, TypeVar, Callable, cast
1+
from typing import Any, Dict, Generic, List, Optional, TypeVar
32

4-
from django.db.models import Model
53
from ninja import Schema
64
from ninja.constants import NOT_SET
7-
from pydantic import validator, BaseModel
5+
from pydantic import validator
86
from pydantic.generics import GenericModel
97
from pydantic.networks import AnyHttpUrl
108

@@ -68,47 +66,47 @@ class RouteParameter(Schema):
6866
openapi_extra: Optional[Dict[str, Any]]
6967

7068

71-
class ModelControllerSchema:
72-
dict: Callable
73-
config: BaseModel.Config
74-
75-
def perform_create(self, **kwargs: Any) -> Any:
76-
data = self.dict(by_alias=True)
77-
data.update(kwargs)
78-
model = cast(Model, self.config.model)
79-
try:
80-
instance = model._default_manager.create(**data)
81-
return instance
82-
except TypeError:
83-
tb = traceback.format_exc()
84-
msg = (
85-
"Got a `TypeError` when calling `%s.%s.perform_create()`. "
86-
"This may be because you have a writable field on the "
87-
"serializer class that is not a valid argument to "
88-
"`%s.%s.create()`. You may need to make the field "
89-
"read-only, or override the %s.perform_create() method to handle "
90-
"this correctly.\nOriginal exception was:\n %s"
91-
% (
92-
model.__name__,
93-
model._default_manager.name,
94-
model.__name__,
95-
model._default_manager.name,
96-
self.__class__.__name__,
97-
tb,
98-
)
99-
)
100-
raise TypeError(msg)
101-
102-
def perform_update(self, instance: Model, **kwargs: Any) -> Any:
103-
data = self.dict(exclude_none=True)
104-
data.update(kwargs)
105-
for attr, value in data.items():
106-
setattr(instance, attr, value)
107-
instance.save()
108-
return instance
109-
110-
def perform_patch(self, instance: Model, **kwargs: Any) -> Any:
111-
return self.perform_update(instance=instance, **kwargs)
69+
# class ModelControllerSchema:
70+
# dict: Callable
71+
# config: BaseModel.Config
72+
#
73+
# def perform_create(self, **kwargs: Any) -> Any:
74+
# data = self.dict(by_alias=True)
75+
# data.update(kwargs)
76+
# model = cast(Model, self.config.model)
77+
# try:
78+
# instance = model._default_manager.create(**data)
79+
# return instance
80+
# except TypeError:
81+
# tb = traceback.format_exc()
82+
# msg = (
83+
# "Got a `TypeError` when calling `%s.%s.perform_create()`. "
84+
# "This may be because you have a writable field on the "
85+
# "serializer class that is not a valid argument to "
86+
# "`%s.%s.create()`. You may need to make the field "
87+
# "read-only, or override the %s.perform_create() method to handle "
88+
# "this correctly.\nOriginal exception was:\n %s"
89+
# % (
90+
# model.__name__,
91+
# model._default_manager.name,
92+
# model.__name__,
93+
# model._default_manager.name,
94+
# self.__class__.__name__,
95+
# tb,
96+
# )
97+
# )
98+
# raise TypeError(msg)
99+
#
100+
# def perform_update(self, instance: Model, **kwargs: Any) -> Any:
101+
# data = self.dict(exclude_none=True)
102+
# data.update(kwargs)
103+
# for attr, value in data.items():
104+
# setattr(instance, attr, value)
105+
# instance.save()
106+
# return instance
107+
#
108+
# def perform_patch(self, instance: Model, **kwargs: Any) -> Any:
109+
# return self.perform_update(instance=instance, **kwargs)
112110

113111

114112
def __getattr__(name: str) -> Any: # pragma: no cover

0 commit comments

Comments
 (0)