Coverage for ingadhoc-odoo-saas-adhoc / saas_provider_upgrade / exceptions.py: 18%
32 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 19:24 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 19:24 +0000
1##############################################################################
2# For copyright and license notices, see __manifest__.py file in module root
3# directory
4##############################################################################
6from typing import TYPE_CHECKING
8if TYPE_CHECKING:
9 from .models.helpdesk_ticket_upgrade_request import HelpdeskTicketUpgradeRequest as UpgradeRequest
10 from .models.saas_upgrade_line import SaasUpgradeLine as UpgradeLine
11 from .models.saas_upgrade_line_request_log import SaasUpgradeLineRequestLog as UpgradeLog
12import re
15class UpgradeLineException(Exception):
16 """
17 Exception raised for errors in an upgrade line run.
18 """
20 def __init__(
21 self,
22 env,
23 request: "UpgradeRequest",
24 upgrade_line: "UpgradeLine",
25 error: str,
26 lineno: int | None = None,
27 ):
28 """
29 Initializes the exception with relevant context for logging and formatting.
30 Also, creates the log entry if applicable and formats the error message.
31 """
32 self.log_model: UpgradeLog = env["saas.upgrade.line.request.log"]
33 self.test_dev = env.context.get("test_dev", False)
34 self.request = request
35 self.upgrade_line = upgrade_line
36 self.error = error
37 self.lineno = lineno
38 self.is_connection_error = self._is_connection_error(error)
39 error = self.error
40 if self.is_connection_error or self.test_dev:
41 if "while evaluating" in error:
42 error = error.split("while evaluating")[0].strip()
43 if self.test_dev and self.lineno:
44 error = f"Line {self.lineno}: {error}"
45 self.formatted_error = error
46 else:
47 error = self.log_model._parse(error)
48 error = f"Line {self.lineno}: {error}" if self.lineno else error
49 _, entry = self.log_model.create_new_entry(
50 request=self.request,
51 upgrade_line=self.upgrade_line,
52 type="error",
53 content=error,
54 )
55 self.request.with_error_log = True
56 env.cr.commit() # Commit to ensure the log entry is saved before we try to link it
57 link = entry._get_html_link(title="Ver Error")
58 self.formatted_error = f"Script <b>{self.upgrade_line.name}</b> failed {link}"
60 def __str__(self) -> str:
61 """
62 Returns the formatted error message for the exception.
63 """
64 return self.formatted_error
66 @staticmethod
67 def _is_connection_error(e: Exception | str) -> bool:
68 """
69 Checks if the error is a connection error.
71 :param e: Error to check
72 :return: True if the error is a connection error, False otherwise
73 """
74 regex = r"(connection (error|refused|aborted|reset)|expecting value|Unable to Connect to Database)"
75 res = re.search(regex, str(e), re.IGNORECASE)
76 return res is not None