Skip to content

Commit 7b80575

Browse files
committed
fix: SqlAlchemy trachy event handlers...
1 parent 653c293 commit 7b80575

5 files changed

Lines changed: 67 additions & 28 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def __init__(self,
6868
):
6969
self.timeStamp = DateTimeHelper.now()
7070
self.status = HttpStatus.map(DEFAULT_STATUS if ObjectHelper.isNone(status) else status).enumValue
71-
self.message = message if ObjectHelper.isNotEmpty(message) and StringHelper.isNotBlank(message) else DEFAULT_MESSAGE if 500 <= self.status else StringHelper.toParagraphCase(self.status.enumName)
71+
self.message = message if ObjectHelper.isNotEmpty(message) and StringHelper.isNotBlank(message) else DEFAULT_MESSAGE if 500 <= self.status else StringHelper.toText(self.status.enumName)
7272
self.verb = verb if ObjectHelper.isNotNone(verb) else self.getRequestVerb()
7373
self.url = url if ObjectHelper.isNotNone(url) else self.getRequestUrl()
7474
self.logMessage = DEFAULT_LOG_MESSAGE if ObjectHelper.isNone(logMessage) or StringHelper.isBlank(logMessage) else logMessage

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

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -120,27 +120,33 @@ class PythonFramworkBaseClass(getNewOriginalModel()):
120120
__abstract__ = True
121121
def __onChange__(self, *args, eventType=OnORMChangeEventType.UNKNOWN, **kwargs):
122122
return self
123+
def __safelyOnChange__(self, *args, eventType=OnORMChangeEventType.UNKNOWN, **kwargs):
124+
try:
125+
self.__onChange__(*args, eventType=eventType, **kwargs)
126+
except Exception exception:
127+
log.warning(self, 'Not possible to handle __onChange__ properly', exception=exception)
128+
return self
123129
def __onInit__(self, args, kwargs):
124-
self.__onChange__(args, kwargs, eventType=OnORMChangeEventType.INIT)
130+
self.__safelyOnChange__(args, kwargs, eventType=OnORMChangeEventType.INIT)
125131
def __onAttach__(self, session):
126-
self.__onChange__(session, eventType=OnORMChangeEventType.ATTACH)
132+
self.__safelyOnChange__(session, eventType=OnORMChangeEventType.ATTACH)
127133
def __onLoad__(self, context):
128-
self.__onChange__(context, eventType=OnORMChangeEventType.LOAD)
134+
self.__safelyOnChange__(context, eventType=OnORMChangeEventType.LOAD)
129135
def __onRefresh__(self, context, attributes):
130-
self.__onChange__(context, attributes, eventType=OnORMChangeEventType.REFRESH)
136+
self.__safelyOnChange__(context, attributes, eventType=OnORMChangeEventType.REFRESH)
131137
def __onExpire__(self, attrs):
132-
self.__onChange__(attrs, eventType=OnORMChangeEventType.EXPIRE)
138+
self.__safelyOnChange__(attrs, eventType=OnORMChangeEventType.EXPIRE)
133139
def __onDeteachedToPersistent__(self, session):
134-
self.__onChange__(session, eventType=OnORMChangeEventType.DETEACHED_TO_PERSISTENT)
140+
self.__safelyOnChange__(session, eventType=OnORMChangeEventType.DETEACHED_TO_PERSISTENT)
135141
def __onTransientToPending__(self, session):
136-
self.__onChange__(session, eventType=OnORMChangeEventType.TRANSIENT_TO_PENDING)
142+
self.__safelyOnChange__(session, eventType=OnORMChangeEventType.TRANSIENT_TO_PENDING)
137143
def __onPendingToTransient__(self, session):
138-
self.__onChange__(session, eventType=OnORMChangeEventType.PENDING_TO_TRANSIENT)
144+
self.__safelyOnChange__(session, eventType=OnORMChangeEventType.PENDING_TO_TRANSIENT)
139145
def __onPersistentToTransient__(self, session):
140-
self.__onChange__(session, eventType=OnORMChangeEventType.PERSISTENT_TO_TRANSIENT)
146+
self.__safelyOnChange__(session, eventType=OnORMChangeEventType.PERSISTENT_TO_TRANSIENT)
141147

142148
def setDefaultValues(self, *args, eventType=OnORMChangeEventType.SELF, **kwargs):
143-
return self.__onChange__(*args, eventType=eventType, **kwargs)
149+
return self.__safelyOnChange__(*args, eventType=eventType, **kwargs)
144150
def loadDefaultValues(self, *args, eventType=OnORMChangeEventType.SELF, **kwargs):
145151
return self.setDefaultValues(*args, eventType=eventType, **kwargs)
146152
def reload(self, *args, eventType=OnORMChangeEventType.SELF, **kwargs):
@@ -204,9 +210,11 @@ def getOneToOneChild(child, parent, refferenceModel):
204210
parentAttribute = relationship(parent, back_populates=attributeIt(child))
205211
return parentAttribute, parentId
206212

213+
###- deprecated
207214
def isNeitherNoneNorBlank(thing):
208-
return ObjectHelper.isNotNone(thing) and StringHelper.isNotBlank(str(thing))
215+
return ObjectHelper.isNeitherNoneNorBlank(thing)
209216

217+
###- deprecated
210218
def isNoneOrBlank(thing):
211219
return ObjectHelper.isNone(thing) or StringHelper.isBlank(str(thing))
212220

@@ -325,7 +333,7 @@ def close(self):
325333
def getUrl(self, dialect):
326334
log.log(self.getUrl, 'Loading repository configuration')
327335
url = EnvironmentHelper.get(self.ENV_DATABASE_URL)
328-
if isNeitherNoneNorBlank(url):
336+
if ObjectHelper.isNeitherNoneNorBlank(url):
329337
dialect = None
330338
driver = None
331339
database = None
@@ -337,7 +345,7 @@ def getUrl(self, dialect):
337345
log.log(self.getUrl, f'Prioritising repository url in {self.ENV_DATABASE_URL} environment variable')
338346
else :
339347
url = self.globals.getSetting(f'{self.KW_API}{c.DOT}{self.KW_DATABASE}{c.DOT}{self.KW_REPOSITORY_URL}')
340-
if isNeitherNoneNorBlank(url):
348+
if ObjectHelper.isNeitherNoneNorBlank(url):
341349
dialect = None
342350
driver = None
343351
database = None
@@ -356,15 +364,15 @@ def getUrl(self, dialect):
356364
host = self.globals.getSetting(f'{self.KW_API}{c.DOT}{self.KW_DATABASE}{c.DOT}{self.KW_REPOSITORY_HOST}')
357365
port = self.globals.getSetting(f'{self.KW_API}{c.DOT}{self.KW_DATABASE}{c.DOT}{self.KW_REPOSITORY_PORT}')
358366
schema = self.globals.getSetting(f'{self.KW_API}{c.DOT}{self.KW_DATABASE}{c.DOT}{self.KW_REPOSITORY_SCHEMA}')
359-
if isNeitherNoneNorBlank(username) and isNeitherNoneNorBlank(password):
367+
if ObjectHelper.isNeitherNoneNorBlank(username) and ObjectHelper.isNeitherNoneNorBlank(password):
360368
url += f'{username}{c.COLON}{password}'
361-
if isNeitherNoneNorBlank(host) and isNeitherNoneNorBlank(port):
369+
if ObjectHelper.isNeitherNoneNorBlank(host) and ObjectHelper.isNeitherNoneNorBlank(port):
362370
url += f'{c.ARROBA}{host}{c.COLON}{port}'
363371
url += c.SLASH
364-
database = f'{database}' if isNeitherNoneNorBlank(database) else f'{self.DEFAULT_LOCAL_STORAGE_NAME if ObjectHelper.isNone(self.globals.apiName) else self.globals.apiName}{c.DOT}{self.EXTENSION}'
365-
if not isNeitherNoneNorBlank(dialect):
372+
database = f'{database}' if ObjectHelper.isNeitherNoneNorBlank(database) else f'{self.DEFAULT_LOCAL_STORAGE_NAME if ObjectHelper.isNone(self.globals.apiName) else self.globals.apiName}{c.DOT}{self.EXTENSION}'
373+
if not ObjectHelper.isNeitherNoneNorBlank(dialect):
366374
dialect = self.DEFAULT_DIALECT
367-
plusDriverOrNothing = f'{c.PLUS}{driver}' if isNeitherNoneNorBlank(driver) else c.NOTHING
375+
plusDriverOrNothing = f'{c.PLUS}{driver}' if ObjectHelper.isNeitherNoneNorBlank(driver) else c.NOTHING
368376
dialectAndDriver = f'''{dialect}{plusDriverOrNothing}'''
369377
url = f'{dialectAndDriver}{c.COLON}{c.DOUBLE_SLASH}{url}{database}'
370378
log.log(self.getUrl, 'Prioritising repository yamel configuration')
@@ -438,12 +446,16 @@ def backupContext(self):
438446
@Method
439447
def reloadContextFromBackup(self):
440448
for index, instance in enumerate(self.getContext()):
441-
self.context.pop(index)
449+
self.context.pop(self.context.index(instance))
442450
if instance not in self.session.dirty:
443451
self.session.dirty.add(instance)
444452

445453
@Method
446-
def getQueryFilter(self, query, modelClass, additionalCondition=None):
454+
def getQueryFilter(self, query, modelClass, joinList=None, additionalCondition=None):
455+
sessionQuery = self.session.query(modelClass)
456+
if ObjectHelper.isNotEmpty(joinList):
457+
for join in joinList:
458+
sessionQuery.join(join)
447459
return self.session.query(modelClass).filter(
448460
getCollectionCondition(
449461
query,
@@ -567,26 +579,28 @@ def findAllByStatusInAndCommit(self, statusList, modelClass):
567579
return self.load(instanceList)
568580

569581
@Method
570-
def existsByQueryAndCommit(self, query, modelClass, additionalCondition=None):
582+
def existsByQueryAndCommit(self, query, modelClass, joinList=None, additionalCondition=None):
571583
exists = self.session.query(
572584
literal(True)
573585
).filter(
574586
self.getQueryFilter(
575587
query,
576588
modelClass,
589+
joinList = joinList,
577590
additionalCondition = additionalCondition
578591
).exists()
579592
).scalar()
580593
self.session.commit()
581594
return exists
582595

583596
@Method
584-
def findAllByQueryAndCommit(self, query, modelClass, additionalCondition=None):
597+
def findAllByQueryAndCommit(self, query, modelClass, joinList=None, additionalCondition=None):
585598
instanceList = []
586599
if ObjectHelper.isNotNone(query):
587600
instanceList = self.getQueryFilter(
588601
query,
589602
modelClass,
603+
joinList = joinList,
590604
additionalCondition = additionalCondition
591605
).all()
592606
self.session.commit()

‎python_framework/api/src/util/Serializer.py‎

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,12 @@
3737

3838
KW_CREATE_ACTION = 'Create'
3939
KW_UPDATE_ACTION = 'Update'
40-
KW_QUERY_ACTION = 'Query'
4140
KW_DELETE_ACTION = 'Delete'
41+
KW_QUERY_ACTION = 'Query'
42+
KW_PARAM_ACTION = 'Param'
43+
KW_HEADER_ACTION = 'Header'
44+
KW_ALL_ACTION = 'All'
45+
4246

4347
MESO_SUFIX_LIST = [
4448
KW_REQUEST,
@@ -51,8 +55,18 @@
5155

5256
KW_CREATE_ACTION,
5357
KW_UPDATE_ACTION,
58+
KW_DELETE_ACTION,
5459
KW_QUERY_ACTION,
55-
KW_DELETE_ACTION
60+
KW_PARAM_ACTION,
61+
KW_HEADER_ACTION,
62+
KW_ALL_ACTION
63+
]
64+
65+
RESERVED_TERM_LIST = [
66+
MODEL_SUFIX,
67+
DTO_SUFIX,
68+
LIST_SUFIX,
69+
*MESO_SUFIX_LIST
5670
]
5771

5872
DATE_TIME_RELATED = [
@@ -264,6 +278,13 @@ def convertFromJsonToDictionary(string):
264278

265279
@Function
266280
def convertFromJsonToObject(fromJson, toClass, fatherClass=None, muteLogs=False):
281+
# if isinstance(fromJson, str):
282+
# return convertFromJsonToObject(
283+
# convertFromJsonToDictionary(fromJson),
284+
# toClass,
285+
# fatherClass=fatherClass,
286+
# muteLogs=muteLogs
287+
# )
267288
if ObjectHelper.isNone(fromJson) or ObjectHelper.isNone(toClass):
268289
return fromJson
269290
# validateToClassIsNotNone(fromJson, toClass)
@@ -472,3 +493,6 @@ def importResource(resourceName, resourceModuleName=None):
472493
# resourceClass = globals.importResource(resourceName)
473494
# return resourceClass
474495
return globals.importResource(resourceName, resourceModuleName=resourceModuleName)
496+
497+
498+
#######################################################

‎python_framework/api/test/api/src/util/SerializerTest.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class Child(MODEL) :
7373
id = sap.Column(sap.Integer(), sap.Sequence(f'{__tablename__}{sap.ID}{sap.SEQ}'), primary_key=True)
7474
father, fatherId = sap.getManyToOne(__tablename__, SELF_REFERENCE_FATHER_NAME, MODEL)
7575
brother, brotherId = sap.getOneToOneChild(__tablename__, BROTHER_NAME, MODEL)
76-
76+
7777
class TestContact(MODEL):
7878
__tablename__ = 'TestContact'
7979
id = sap.Column(sap.Integer(), sap.Sequence(f'{__tablename__}{sap.ID}{sap.SEQ}'), primary_key=True)
@@ -1072,6 +1072,7 @@ def __repr__(self):
10721072

10731073
#assert
10741074
assert ObjectHelper.equals(expected, toAssert), f'{expected} == {toAssert}'
1075+
print(f'{expected} == {toAssert}')
10751076

10761077
import MyAttributeClassy
10771078

‎setup.py‎

Lines changed: 2 additions & 2 deletions
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.38'
18+
VERSION = '0.4.39'
1919

2020
NAME = 'python_framework'
2121
PACKAGE_NAME = NAME
@@ -70,7 +70,7 @@
7070
'psycopg2-binary<3.0,>=2.8.6',
7171
'SQLAlchemy==1.4.25',
7272
'globals<1.0,>=0.3.35',
73-
'python-helper<1.0,>=0.3.59',
73+
'python-helper<1.0,>=0.3.61',
7474
'Flask-APScheduler==1.12.2',
7575
'requests<3.0,>=2.26.0',
7676
'werkzeug<3.0,>=2.2.2'

0 commit comments

Comments
 (0)