server-tools/upgrade_analysis/models/comparison_config.py

89 lines
3.0 KiB
Python

# Copyright 2011-2015 Therp BV <https://therp.nl>
# Copyright 2016 Opener B.V. <https://opener.am>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from odoo import fields, models
from odoo.exceptions import UserError
from odoo.tools.translate import _
from ..lib import apriori
class OpenupgradeComparisonConfig(models.Model):
_name = "openupgrade.comparison.config"
_description = "OpenUpgrade Comparison Configuration"
name = fields.Char()
server = fields.Char(required=True)
port = fields.Integer(required=True, default=8069)
protocol = fields.Selection(
[("http://", "XML-RPC")],
# ('https://', 'XML-RPC Secure')], not supported by libopenerp
required=True,
default="http://",
)
database = fields.Char(required=True)
username = fields.Char(required=True)
password = fields.Char(required=True)
last_log = fields.Text()
def get_connection(self):
self.ensure_one()
import odoorpc
remote = odoorpc.ODOO(self.server, port=self.port)
remote.login(self.database, self.username, self.password)
return remote
def test_connection(self):
self.ensure_one()
try:
connection = self.get_connection()
user_model = connection.env["res.users"]
ids = user_model.search([("login", "=", "admin")])
user_info = user_model.read([ids[0]], ["name"])[0]
except Exception as e:
raise UserError(_("Connection failed.\n\nDETAIL: %s") % e)
raise UserError(_("%s is connected.") % user_info["name"])
def analyze(self):
""" Run the analysis wizard """
self.ensure_one()
wizard = self.env["openupgrade.analysis.wizard"].create(
{"server_config": self.id}
)
return {
"name": wizard._description,
"view_mode": "form",
"res_model": wizard._name,
"type": "ir.actions.act_window",
"target": "new",
"res_id": wizard.id,
"nodestroy": True,
}
def install_modules(self):
""" Install same modules as in source DB """
self.ensure_one()
connection = self.get_connection()
remote_module_obj = connection.env["ir.module.module"]
remote_module_ids = remote_module_obj.search([("state", "=", "installed")])
modules = []
for module_id in remote_module_ids:
mod = remote_module_obj.read([module_id], ["name"])[0]
mod_name = mod["name"]
mod_name = apriori.renamed_modules.get(mod_name, mod_name)
modules.append(mod_name)
_logger = logging.getLogger(__name__)
_logger.debug("remote modules %s", modules)
local_modules = self.env["ir.module.module"].search(
[("name", "in", modules), ("state", "=", "uninstalled")]
)
_logger.debug("local modules %s", ",".join(local_modules.mapped("name")))
if local_modules:
local_modules.write({"state": "to install"})
return {}