48 lines
1.3 KiB
Python
48 lines
1.3 KiB
Python
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
|
|
|
import logging
|
|
|
|
from odoo import SUPERUSER_ID, api
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
def migrate(cr, version):
|
|
with api.Environment.manage():
|
|
env = api.Environment(cr, SUPERUSER_ID, {})
|
|
_logger.info("Computing exception name for failed jobs")
|
|
_compute_jobs_new_values(env)
|
|
|
|
|
|
def _compute_jobs_new_values(env):
|
|
for job in env["queue.job"].search(
|
|
[("state", "=", "failed"), ("exc_info", "!=", False)]
|
|
):
|
|
exception_details = _get_exception_details(job)
|
|
if exception_details:
|
|
job.update(exception_details)
|
|
|
|
|
|
def _get_exception_details(job):
|
|
for line in reversed(job.exc_info.splitlines()):
|
|
if _find_exception(line):
|
|
name, msg = line.split(":", 1)
|
|
return {
|
|
"exc_name": name.strip(),
|
|
"exc_message": msg.strip("()', \""),
|
|
}
|
|
|
|
|
|
def _find_exception(line):
|
|
# Just a list of common errors.
|
|
# If you want to target others, add your own migration step for your db.
|
|
exceptions = (
|
|
"Error:", # catch all well named exceptions
|
|
# other live instance errors found
|
|
"requests.exceptions.MissingSchema",
|
|
"botocore.errorfactory.NoSuchKey",
|
|
)
|
|
for exc in exceptions:
|
|
if exc in line:
|
|
return exc
|