[FIX][module_auto_update] Always store changes in lower graphs
The same problem that was fixed for the `base` addon in #948 happened with random addons that do not depend on `module_auto_update` (a.k.a. any addon) that Odoo decided to load before that one in the graph. Now we always check for all addons if their state has changed, and make sure to trigger the udpate mechanism that stores the right value in `installed_checksum_dir` field. If you installed and uninstalled the addon right away, you'd get a ProgrammingError saying that some columns exist no more. Checks are done now using `search_read`, which lets us limit the fields being fetched, and the environment is cleared to make sure nothing fails. Also we now guess if this own addon has been uninstalled and skip further logic if so, given it would hit broken triggers otherwise as it did before.pull/2248/head
parent
ea9ae22d49
commit
a90b06492b
|
@ -10,37 +10,40 @@ class ModuleUpgrade(models.TransientModel):
|
|||
|
||||
@api.model
|
||||
def get_module_list(self):
|
||||
if not self.env.context.get('module_uninstall'):
|
||||
Module = self.env["ir.module.module"]
|
||||
installed_modules = Module.search([('state', '=', 'installed')])
|
||||
upgradeable_modules = installed_modules.filtered(
|
||||
lambda r: r.checksum_dir != r.checksum_installed,
|
||||
)
|
||||
upgradeable_modules.button_upgrade()
|
||||
"""Set modules to upgrade searching by their dir checksum."""
|
||||
Module = self.env["ir.module.module"]
|
||||
installed_modules = Module.search([('state', '=', 'installed')])
|
||||
upgradeable_modules = installed_modules.filtered(
|
||||
lambda r: r.checksum_dir != r.checksum_installed,
|
||||
)
|
||||
upgradeable_modules.button_upgrade()
|
||||
return super(ModuleUpgrade, self).get_module_list()
|
||||
|
||||
@api.multi
|
||||
def upgrade_module_cancel(self):
|
||||
return super(
|
||||
ModuleUpgrade,
|
||||
self.with_context(retain_checksum_installed=True),
|
||||
).upgrade_module_cancel()
|
||||
|
||||
@api.multi
|
||||
def upgrade_module(self):
|
||||
"""Make a fully automated addon upgrade."""
|
||||
# Compute updates by checksum when called in @api.model fashion
|
||||
if not self:
|
||||
self.get_module_list()
|
||||
# Get base adddon status before updating
|
||||
base = self.env["ir.module.module"].search([("name", "=", "base")])
|
||||
pre_state = base.state
|
||||
Module = self.env["ir.module.module"]
|
||||
# Get every addon state before updating
|
||||
pre_states = {addon["name"]: addon["state"]
|
||||
for addon in Module.search_read([], ["name", "state"])}
|
||||
# Perform upgrades, possibly in a limited graph that excludes me
|
||||
result = super(ModuleUpgrade, self).upgrade_module()
|
||||
# Update base addon checksum if its state changed
|
||||
base.invalidate_cache()
|
||||
if base.state != pre_state:
|
||||
# This triggers the write hook that should have been triggered
|
||||
# when the module was [un]installed/updated in the base-only
|
||||
# module graph inside above call to super(), and updates its
|
||||
# dir checksum as needed
|
||||
base.latest_version = base.latest_version
|
||||
# Reload environments, anything may have changed
|
||||
self.env.clear()
|
||||
# Update addons checksum if state changed and I wasn't uninstalled
|
||||
own = Module.search_read(
|
||||
[("name", "=", "module_auto_update")],
|
||||
["state"],
|
||||
limit=1)
|
||||
if own and own[0]["state"] != "uninstalled":
|
||||
for addon in Module.search([]):
|
||||
if addon.state != pre_states.get(addon.name):
|
||||
# Trigger the write hook that should have been
|
||||
# triggered when the module was [un]installed/updated in
|
||||
# the limited module graph inside above call to super(),
|
||||
# and updates its dir checksum as needed
|
||||
addon.latest_version = addon.latest_version
|
||||
return result
|
||||
|
|
Loading…
Reference in New Issue