module_auto_update: check a post condition
parent
07d7f01f9f
commit
2980351947
|
@ -22,10 +22,30 @@ DEFAULT_EXCLUDE_PATTERNS = \
|
|||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class FailedUpgradeError(exceptions.UserError):
|
||||
pass
|
||||
|
||||
|
||||
class IncompleteUpgradeError(exceptions.UserError):
|
||||
pass
|
||||
|
||||
|
||||
def ensure_module_state(env, modules, state):
|
||||
# read module states, bypassing any Odoo cache
|
||||
env.cr.execute(
|
||||
"SELECT name FROM ir_module_module "
|
||||
"WHERE id IN %s AND state != %s",
|
||||
(tuple(modules.ids), state),
|
||||
)
|
||||
names = [r[0] for r in env.cr.fetchall()]
|
||||
if names:
|
||||
raise FailedUpgradeError(
|
||||
"The following modules should be in state '%s' "
|
||||
"at this stage: %s. Bailing out for safety." %
|
||||
(state, ','.join(names), ),
|
||||
)
|
||||
|
||||
|
||||
class Module(models.Model):
|
||||
_inherit = 'ir.module.module'
|
||||
|
||||
|
@ -128,6 +148,11 @@ class Module(models.Model):
|
|||
','.join(changed_modules.mapped('name')))
|
||||
changed_modules.button_upgrade()
|
||||
self.env.cr.commit() # pylint: disable=invalid-commit
|
||||
# in rare situations, button_upgrade may fail without
|
||||
# exception, this would lead to corruption because
|
||||
# no upgrade would be performed and save_installed_checksums
|
||||
# would update cheksums for modules that have not been upgraded
|
||||
ensure_module_state(self.env, changed_modules, 'to upgrade')
|
||||
|
||||
_logger.info("Upgrading...")
|
||||
self.env['base.module.upgrade'].upgrade_module()
|
||||
|
|
Loading…
Reference in New Issue