|
|
@ -10,25 +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() |
|
|
|
return super(ModuleUpgrade, self).upgrade_module() |
|
|
|
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() |
|
|
|
# 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 |