Coverage for adhoc-cicd-odoo-odoo / odoo / modules / neutralize.py: 36%

21 statements  

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

1# Part of Odoo. See LICENSE file for full copyright and licensing details. 

2from __future__ import annotations 

3 

4import logging 

5import typing 

6from contextlib import suppress 

7 

8from odoo.tools.misc import file_open 

9 

10if typing.TYPE_CHECKING: 

11 from collections.abc import Iterable, Iterator 

12 

13 from odoo.sql_db import Cursor 

14 

15_logger = logging.getLogger(__name__) 

16 

17 

18def get_installed_modules(cursor: Cursor) -> list[str]: 

19 cursor.execute(''' 

20 SELECT name 

21 FROM ir_module_module 

22 WHERE state IN ('installed', 'to upgrade', 'to remove'); 

23 ''') 

24 return [result[0] for result in cursor.fetchall()] 

25 

26 

27def get_neutralization_queries(modules: Iterable[str]) -> Iterator[str]: 

28 # neutralization for each module 

29 for module in modules: 

30 filename = f'{module}/data/neutralize.sql' 

31 with suppress(FileNotFoundError): 

32 with file_open(filename) as file: 

33 yield file.read().strip() 

34 

35 

36def neutralize_database(cursor: Cursor) -> None: 

37 installed_modules = get_installed_modules(cursor) 

38 queries = get_neutralization_queries(installed_modules) 

39 for query in queries: 

40 cursor.execute(query) 

41 _logger.info("Neutralization finished")