def handlerMergeFile (*args, **kwargs):
"""
Обработчик объединения нескольких файлов в один
"""
result = True
if len(args) == 1 and isinstance (args[0], list):
_args, _kwargs = args[0]
args = _args
kwargs = {**_kwargs, **kwargs}
logger.info ('handlerSaveMergeFile ()')
#for value in args:
# logger.info ('args: {0}'.format(value))
#for key, value in kwargs.items():
# logger.info ('kwargs: {0}:{1}'.format(key,value))
#набор обязательных параметров
try:
id = kwargs.get('id',None)
if id is None:
raise InputParametersDoNotMeetExpectationsClass('аргумент id функции handlerSaveMergeFile() не соответствуют ожиданиям' )
ack_id_msg = kwargs.get('ack_id_msg',None)
if ack_id_msg is None:
raise InputParametersDoNotMeetExpectationsClass('аргумент ack_id_msg функции handlerSaveMergeFile() не соответствуют ожиданиям' )
merge_ids: list = kwargs.get('merge_ids', None)
if merge_ids is None:
raise InputParametersDoNotMeetExpectationsClass('аргумент merge_ids функции handlerSaveMergeFile() не соответствуют ожиданиям' )
#проверяем наличие всех файлов на диске,
with SessionLocal() as session:
paths = get_files_paths(session, merge_ids)
# если они все скачались объединяем их в один,
try:
merge_file_id, full_path = merge_files(paths)
except Exception as e:
raise MergeFilesError('Ошибка во время слияния файлов')
try:
save_file_in_db(session, merge_file_id, full_path)
session.query(orm_schema.SmevFile).filter(
orm_schema.SmevFile.id.in_(merge_ids)
).delete(synchronize_session=False)
session.commit()
except Exception as e:
session.rollback()
logger.info('handlerMergeFile() - ошибка внесения данных в базу данных, текст ошибки: %s', str(e))
raise FileRecordingProblemClass(f'Ошибка сохранения файла в бд, сообщение об ошибке {str(e)}')
# Удаляем с диска части ранее скачанных архивов
for path in paths:
try:
os.remove(path)
logger.info("Удален файл %s", path)
except Exception as e:
logger.info("Ошибка удаления файла %s: %s", path, str(e))
continue
except MergeFilesError as e:
logger.info(f'handlerMergeFile() - {str(e)}')
result = False
except FileNotExistInDatabase as e:
logger.info(f'handlerMergeFile() - {str(e)}')
result = False
kwargs["result"] = result
return args, kwargs