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 18:05 +0000

1############################################################################## 

2# For copyright and license notices, see __manifest__.py file in module root 

3# directory 

4############################################################################## 

5 

6from typing import TYPE_CHECKING 

7 

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 

13 

14 

15class UpgradeLineException(Exception): 

16 """ 

17 Exception raised for errors in an upgrade line run. 

18 """ 

19 

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}" 

59 

60 def __str__(self) -> str: 

61 """ 

62 Returns the formatted error message for the exception. 

63 """ 

64 return self.formatted_error 

65 

66 @staticmethod 

67 def _is_connection_error(e: Exception | str) -> bool: 

68 """ 

69 Checks if the error is a connection error. 

70 

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