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
« 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
12_logger = logging.getLogger(__name__)
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]
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
48db.exp_saas_run_private_method = exp_saas_run_private_method
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
85db.exp_saas_run_multiple_method = exp_saas_run_multiple_method
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
117db.exp_saas_run_upgrade_util_method = exp_saas_run_upgrade_util_method
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
139db.exp_saas_run_openupgradelib_method = exp_saas_run_openupgradelib_method
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