19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:30:27 +01:00
parent d1963a3c3a
commit 2d3ee4855a
7430 changed files with 2687981 additions and 2965473 deletions

View file

@ -27,7 +27,7 @@ class Cloc(Command):
self.parser.add_argument('--database', '-d', dest="database", help="Database name")
self.parser.add_argument('--path', '-p', action='append', help="File or directory path")
self.parser.add_argument('--verbose', '-v', action='count', default=0)
opt, unknown = self.parser.parse_known_args(args)
opt, unknown = self.parser.parse_known_args(args + ['--no-http'])
if not opt.database and not opt.path:
self.parser.print_help()
sys.exit()

View file

@ -7,6 +7,7 @@ from pathlib import Path
from odoo import SUPERUSER_ID
from odoo.api import Environment
from odoo.cli.command import Command
from odoo.fields import Domain
from odoo.modules import get_module_path
from odoo.modules.registry import Registry
from odoo.tools import OrderedSet, config
@ -104,7 +105,7 @@ class I18n(Command):
def run(self, cmdargs):
parsed_args = self.parser.parse_args(args=cmdargs)
config_args = []
config_args = ['--no-http']
if parsed_args.config:
config_args += ['-c', parsed_args.config]
if parsed_args.db_name:
@ -128,14 +129,25 @@ class I18n(Command):
def _get_languages(self, env, language_codes, active_test=True):
# We want to log invalid parameters
Lang = env['res.lang'].with_context(active_test=False)
languages = Lang.search([('iso_code', 'in', language_codes)])
languages = Lang.search(Domain.OR([Domain('iso_code', 'in', language_codes),
Domain('code', 'in', language_codes)]))
if not_found_language_codes := set(language_codes) - set(languages.mapped("iso_code")):
_logger.warning("Ignoring not found languages: %s", ', '.join(not_found_language_codes))
if active_test:
if not_installed_languages := languages.filtered(lambda x: not x.active):
languages -= not_installed_languages
iso_code_str = ", ".join(not_installed_languages.mapped("iso_code"))
_logger.warning("Ignoring not installed languages: %s", iso_code_str)
iso_codes = not_installed_languages.mapped('iso_code')
_logger.warning(
textwrap.dedent("""\
Ignoring not installed languages: %s
Install them running the below command, then run this command again.
$ %s -l %s
"""),
', '.join(iso_codes),
self.loadlang_parser.prog,
' '.join(iso_codes),
)
return languages
def _import(self, parsed_args):

View file

@ -62,6 +62,8 @@ class Module(Command):
parser.add_argument(
'-d', '--database', dest='db_name', default=None,
help="database name, connection details will be taken from the config file")
parser.add_argument("-D", "--data-dir", dest="data_dir",
help="directory where to store Odoo data")
install_parser.add_argument(
'modules', nargs='+', metavar='MODULE',
@ -81,19 +83,22 @@ class Module(Command):
help="names of the modules to be uninstalled")
upgrade_parser.add_argument(
'modules', nargs='+', metavar='MODULE',
help="name of the modules to be upgraded, use 'base' if you want to upgrade everything")
help="name of the modules to be upgraded, use 'base' or 'all' if you want to upgrade everything")
upgrade_parser.add_argument(
'--outdated', action='store_true',
help="only update modules that have a newer version on disk",
help="only update modules that have a newer version on disk. "
"If 'all' is used as `modules` argument, this applies to all installed modules.",
)
def run(self, cmdargs):
parsed_args = self.parser.parse_args(args=cmdargs)
config_args = []
config_args = ['--no-http']
if parsed_args.config:
config_args += ['-c', parsed_args.config]
if parsed_args.db_name:
config_args += ['-d', parsed_args.db_name]
if parsed_args.data_dir:
config_args += ['-D', parsed_args.data_dir]
config.parse_config(config_args, setup_logging=True)
db_names = config['db_name']
@ -119,10 +124,16 @@ class Module(Command):
or self._get_zip_path(module)
}
def _get_modules(self, env, module_names):
def _get_module_model(self, env):
Module = env['ir.module.module']
Module.update_list()
return Module.search([('name', 'in', module_names)])
return Module
def _get_all_installed_modules(self, env):
return self._get_module_model(env).search([['state', '=', 'installed']])
def _get_modules(self, env, module_names):
return self._get_module_model(env).search([('name', 'in', module_names)])
@contextmanager
def _create_env_context(self, db_name):
@ -156,8 +167,11 @@ class Module(Command):
def _upgrade(self, parsed_args):
with self._create_env_context(parsed_args.db_name) as env:
valid_module_names = self._get_module_names(parsed_args.modules)
upgradable_modules = self._get_modules(env, valid_module_names)
if 'all' in parsed_args.modules:
upgradable_modules = self._get_all_installed_modules(env)
else:
valid_module_names = self._get_module_names(parsed_args.modules)
upgradable_modules = self._get_modules(env, valid_module_names)
if parsed_args.outdated:
upgradable_modules = upgradable_modules.filtered(
lambda x: parse_version(x.installed_version) > parse_version(x.latest_version),

View file

@ -69,7 +69,7 @@ class Obfuscate(Command):
return SQL("""CASE WHEN starts_with(%(field_name)s, 'odoo_cyph_') THEN pgp_sym_decrypt(decode(substring(%(field_name)s, 11)::text, 'base64'), %(pwd)s) ELSE %(field_name)s END""", field_name=sql_field, pwd=password)
def check_field(self, table, field):
qry = "SELECT udt_name FROM information_schema.columns WHERE table_name=%s AND column_name=%s"
qry = "SELECT udt_name FROM information_schema.columns WHERE table_name=%s AND column_name=%s AND table_schema = current_schema"
self.cr.execute(qry, [table, field])
if self.cr.rowcount == 1:
res = self.cr.fetchone()
@ -81,7 +81,10 @@ class Obfuscate(Command):
return False
def get_all_fields(self):
qry = "SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public' AND udt_name IN ['text', 'varchar', 'jsonb'] AND NOT table_name LIKE 'ir_%' ORDER BY 1,2"
qry = (
"SELECT table_name, column_name FROM information_schema.columns"
" WHERE table_schema = current_schema AND udt_name IN ('text', 'varchar', 'jsonb') AND NOT table_name LIKE 'ir_%' ORDER BY 1,2"
)
self.cr.execute(qry)
return self.cr.fetchall()
@ -158,7 +161,13 @@ class Obfuscate(Command):
if opt.allfields and not opt.unobfuscate:
_logger.error("--allfields can only be used in unobfuscate mode")
sys.exit("ERROR: --allfields can only be used in unobfuscate mode")
self.dbname = config['db_name']
if not opt.db_name:
_logger.error('Obfuscate command needs a database name. Use "-d" argument')
sys.exit('ERROR: Obfuscate command needs a database name. Use "-d" argument')
if len(opt.db_name) > 1:
_logger.error("-d/--database has multiple databases, please provide a single one")
sys.exit("ERROR: -d/--database has multiple databases, please provide a single one")
self.dbname = config['db_name'][0]
self.registry = Registry(self.dbname)
with self.registry.cursor() as cr:
self.cr = cr

View file

@ -38,7 +38,7 @@ class Populate(Command):
help="Single character separator for char/text fields.",
default=DEFAULT_SEPARATOR)
parser.add_option_group(group)
opt = config.parse_config(cmdargs, setup_logging=True)
opt = config.parse_config(cmdargs + ['--no-http'], setup_logging=True)
# deduplicate models if necessary, and keep the last corresponding
# factor for each model