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

1import logging 

2import optparse 

3import sys 

4from contextlib import contextmanager 

5 

6from odoo.api import SUPERUSER_ID, Environment 

7from odoo.cli import Command 

8from odoo.modules.registry import Registry 

9from odoo.tools import config 

10 

11_logger = logging.getLogger(__name__) 

12 

13 

14def raise_keyboard_interrupt(*a): 

15 raise KeyboardInterrupt() 

16 

17 

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

23 

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) 

30 

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) 

39 

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()