Coverage for ingadhoc-odoo-saas / saas_client / db.py: 14%

107 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-03-09 18:05 +0000

1# flake8: noqa 

2from odoo.service import db 

3from odoo.api import SUPERUSER_ID, Environment 

4from openupgradelib import openupgrade 

5from odoo.upgrade import util 

6from odoo.addons.server_mode.mode import get_mode 

7import logging 

8from contextlib import closing 

9import odoo 

10import odooly 

11 

12_logger = logging.getLogger(__name__) 

13 

14 

15# this patch could go on saas_provider but then saas provider should go on server_wide_modules 

16odooly._rpc_methods["db"] = odooly._rpc_methods["db"] + [ 

17 "saas_run_private_method", 

18 "saas_run_multiple_method", 

19 "saas_run_upgrade_util_method", 

20 "saas_run_openupgradelib_method", 

21] 

22 

23 

24def exp_saas_run_private_method(model, method, ids=False, args=None, kw=None, context=None, get_result=True): 

25 if not get_mode(): 

26 return "No se puede correr run_private_method en entornos de produccion" 

27 db_name = _get_db_name() 

28 if not db_name: 

29 return "No db_name on odoo conf" 

30 db = odoo.sql_db.db_connect(db_name) 

31 with closing(db.cursor()) as cr: 

32 # cr._cnx.autocommit = True 

33 _logger.info("Running private method %s.%s" % (model, method)) 

34 args = args or [] 

35 kw = kw or {} 

36 env = Environment(cr, SUPERUSER_ID, context or {}) 

37 if ids: 

38 objt = env[model].with_context(active_test=False).search([("id", "in", ids)]) 

39 else: 

40 objt = env[model] 

41 res = getattr(objt, method)(*args, **kw) 

42 # we force to commit because in some cases to compute the values aren't committed after run. 

43 cr.commit() # pylint: disable=invalid-commit 

44 return res if get_result else True 

45 return False 

46 

47 

48db.exp_saas_run_private_method = exp_saas_run_private_method 

49 

50 

51def exp_saas_run_multiple_method(model, method, ids_and_args=None, kw=None, context=None): 

52 if not get_mode(): 

53 return "No se puede correr run_multiple_method en entornos de produccion" 

54 db_name = _get_db_name() 

55 if not db_name: 

56 return "No db_name on odoo conf" 

57 db = odoo.sql_db.db_connect(db_name) 

58 with closing(db.cursor()) as cr: 

59 _logger.info("Running multi method %s.%s" % (model, method)) 

60 res = [] 

61 ids_and_args = ids_and_args or [] 

62 kw = kw or {} 

63 env = Environment(cr, SUPERUSER_ID, context or {}) 

64 all_ids = [x[0] for x in ids_and_args if x[0]] 

65 if all_ids: 

66 objects = {x.id: x for x in env[model].with_context(active_test=False).search([("id", "in", all_ids)])} 

67 for id, args in ids_and_args: 

68 tmp_res = getattr(objects.get(id), method)(*args, **kw) 

69 if tmp_res: 

70 res.append(tmp_res) 

71 elif method == "create": 

72 # If the method is create, execute a create_multi for al registers 

73 res = getattr(env[model], method)([args for id, args in ids_and_args], **kw) 

74 else: 

75 for id, args in ids_and_args: 

76 tmp_res = getattr(env[model], method)(*args, **kw) 

77 if tmp_res: 

78 res.append(tmp_res) 

79 # we force to commit because in some cases to compute the values aren't committed after run. 

80 cr.commit() # pylint: disable=invalid-commit 

81 return res 

82 return False 

83 

84 

85db.exp_saas_run_multiple_method = exp_saas_run_multiple_method 

86 

87 

88def exp_saas_run_upgrade_util_method(method, args_list=None, kw=None, exception=True): 

89 if not get_mode(): 

90 return "No se puede correr run_upgrade_util_method en entornos de produccion" 

91 db_name = _get_db_name() 

92 if not db_name: 

93 return "No db_name on odoo conf" 

94 util.ENVIRON["AUTO_DISCOVERY_RAN"] = "1" 

95 db = odoo.sql_db.db_connect(db_name) 

96 res = [] 

97 with closing(db.cursor()) as cr: 

98 cr._cnx.autocommit = True # avoid transaction block 

99 _logger.info("Running Odoo Upgrade Lib method %s", method) 

100 args_list = args_list or [] 

101 kw = kw or {} 

102 # TODO por ahora siempre estamos manando como primer argumento cr pero 

103 # si algun metodo utiliza otro podemos ponerlo opcional como algun argumetno de este metodo 

104 for args in args_list: 

105 try: 

106 args = [cr] + args 

107 res = getattr(util, method)(*args, **kw) 

108 except Exception as e: 

109 if exception: 

110 msg = f"Exception executing '{method}' with this arguments: {args}: {e}" 

111 raise Exception(msg) 

112 else: 

113 res += [(method, args, e)] 

114 return res or False 

115 

116 

117db.exp_saas_run_upgrade_util_method = exp_saas_run_upgrade_util_method 

118 

119 

120def exp_saas_run_openupgradelib_method(method, args=None, kw=None): 

121 if not get_mode(): 

122 return "No se puede correr run_openupgradelib_method en entornos de produccion" 

123 db_name = _get_db_name() 

124 if not db_name: 

125 return "No db_name on odoo conf" 

126 db = odoo.sql_db.db_connect(db_name) 

127 with closing(db.cursor()) as cr: 

128 cr._cnx.autocommit = True # avoid transaction block 

129 _logger.info("Running openupgradelib method %s", method) 

130 args = args or [] 

131 kw = kw or {} 

132 # TODO por ahora siempre estamos manando como primer argumento cr pero 

133 # si algun metodo utiliza otro podemos ponerlo opcional como algun argumetno de este metodo 

134 args = [cr] + args 

135 getattr(openupgrade, method)(*args, **kw) 

136 return True 

137 

138 

139db.exp_saas_run_openupgradelib_method = exp_saas_run_openupgradelib_method 

140 

141 

142def _get_db_name(): 

143 db_name = odoo.tools.config["db_name"] 

144 if isinstance(db_name, list): 

145 db_name = db_name[0] 

146 return db_name