From 28f79d144ed730490352e58a4a2838192455d7cf Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Mon, 29 Aug 2022 13:42:07 +0200
Subject: [PATCH] =?UTF-8?q?Maily=20o=20chyb=C3=A1ch:=20Napojen=C3=AD=20na?=
 =?UTF-8?q?=20joby?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #270.
---
 mo/jobs/__init__.py | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/mo/jobs/__init__.py b/mo/jobs/__init__.py
index 56e68e5f..67bff065 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()
-- 
GitLab