diff --git a/AUTHORS.rst b/AUTHORS.rst index f539e9d..fa07642 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -11,4 +11,5 @@ Contributors - Simone Orsi (Camptocamp) - Iván Todorovitch (Camptocamp) - Yannick Vaucher (Camptocamp) -- Alexandre Fayolle (Camptocamp) \ No newline at end of file +- Alexandre Fayolle (Camptocamp) +- Stéphane Mangin (Camptocamp) diff --git a/marabunta/config.py b/marabunta/config.py index aa890d6..575f1e1 100644 --- a/marabunta/config.py +++ b/marabunta/config.py @@ -7,7 +7,6 @@ class Config(object): - def __init__(self, migration_file, database, @@ -18,6 +17,7 @@ def __init__(self, mode=None, allow_serie=False, force_version=None, + override_translations=False, web_host='localhost', web_port=8069, web_resp_status=503, @@ -35,6 +35,7 @@ def __init__(self, self.force_version = force_version if force_version and not allow_serie: self.allow_serie = True + self.override_translations = override_translations self.web_host = web_host self.web_port = web_port self.web_resp_status = web_resp_status @@ -60,6 +61,7 @@ def from_parse_args(cls, args): mode=args.mode, allow_serie=args.allow_serie, force_version=args.force_version, + override_translations=args.override_translations, web_host=args.web_host, web_port=args.web_port, web_resp_status=args.web_resp_status, @@ -98,102 +100,132 @@ def get_default(self, envvar): def get_args_parser(): """Return a parser for command line options.""" - parser = argparse.ArgumentParser( - description='Marabunta: Migrating ants for Odoo') - parser.add_argument('--migration-file', '-f', - action=EnvDefault, - envvar='MARABUNTA_MIGRATION_FILE', - required=True, - help='The yaml file containing the migration steps') - parser.add_argument('--database', '-d', - action=EnvDefault, - envvar='MARABUNTA_DATABASE', - required=True, - help="Odoo's database") - parser.add_argument('--db-user', '-u', - action=EnvDefault, - envvar='MARABUNTA_DB_USER', - required=True, - help="Odoo's database user") - parser.add_argument('--db-password', '-w', - action=EnvDefault, - envvar='MARABUNTA_DB_PASSWORD', - required=False, - help="Odoo's database password") - parser.add_argument('--db-port', '-p', - type=int, - default=os.environ.get('MARABUNTA_DB_PORT', 5432), - help="Odoo's database port") - parser.add_argument('--db-host', '-H', - default=os.environ.get('MARABUNTA_DB_HOST', - None), - help="Odoo's database host") - parser.add_argument('--mode', - action=EnvDefault, - envvar='MARABUNTA_MODE', - required=False, - help="Specify the mode in which we run the migration," - "such as 'sample' or 'full'. Additional operations " - "of this mode will be executed after the main " - "operations and the addons list of this mode " - "will be merged with the main addons list.") - parser.add_argument('--allow-serie', - action=BoolEnvDefault, - required=False, - envvar='MARABUNTA_ALLOW_SERIE', - help='Allow to run more than 1 version upgrade at a ' - 'time.') - parser.add_argument('--force-version', - required=False, - default=os.environ.get('MARABUNTA_FORCE_VERSION'), - help='Force upgrade of a version, even if it has ' - 'already been applied.') + parser = argparse.ArgumentParser(description="Marabunta: Migrating ants for Odoo") + parser.add_argument( + "--migration-file", + "-f", + action=EnvDefault, + envvar="MARABUNTA_MIGRATION_FILE", + required=True, + help="The yaml file containing the migration steps", + ) + parser.add_argument( + "--database", + "-d", + action=EnvDefault, + envvar="MARABUNTA_DATABASE", + required=True, + help="Odoo's database", + ) + parser.add_argument( + "--db-user", + "-u", + action=EnvDefault, + envvar="MARABUNTA_DB_USER", + required=True, + help="Odoo's database user", + ) + parser.add_argument( + "--db-password", + "-w", + action=EnvDefault, + envvar="MARABUNTA_DB_PASSWORD", + required=False, + help="Odoo's database password", + ) + parser.add_argument( + "--db-port", + "-p", + type=int, + default=os.environ.get("MARABUNTA_DB_PORT", 5432), + help="Odoo's database port", + ) + parser.add_argument( + "--db-host", + "-H", + default=os.environ.get("MARABUNTA_DB_HOST", None), + help="Odoo's database host", + ) + parser.add_argument( + "--mode", + action=EnvDefault, + envvar="MARABUNTA_MODE", + required=False, + help="Specify the mode in which we run the migration," + "such as 'sample' or 'full'. Additional operations " + "of this mode will be executed after the main " + "operations and the addons list of this mode " + "will be merged with the main addons list.", + ) + parser.add_argument( + "--allow-serie", + action=BoolEnvDefault, + required=False, + envvar="MARABUNTA_ALLOW_SERIE", + help="Allow to run more than 1 version upgrade at a " "time.", + ) + parser.add_argument( + "--force-version", + required=False, + default=os.environ.get("MARABUNTA_FORCE_VERSION"), + help="Force upgrade of a version, even if it has " "already been applied.", + ) + parser.add_argument( + "--override-translations", + required=False, + default=os.environ.get("MARABUNTA_OVERRIDE_TRANSLATIONS"), + help="Force override of translations.", + ) group = parser.add_argument_group( - title='Web', - description='Configuration related to the internal web server, ' - 'used to publish a maintenance page during the migration.', - ) - group.add_argument('--web-host', - required=False, - default=os.environ.get('MARABUNTA_WEB_HOST', '0.0.0.0'), - help='Host for the web server') - group.add_argument('--web-port', - type=int, - required=False, - default=os.environ.get('MARABUNTA_WEB_PORT', 8069), - help='Port for the web server') - group.add_argument('--web-resp-status', - type=int, - required=False, - default=os.environ.get( - 'MARABUNTA_WEB_RESP_STATUS', 503 - ), - help='Response HTTP status code of the web server') - group.add_argument('--web-resp-retry-after', - type=int, - required=False, - default=os.environ.get( - 'MARABUNTA_WEB_RESP_RETRY_AFTER', 300 - ), - help=( - '"Retry-After" header value (in seconds) of ' - 'response delivered by the web server') - ) - group.add_argument('--web-custom-html', - required=False, - default=os.environ.get( - 'MARABUNTA_WEB_CUSTOM_HTML' - ), - help='Path to a custom html file to publish') - group.add_argument('--web-healthcheck-path', - required=False, - default=os.environ.get( - 'MARABUNTA_WEB_HEALTHCHECK_PATH' - ), - help=( - 'URL Path used for health checks HTTP requests. ' - 'Such monitoring requests will return HTTP 200 ' - 'status code instead of the default 503.' - )) + title="Web", + description="Configuration related to the internal web server, " + "used to publish a maintenance page during the migration.", + ) + group.add_argument( + "--web-host", + required=False, + default=os.environ.get("MARABUNTA_WEB_HOST", "0.0.0.0"), + help="Host for the web server", + ) + group.add_argument( + "--web-port", + type=int, + required=False, + default=os.environ.get("MARABUNTA_WEB_PORT", 8069), + help="Port for the web server", + ) + group.add_argument( + "--web-resp-status", + type=int, + required=False, + default=os.environ.get("MARABUNTA_WEB_RESP_STATUS", 503), + help="Response HTTP status code of the web server", + ) + group.add_argument( + "--web-resp-retry-after", + type=int, + required=False, + default=os.environ.get("MARABUNTA_WEB_RESP_RETRY_AFTER", 300), + help=( + '"Retry-After" header value (in seconds) of ' + "response delivered by the web server" + ), + ) + group.add_argument( + "--web-custom-html", + required=False, + default=os.environ.get("MARABUNTA_WEB_CUSTOM_HTML"), + help="Path to a custom html file to publish", + ) + group.add_argument( + "--web-healthcheck-path", + required=False, + default=os.environ.get("MARABUNTA_WEB_HEALTHCHECK_PATH"), + help=( + "URL Path used for health checks HTTP requests. " + "Such monitoring requests will return HTTP 200 " + "status code instead of the default 503." + ), + ) return parser diff --git a/marabunta/model.py b/marabunta/model.py index 391904a..bd55d89 100644 --- a/marabunta/model.py +++ b/marabunta/model.py @@ -16,7 +16,6 @@ class Migration(object): - def __init__(self, versions, options): self._versions = versions self.options = options @@ -27,7 +26,6 @@ def versions(self): class MigrationOption(object): - def __init__(self, install_command=None, install_args=None, backup=None): """Options block in a migration. @@ -38,13 +36,12 @@ def __init__(self, install_command=None, install_args=None, backup=None): :param backup: Backup options :type backup: Dict """ - self.install_command = install_command or u'odoo' - self.install_args = install_args or u'' + self.install_command = install_command or "odoo" + self.install_args = install_args or "" self.backup = backup class MigrationBackupOption(object): - def __init__(self, command, ignore_if, stop_on_failure=True): """Backup option in migration. @@ -92,15 +89,14 @@ def command_operation(self, config): def ignore_if_operation(self): if self._ignore_if is None or self._ignore_if is False: # if ignore_if parameter was not specified - always backup - return SilentOperation('false', shell=True) + return SilentOperation("false", shell=True) elif self._ignore_if is True: # if it is specifically True - return SilentOperation('true', shell=True) + return SilentOperation("true", shell=True) return SilentOperation(self._ignore_if, shell=True) class Version(object): - def __init__(self, number, options): """Base class for a migration version. @@ -112,13 +108,12 @@ def __init__(self, number, options): try: MarabuntaVersion().parse(number) except ValueError: - raise ConfigurationError( - u'{} is not a valid version'.format(number) - ) + raise ConfigurationError("{} is not a valid version".format(number)) self.number = number self._version_modes = {} self.options = options self.backup = False + self.override_translations = False def is_processed(self, db_versions): """Check if version is already applied in the database. @@ -210,7 +205,7 @@ def upgrade_addons_operation(self, addons_state, mode=None): to_install = addons_list - installed to_upgrade = installed & addons_list - return UpgradeAddonsOperation(self.options, to_install, to_upgrade) + return UpgradeAddonsOperation(self.options, to_install, to_upgrade, self.override_translations) def remove_addons_operation(self): raise NotImplementedError @@ -252,10 +247,11 @@ def add_remove_addons(self, addons): class UpgradeAddonsOperation(object): - def __init__(self, options, to_install, to_upgrade): + def __init__(self, options, to_install, to_upgrade, override_translations=False): self.options = options self.to_install = set(to_install) self.to_upgrade = set(to_upgrade) + self.override_translations = override_translations def operation(self, exclude_addons=None): if exclude_addons is None: @@ -263,6 +259,8 @@ def operation(self, exclude_addons=None): install_command = self.options.install_command install_args = self.options.install_args[:] or [] install_args += [u'--workers=0', u'--stop-after-init', u'--no-xmlrpc'] + if self.override_translations: + install_args += [u'--i18n-override'] to_install = self.to_install - exclude_addons if to_install: diff --git a/marabunta/parser.py b/marabunta/parser.py index 0216ca9..011670e 100644 --- a/marabunta/parser.py +++ b/marabunta/parser.py @@ -58,6 +58,7 @@ - version: 0.0.2 backup: false + override_translations: true # nothing to do - version: 0.0.3 @@ -71,6 +72,7 @@ - version: 0.0.4 backup: false + override_translations: true addons: upgrade: - popeye @@ -198,10 +200,27 @@ def _parse_backup(self, version, backup=True, mode=None): raise ParseError(u"'backup' key must be a boolean", YAML_EXAMPLE) version.backup = backup + def _parse_override_translations( + self, version, override_translations=False, mode=None + ): + if override_translations not in (True, False, None): + raise ParseError( + "'override_translations' key must be a boolean", YAML_EXAMPLE + ) + version.override_translations = override_translations + def _parse_version(self, parsed_version, options): self.check_dict_expected_keys( - {'version', 'operations', 'addons', 'modes', 'backup'}, - parsed_version, 'versions', + { + "version", + "operations", + "addons", + "modes", + "backup", + "override_translations", + }, + parsed_version, + "versions", ) number = parsed_version.get('version') version = Version(number, options) @@ -237,4 +256,9 @@ def _parse_version(self, parsed_version, options): backup = True self._parse_backup(version, backup) + # If translations needs to be overriden + self._parse_override_translations( + version, parsed_version.get("override_translations") + ) + return version