diff --git a/mo/jobs/__init__.py b/mo/jobs/__init__.py index 56e68e5f40d390c1781c6060f9520f296195d477..67bff065b55cdb901fbc81829f5a232097848721 100644 --- a/mo/jobs/__init__.py +++ b/mo/jobs/__init__.py @@ -4,14 +4,16 @@ from datetime import timedelta import os import shutil from sqlalchemy import or_ +import sys from typing import Optional, Dict, Callable, List import mo import mo.config as config import mo.db as db +import mo.email import mo.rights import mo.util -from mo.util import logger +from mo.util import logger, ExceptionInfo def send_notify(): @@ -141,6 +143,8 @@ class TheJob: job.out_file = None sess.commit() + exc_info: ExceptionInfo = (None, None, None) + try: self.gatekeeper = mo.rights.Gatekeeper(job.user) self.expires_in_minutes = config.JOB_EXPIRATION @@ -159,7 +163,8 @@ class TheJob: logger.info(f'Job: Úspěšně dokončen job #{job.job_id} ({job.result})') job.state = db.JobState.done except Exception as e: - logger.error(f'Job: Chyba při zpracování jobu #{job.job_id}: %s', e, exc_info=e) + exc_info = sys.exc_info() + logger.error(f'Job: Chyba při zpracování jobu #{job.job_id}: %s', e, exc_info=exc_info) job.state = db.JobState.internal_error job.result = 'Interní chyba, informujte prosím správce systému.' @@ -168,6 +173,16 @@ class TheJob: job.expires_at = job.finished_at + timedelta(minutes=self.expires_in_minutes) sess.commit() + # Maily o interních chybách posíláme mimo transakci + if job.state == db.JobState.internal_error: + err_attrs = { + 'Job': f'#{job.job_id}', + 'Type': str(job.type), + 'User': f'#{job.user_id}', + 'Desc': job.description, + } + mo.email.send_internal_error_email(f'Job #{job.job_id}', err_attrs, exc_info) + def process_jobs(): sess = db.get_session()