Skip to content

Commit 2847610

Browse files
committed
feat: SqlAlchemyProxy.getQueryFilter improvements and FlaskManager.validateArgs bug fixed
1 parent b0198f7 commit 2847610

3 files changed

Lines changed: 68 additions & 17 deletions

File tree

‎python_framework/api/src/service/SqlAlchemyProxy.py‎

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import os, time
22

33
from python_helper import Constant as c
4-
from python_helper import SettingHelper, EnvironmentHelper, ObjectHelper, StringHelper, log, Method, Function
4+
from python_helper import SettingHelper, EnvironmentHelper, ObjectHelper, StringHelper, log, Method, Function, ReflectionHelper
55

66
import sqlalchemy
77
from sqlalchemy import create_engine, exists, select
@@ -210,6 +210,31 @@ def isNeitherNoneNorBlank(thing):
210210
def isNoneOrBlank(thing):
211211
return ObjectHelper.isNone(thing) or StringHelper.isBlank(str(thing))
212212

213+
def getUnitCondition(query: dict, modelClass):
214+
return {
215+
k: v
216+
for k, v in query.items()
217+
if (not k.endswith(LIST)) and ObjectHelper.isNotEmpty(v)
218+
}
219+
220+
def getCollectionCondition(query: dict, modelClass, additionalCondition=None):
221+
condition = True
222+
for key in [
223+
k
224+
for k, v in query.items()
225+
if k.endswith(LIST) and ObjectHelper.isNotEmpty(v)
226+
]:
227+
condition = and_(
228+
condition,
229+
ReflectionHelper.getAttributeOrMethod(modelClass, k.replace(LIST, c.BLANK)).in_(v)
230+
)
231+
if ObjectHelper.isNotNone(additionalCondition):
232+
condition = and_(
233+
additionalCondition,
234+
condition
235+
)
236+
return condition
237+
213238

214239
class SqlAlchemyProxy:
215240

@@ -420,6 +445,18 @@ def reloadContextFromBackup(self):
420445
if instance not in self.session.dirty:
421446
self.session.dirty.add(instance)
422447

448+
@Method
449+
def getQueryFilter(self, query, modelClass, additionalCondition=None):
450+
return self.session.query(modelClass).filter(
451+
getCollectionCondition(
452+
query,
453+
modelClass,
454+
additionalCondition = additionalCondition
455+
)
456+
).filter_by(
457+
**getUnitCondition(query, modelClass)
458+
)
459+
423460
@Method
424461
def save(self, instance):
425462
self.load(instance)
@@ -533,15 +570,28 @@ def findAllByStatusInAndCommit(self, statusList, modelClass):
533570
return self.load(instanceList)
534571

535572
@Method
536-
def existsByQueryAndCommit(self, query, modelClass):
537-
exists = self.session.query(literal(True)).filter(self.session.query(modelClass).filter_by(**query).exists()).scalar()
573+
def existsByQueryAndCommit(self, query, modelClass, additionalCondition=None):
574+
exists = self.session.query(
575+
literal(True)
576+
).filter(
577+
self.getQueryFilter(
578+
query,
579+
modelClass,
580+
additionalCondition = additionalCondition
581+
).exists()
582+
).scalar()
538583
self.session.commit()
539584
return exists
540585

541586
@Method
542-
def findAllByQueryAndCommit(self, query, modelClass):
587+
def findAllByQueryAndCommit(self, query, modelClass, additionalCondition=None):
588+
instanceList = []
543589
if ObjectHelper.isNotNone(query):
544-
instanceList = self.session.query(modelClass).filter_by(**{k: v for k, v in query.items() if ObjectHelper.isNotNone(v)}).all()
590+
instanceList = self.getQueryFilter(
591+
query,
592+
modelClass,
593+
additionalCondition = additionalCondition
594+
).all()
545595
self.session.commit()
546596
return self.load(instanceList)
547597

‎python_framework/api/src/service/flask/FlaskManager.py‎

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -654,18 +654,19 @@ def bindResource(apiInstance,resourceInstance):
654654
@Function
655655
def validateArgs(args, requestClass, resourceInstanceMethod):
656656
if ObjectHelper.isNotNone(requestClass):
657-
if Serializer.isSerializerList(requestClass) and 0 < len(requestClass):
658-
resourceInstance = args[0]
659-
for index in range(len(requestClass)):
660-
objectRequest = args[index + 1]
661-
expecteObjectClass = requestClass[index]
662-
ExceptionHandler.validateArgs(resourceInstance, resourceInstanceMethod, objectRequest, expecteObjectClass)
663-
if Serializer.isSerializerList(args[index + 1]) and len(args[index + 1]) > 0:
664-
expecteObjectClass = requestClass[index][0]
665-
for objectRequest in args[index + 1]:
666-
ExceptionHandler.validateArgs(resourceInstance, resourceInstanceMethod, objectRequest, expecteObjectClass)
657+
if Serializer.isSerializerList(requestClass):
658+
if 0 < len(requestClass):
659+
resourceInstance = args[0]
660+
for index in range(len(requestClass)):
661+
objectRequest = args[index + 1]
662+
expecteObjectClass = requestClass[index]
663+
ExceptionHandler.validateArgs(resourceInstance, resourceInstanceMethod, objectRequest, expecteObjectClass)
664+
if Serializer.isSerializerList(args[index + 1]) and len(args[index + 1]) > 0:
665+
expecteObjectClass = requestClass[index][0]
666+
for objectRequest in args[index + 1]:
667+
ExceptionHandler.validateArgs(resourceInstance, resourceInstanceMethod, objectRequest, expecteObjectClass)
667668
else:
668-
validateArgs(args, requestClass, resourceInstanceMethod)
669+
validateArgs(args, [requestClass], resourceInstanceMethod)
669670

670671
def validateKwargs(kwargs, resourceInstance, resourceInstanceMethod, requestHeaderClass, requestParamClass):
671672
classListToValidate = []

‎setup.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
sudo ln -s /usr/local/bin/pipX.Y /usr/bin/pip
1616
''')
1717

18-
VERSION = '0.4.31'
18+
VERSION = '0.4.32'
1919

2020
NAME = 'python_framework'
2121
PACKAGE_NAME = NAME

0 commit comments

Comments
 (0)