Skip to content

Commit f9550c8

Browse files
committed
lint: django orm model
1 parent 8cf17fd commit f9550c8

File tree

7 files changed

+61
-27
lines changed

7 files changed

+61
-27
lines changed
File renamed without changes.

easy/controller/meta.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import logging
33
import re
44
import uuid
5-
from abc import ABCMeta
5+
from abc import ABC, ABCMeta
66
from collections import ChainMap
77
from typing import Any, Match, Optional, Tuple, Type
88

@@ -20,7 +20,7 @@
2020
logger = logging.getLogger(__name__)
2121

2222

23-
class CrudAPI(CrudModel):
23+
class CrudAPI(CrudModel, ABC):
2424
# Never add type note to service, it will cause injection error
2525
def __init__(self, service=None): # type: ignore
2626
# Critical to set __Meta

easy/domain/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from easy.domain.orm import BaseOrm
1+
from easy.domain.orm import DjangoOrmModel
22

33

4-
class BaseDomain(BaseOrm):
4+
class BaseDomain(DjangoOrmModel):
55
pass

easy/domain/orm.py

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
2-
from typing import Any, Dict, List, Tuple, Type
2+
from abc import abstractmethod
3+
from typing import Any, Dict, List, Optional, Tuple, Type
34

45
from django.db import models, transaction
56
from django.db.models.query import QuerySet
@@ -11,13 +12,47 @@
1112

1213

1314
class CrudModel(object):
15+
def __init__(self, model: Any):
16+
self.model = model
17+
18+
@abstractmethod
19+
def crud_add_obj(self, **payload: Dict) -> Any:
20+
raise NotImplementedError
21+
22+
@abstractmethod
23+
def crud_del_obj(self, pk: int) -> bool:
24+
raise NotImplementedError
25+
26+
@abstractmethod
27+
def crud_update_obj(self, pk: int, payload: Dict) -> bool:
28+
raise NotImplementedError
29+
30+
@abstractmethod
31+
def crud_get_obj(self, pk: int) -> Any:
32+
raise NotImplementedError
33+
34+
@abstractmethod
35+
def crud_get_objs_all(self, maximum: Optional[int] = None, **filters: Any) -> Any:
36+
raise NotImplementedError
37+
38+
@abstractmethod
39+
def crud_filter(self, **kwargs: Any) -> QuerySet:
40+
raise NotImplementedError
41+
42+
@abstractmethod
43+
def crud_filter_exclude(self, **kwargs: Any) -> QuerySet:
44+
raise NotImplementedError
45+
46+
47+
class DjangoOrmModel(CrudModel):
1448
def __init__(self, model: Type[models.Model]):
1549
self.model = model
1650
self.m2m_fields_list: List = list(
1751
_field
1852
for _field in self.model._meta.get_fields(include_hidden=True)
1953
if isinstance(_field, models.ManyToManyField)
2054
)
55+
super().__init__(model)
2156

2257
def _separate_payload(self, payload: Dict) -> Tuple[Dict, Dict]:
2358
m2m_fields = {}
@@ -45,7 +80,7 @@ def _crud_set_m2m_obj(obj: models.Model, m2m_fields: Dict) -> None:
4580

4681
# Define BASE CRUD
4782
@transaction.atomic()
48-
def _crud_add_obj(self, **payload: Dict) -> Any:
83+
def crud_add_obj(self, **payload: Dict) -> Any:
4984
local_f_payload, m2m_f_payload = self._separate_payload(payload)
5085

5186
try:
@@ -58,7 +93,7 @@ def _crud_add_obj(self, **payload: Dict) -> Any:
5893
if obj:
5994
return obj.id
6095

61-
def _crud_del_obj(self, pk: int) -> bool:
96+
def crud_del_obj(self, pk: int) -> bool:
6297
obj = get_object_or_none(self.model, pk=pk)
6398
if obj:
6499
self.model.objects.filter(pk=pk).delete()
@@ -67,7 +102,7 @@ def _crud_del_obj(self, pk: int) -> bool:
67102
return False
68103

69104
@transaction.atomic()
70-
def _crud_update_obj(self, pk: int, payload: Dict) -> bool:
105+
def crud_update_obj(self, pk: int, payload: Dict) -> bool:
71106
local_fields, m2m_fields = self._separate_payload(payload)
72107
if not self.model.objects.filter(pk=pk).exists():
73108
return False
@@ -78,7 +113,7 @@ def _crud_update_obj(self, pk: int, payload: Dict) -> bool:
78113
raise BaseAPIException(f"Update Error - {e}")
79114
return bool(obj)
80115

81-
def _crud_get_obj(self, pk: int) -> Any:
116+
def crud_get_obj(self, pk: int) -> Any:
82117
if self.m2m_fields_list:
83118
qs = self.model.objects.filter(pk=pk).prefetch_related(
84119
self.m2m_fields_list[0].name
@@ -90,10 +125,11 @@ def _crud_get_obj(self, pk: int) -> Any:
90125
if qs:
91126
return qs.first()
92127

93-
def _crud_get_objs_all(self, **filters: Any) -> Any:
128+
def crud_get_objs_all(self, maximum: Optional[int] = None, **filters: Any) -> Any:
94129
"""
95130
CRUD: get multiple objects, with django orm filters support
96131
Args:
132+
maximum: {int}
97133
filters: {"field_name__lte", 1}
98134
Returns: qs
99135
@@ -104,6 +140,8 @@ def _crud_get_objs_all(self, **filters: Any) -> Any:
104140
qs = self.model.objects.filter(**filters)
105141
except Exception as e: # pragma: no cover
106142
logger.error(e)
143+
elif maximum:
144+
qs = self.model.objects.all()[:maximum]
107145
else:
108146
qs = self.model.objects.all()
109147
# If there are 2m2_fields
@@ -113,12 +151,8 @@ def _crud_get_objs_all(self, **filters: Any) -> Any:
113151
qs = qs.prefetch_related(f.name)
114152
return qs
115153

116-
def _crud_filter(self, **kwargs: Any) -> QuerySet:
154+
def crud_filter(self, **kwargs: Any) -> Any:
117155
return self.model.objects.filter(**kwargs) # pragma: no cover
118156

119-
def _crud_filter_exclude(self, **kwargs: Any) -> QuerySet:
157+
def crud_filter_exclude(self, **kwargs: Any) -> Any:
120158
return self.model.objects.all().exclude(**kwargs)
121-
122-
123-
class BaseOrm(CrudModel):
124-
...

easy/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from ninja.types import TCallable
1212
from ninja_extra import NinjaExtraAPI
1313

14-
from easy.controller.admin_auto_api import create_admin_controller
14+
from easy.controller.auto_api import create_admin_controller
1515
from easy.domain.serializers import django_serializer
1616
from easy.renderer.json import EasyJSONRenderer
1717
from easy.response import BaseApiResponse

easy/services/crud.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,36 @@
44
from asgiref.sync import sync_to_async
55
from django.db import models
66

7-
from easy.domain.orm import CrudModel
7+
from easy.domain.orm import DjangoOrmModel
88

99
logger = logging.getLogger(__name__)
1010

1111

12-
class CrudService(CrudModel):
12+
class CrudService(DjangoOrmModel):
1313
def __init__(self, model: Type[models.Model]):
1414
super().__init__(model)
1515
self.model = model
1616

1717
async def get_obj(self, id: int) -> Any:
18-
return await sync_to_async(self._crud_get_obj)(id)
18+
return await sync_to_async(self.crud_get_obj)(id)
1919

2020
async def get_objs(self, **filters: Any) -> Any:
21-
return await sync_to_async(self._crud_get_objs_all)(**filters)
21+
return await sync_to_async(self.crud_get_objs_all)(**filters)
2222

2323
async def patch_obj(self, id: int, payload: Any) -> Any:
24-
return await sync_to_async(self._crud_update_obj)(id, payload)
24+
return await sync_to_async(self.crud_update_obj)(id, payload)
2525

2626
async def del_obj(self, id: int) -> Any:
27-
return await sync_to_async(self._crud_del_obj)(id)
27+
return await sync_to_async(self.crud_del_obj)(id)
2828

2929
async def add_obj(self, **payload: Any) -> Any:
30-
return await sync_to_async(self._crud_add_obj)(**payload)
30+
return await sync_to_async(self.crud_add_obj)(**payload)
3131

3232
async def filter_objs(self, **payload: Any) -> Any:
33-
return await sync_to_async(self._crud_filter)(**payload) # pragma: no cover
33+
return await sync_to_async(self.crud_filter)(**payload) # pragma: no cover
3434

3535
async def filter_exclude_objs(self, **payload: Any) -> Any:
36-
return await sync_to_async(self._crud_filter_exclude)(**payload)
36+
return await sync_to_async(self.crud_filter_exclude)(**payload)
3737

3838
# async def bulk_create_objs(self):
3939
# ...

tests/easy_app/controllers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ async def get_objs_list_with_filter_exclude(self, request):
132132
"/qs/",
133133
)
134134
async def list_events(self):
135-
qs = await sync_to_async(self.model.objects.all)()
135+
qs = await sync_to_async(self.service.crud_get_objs_all)(maximum=10)
136136
await sync_to_async(list)(qs)
137137
if qs:
138138
return qs

0 commit comments

Comments
 (0)