Coverage for ingadhoc-odoo-saas / saas_client / cli / fixdb.py: 34%
38 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:37 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:37 +0000
1import logging
2import optparse
3import sys
4from contextlib import contextmanager
6from odoo.api import SUPERUSER_ID, Environment
7from odoo.cli import Command
8from odoo.modules.registry import Registry
9from odoo.tools import config
11_logger = logging.getLogger(__name__)
14def raise_keyboard_interrupt(*a):
15 raise KeyboardInterrupt()
18class Fixdb(Command):
19 @contextmanager
20 def _create_env_context(self, db_name):
21 with Registry.new(db_name).cursor() as cr:
22 yield Environment(cr, SUPERUSER_ID, {"prefetch_fields": False})
24 def run(self, args):
25 parser = config.parser
26 parser.prog = self.prog
27 group = optparse.OptionGroup(parser, "FixDb", "FixDb the database specified by the `-d` argument.")
28 parser.add_option_group(group)
29 config.parse_config(args, setup_logging=True)
31 dbnames = config["db_name"]
32 if not dbnames:
33 _logger.error('FixDb command needs a database name. Use "-d" argument')
34 sys.exit(1)
35 if len(dbnames) > 1:
36 sys.exit("-d/--database/db_name has multiple databases, please provide a single one")
37 dbname = dbnames[0]
38 self.fixdb(dbname)
40 def fixdb(self, dbname):
41 with self._create_env_context(dbname) as env:
42 # Try to acquire lock for concurrent fixdb operations, skip if already locked
43 env.cr.execute("SELECT pg_try_advisory_xact_lock(hashtext(%s))", [dbname])
44 row = env.cr.fetchone()
45 if row is None or not row[0]:
46 _logger.info("Another fixdb process is already running for %s, skipping", dbname)
47 return
48 env["ir.module.module"].fix_modules()