summaryrefslogtreecommitdiff
path: root/odoo/addons/base/module/wizard/base_module_uninstall.py
diff options
context:
space:
mode:
Diffstat (limited to 'odoo/addons/base/module/wizard/base_module_uninstall.py')
-rw-r--r--odoo/addons/base/module/wizard/base_module_uninstall.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/odoo/addons/base/module/wizard/base_module_uninstall.py b/odoo/addons/base/module/wizard/base_module_uninstall.py
new file mode 100644
index 00000000000..1168e57341c
--- /dev/null
+++ b/odoo/addons/base/module/wizard/base_module_uninstall.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+
+
+class BaseModuleUninstall(models.TransientModel):
+ _name = "base.module.uninstall"
+ _description = "Module Uninstallation"
+
+ show_all = fields.Boolean()
+ module_id = fields.Many2one('ir.module.module', string="Module", required=True,
+ domain=[('state', 'in', ['installed', 'to upgrade', 'to install'])])
+ module_ids = fields.Many2many('ir.module.module', string="Impacted modules",
+ compute='_compute_module_ids')
+ model_ids = fields.Many2many('ir.model', string="Impacted data models",
+ compute='_compute_model_ids')
+
+ def _get_modules(self):
+ """ Return all the modules impacted by self. """
+ return self.module_id.downstream_dependencies(self.module_id)
+
+ @api.depends('module_id', 'show_all')
+ def _compute_module_ids(self):
+ for wizard in self:
+ modules = wizard._get_modules()
+ wizard.module_ids = modules if wizard.show_all else modules.filtered('application')
+
+ def _get_models(self):
+ """ Return the models (ir.model) to consider for the impact. """
+ return self.env['ir.model'].search([('transient', '=', False)])
+
+ @api.depends('module_ids')
+ def _compute_model_ids(self):
+ ir_models = self._get_models()
+ ir_models_xids = ir_models._get_external_ids()
+ for wizard in self:
+ if wizard.module_id:
+ module_names = set(wizard._get_modules().mapped('name'))
+ # find the models that have all their XIDs in the given modules
+ def lost(model):
+ return all(xid.split('.')[0] in module_names
+ for xid in ir_models_xids.get(model.id, ()))
+ self.model_ids = ir_models.filtered(lost).sorted('name')
+
+ @api.onchange('module_id')
+ def _onchange_module_id(self):
+ # if we select a technical module, show technical modules by default
+ if not self.module_id.application:
+ self.show_all = True
+
+ @api.multi
+ def action_uninstall(self):
+ modules = self.mapped('module_id')
+ return modules.button_immediate_uninstall()