Skip to content

Commit 2118b22

Browse files
committed
update unit test for new version
1 parent 3af7bab commit 2118b22

17 files changed

Lines changed: 630 additions & 513 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ tests/htmlcov
44
/poetry.lock
55
/pyproject.toml
66
*.pyc
7+
workspace.xml

src/fastapi_quickcrud/crud_router.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def crud_router_builder(
4040
dependencies: Optional[List[callable]] = None,
4141
crud_models: Optional[CRUDModel] = None,
4242
async_mode: Optional[bool] = None,
43+
foreign_include: Optional[any] = None,
4344
sql_type: Optional[SqlType] = None,
4445
**router_kwargs: Any) -> APIRouter:
4546
"""
@@ -146,7 +147,11 @@ async def async_runner(f):
146147
sql_type=sql_type,
147148
exclude_primary_key=NO_PRIMARY_KEY)
148149

149-
crud_service = query_service(model=db_model, async_mode=async_mode)
150+
foreign_table_mapping = {db_model.__tablename__: db_model}
151+
if foreign_include:
152+
for i in foreign_include:
153+
foreign_table_mapping[i.__tablename__] = i
154+
crud_service = query_service(model=db_model, async_mode=async_mode, foreign_table_mapping=foreign_table_mapping)
150155
# else:
151156
# crud_service = SQLAlchemyPostgreQueryService(model=db_model, async_mode=async_mode)
152157

src/fastapi_quickcrud/misc/abstract_query.py

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88

99
from .exceptions import UnknownOrderType, UnknownColumn, UpdateColumnEmptyException
1010
from .type import Ordering
11-
from .utils import clean_input_fields
11+
from .utils import clean_input_fields, path_query_builder
1212
from .utils import find_query_builder
1313

1414

1515
class SQLAlchemyGeneralSQLQueryService(ABC):
1616

17-
def __init__(self, *, model, async_mode):
17+
def __init__(self, *, model, async_mode, foreign_table_mapping):
1818

1919
"""
2020
:param model: declarative_base model
@@ -24,24 +24,32 @@ def __init__(self, *, model, async_mode):
2424
self.model = model
2525
self.model_columns = model
2626
self.async_mode = async_mode
27+
self.foreign_table_mapping = foreign_table_mapping
2728

2829
def get_many(self, *,
2930
join_mode,
3031
query,
32+
target_model=None,
33+
abstract_param=None
3134
) -> BinaryExpression:
3235
filter_args = query
3336
limit = filter_args.pop('limit', None)
3437
offset = filter_args.pop('offset', None)
3538
order_by_columns = filter_args.pop('order_by_columns', None)
39+
model = self.model
40+
if target_model:
41+
model = self.foreign_table_mapping[target_model]
3642
filter_list: List[BinaryExpression] = find_query_builder(param=filter_args,
37-
model=self.model_columns)
43+
model=model)
44+
path_filter_list: List[BinaryExpression] = path_query_builder(params=abstract_param,
45+
model=self.foreign_table_mapping)
3846
join_table_instance_list: list = self.get_join_select_fields(join_mode)
3947

40-
model = self.model
48+
4149
if not isinstance(self.model, Table):
4250
model = model.__table__
4351

44-
stmt = select(*[model] + join_table_instance_list).filter(and_(*filter_list))
52+
stmt = select(*[model] + join_table_instance_list).filter(and_(*filter_list+path_filter_list))
4553
if order_by_columns:
4654
order_by_query_list = []
4755

@@ -79,7 +87,6 @@ def get_one(self, *,
7987
model = self.model
8088
if not isinstance(self.model, Table):
8189
model = model.__table__
82-
a = model.c._all_columns
8390
stmt = select(*[model] + join_table_instance_list).where(and_(*filter_list + extra_query_expression))
8491
# stmt = session.query(*[model] + join_table_instance_list).filter(and_(*filter_list + extra_query_expression))
8592
stmt = self.get_join_by_excpression(stmt, join_mode=join_mode)
@@ -130,9 +137,9 @@ def get_join_select_fields(self, join_mode=None):
130137
if 'exclude' in local_reference and local_reference['exclude']:
131138
continue
132139
for column in local_reference['reference_table_columns']:
133-
foreign_name = local_reference['local']['local_column']
140+
foreign_table_name = local_reference['reference']['reference_table']
134141
join_table_instance_list.append(
135-
column.label(foreign_name + '_foreign_____' + str(column).split('.')[1]))
142+
column.label(foreign_table_name + '_foreign_____' + str(column).split('.')[1]))
136143
return join_table_instance_list
137144

138145
def get_join_by_excpression(self, stmt: BinaryExpression, join_mode=None) -> BinaryExpression:
@@ -202,15 +209,16 @@ def model_query(self,
202209

203210
class SQLAlchemyPGSQLQueryService(SQLAlchemyGeneralSQLQueryService):
204211

205-
def __init__(self, *, model, async_mode):
212+
def __init__(self, *, model, async_mode, foreign_table_mapping):
206213

207214
"""
208215
:param model: declarative_base model
209216
:param async_mode: bool
210217
"""
211218
super(SQLAlchemyPGSQLQueryService,
212219
self).__init__(model=model,
213-
async_mode=async_mode)
220+
async_mode=async_mode,
221+
foreign_table_mapping=foreign_table_mapping)
214222
self.model = model
215223
self.model_columns = model
216224
self.async_mode = async_mode
@@ -255,13 +263,14 @@ def upsert(self, *,
255263

256264
class SQLAlchemySQLITEQueryService(SQLAlchemyGeneralSQLQueryService):
257265

258-
def __init__(self, *, model, async_mode):
266+
def __init__(self, *, model, async_mode, foreign_table_mapping):
259267
"""
260268
:param model: declarative_base model
261269
:param async_mode: bool
262270
"""
263271
super().__init__(model=model,
264-
async_mode=async_mode)
272+
async_mode=async_mode,
273+
foreign_table_mapping=foreign_table_mapping)
265274
self.model = model
266275
self.model_columns = model
267276
self.async_mode = async_mode
@@ -276,13 +285,14 @@ def upsert(self, *,
276285

277286
class SQLAlchemyMySQLQueryService(SQLAlchemyGeneralSQLQueryService):
278287

279-
def __init__(self, *, model, async_mode):
288+
def __init__(self, *, model, async_mode, foreign_table_mapping):
280289
"""
281290
:param model: declarative_base model
282291
:param async_mode: bool
283292
"""
284293
super().__init__(model=model,
285-
async_mode=async_mode)
294+
async_mode=async_mode,
295+
foreign_table_mapping=foreign_table_mapping)
286296
self.model = model
287297
self.model_columns = model
288298
self.async_mode = async_mode
@@ -297,13 +307,14 @@ def upsert(self, *,
297307

298308
class SQLAlchemyMariaDBQueryService(SQLAlchemyGeneralSQLQueryService):
299309

300-
def __init__(self, *, model, async_mode):
310+
def __init__(self, *, model, async_mode, foreign_table_mapping):
301311
"""
302312
:param model: declarative_base model
303313
:param async_mode: bool
304314
"""
305315
super().__init__(model=model,
306-
async_mode=async_mode)
316+
async_mode=async_mode,
317+
foreign_table_mapping=foreign_table_mapping)
307318
self.model = model
308319
self.model_columns = model
309320
self.async_mode = async_mode
@@ -318,13 +329,14 @@ def upsert(self, *,
318329

319330
class SQLAlchemyOracleQueryService(SQLAlchemyGeneralSQLQueryService):
320331

321-
def __init__(self, *, model, async_mode):
332+
def __init__(self, *, model, async_mode, foreign_table_mapping):
322333
"""
323334
:param model: declarative_base model
324335
:param async_mode: bool
325336
"""
326337
super().__init__(model=model,
327-
async_mode=async_mode)
338+
async_mode=async_mode,
339+
foreign_table_mapping=foreign_table_mapping)
328340
self.model = model
329341
self.model_columns = model
330342
self.async_mode = async_mode
@@ -339,13 +351,14 @@ def upsert(self, *,
339351

340352
class SQLAlchemyMSSqlQueryService(SQLAlchemyGeneralSQLQueryService):
341353

342-
def __init__(self, *, model, async_mode):
354+
def __init__(self, *, model, async_mode, foreign_table_mapping):
343355
"""
344356
:param model: declarative_base model
345357
:param async_mode: bool
346358
"""
347359
super().__init__(model=model,
348-
async_mode=async_mode)
360+
async_mode=async_mode,
361+
foreign_table_mapping=foreign_table_mapping)
349362
self.model = model
350363
self.model_columns = model
351364
self.async_mode = async_mode
@@ -360,13 +373,14 @@ def upsert(self, *,
360373

361374
class SQLAlchemyNotSupportQueryService(SQLAlchemyGeneralSQLQueryService):
362375

363-
def __init__(self, *, model, async_mode):
376+
def __init__(self, *, model, async_mode, foreign_table_mapping):
364377
"""
365378
:param model: declarative_base model
366379
:param async_mode: bool
367380
"""
368381
super().__init__(model=model,
369-
async_mode=async_mode)
382+
async_mode=async_mode,
383+
foreign_table_mapping=foreign_table_mapping)
370384
self.model = model
371385
self.model_columns = model
372386
self.async_mode = async_mode

0 commit comments

Comments
 (0)