From 8fc7d87806c17b7968858a732850070d8b74459e Mon Sep 17 00:00:00 2001 From: Telmo Santos Date: Wed, 6 Jan 2021 15:19:29 +0100 Subject: [PATCH] [IMP] module_analysis: black, isort, prettier --- module_analysis/__init__.py | 2 +- module_analysis/__manifest__.py | 46 ++++--- module_analysis/data/ir_config_parameter.xml | 8 +- module_analysis/data/ir_module_type.xml | 8 +- module_analysis/data/ir_module_type_rule.xml | 25 ++-- module_analysis/models/base_module_update.py | 10 +- module_analysis/models/ir_module_author.py | 29 +++-- module_analysis/models/ir_module_module.py | 112 ++++++++---------- module_analysis/models/ir_module_type.py | 25 ++-- module_analysis/models/ir_module_type_rule.py | 18 +-- module_analysis/post_init_hook.py | 7 +- module_analysis/readme/USAGE.rst | 1 - module_analysis/tests/test_module.py | 21 ++-- module_analysis/views/menu.xml | 33 +++--- .../views/view_base_module_update.xml | 11 +- .../views/view_ir_module_author.xml | 35 +++--- .../views/view_ir_module_module.xml | 55 ++++----- module_analysis/views/view_ir_module_type.xml | 32 ++--- .../views/view_ir_module_type_rule.xml | 24 ++-- 19 files changed, 242 insertions(+), 260 deletions(-) diff --git a/module_analysis/__init__.py b/module_analysis/__init__.py index 9f5fd1d3b..de739ca37 100644 --- a/module_analysis/__init__.py +++ b/module_analysis/__init__.py @@ -1,2 +1,2 @@ from . import models -from . post_init_hook import analyse_installed_modules +from .post_init_hook import analyse_installed_modules diff --git a/module_analysis/__manifest__.py b/module_analysis/__manifest__.py index fbe44c2e6..5eaf3f85e 100644 --- a/module_analysis/__manifest__.py +++ b/module_analysis/__manifest__.py @@ -3,32 +3,28 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { - 'name': "Module Analysis", - 'summary': "Add analysis tools regarding installed modules" + "name": "Module Analysis", + "summary": "Add analysis tools regarding installed modules" " to know which installed modules comes from Odoo Core, OCA, or are" " custom modules", - 'author': 'GRAP, Odoo Community Association (OCA)', - 'website': "https://github.com/OCA/server-tools/", - 'version': '12.0.1.0.0', - 'license': 'AGPL-3', - 'depends': [ - 'base', + "author": "GRAP, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/server-tools/", + "version": "12.0.1.0.0", + "license": "AGPL-3", + "depends": ["base",], + "data": [ + "security/ir.model.access.csv", + "views/menu.xml", + "views/view_base_module_update.xml", + "views/view_ir_module_author.xml", + "views/view_ir_module_type.xml", + "views/view_ir_module_type_rule.xml", + "views/view_ir_module_module.xml", + "data/ir_config_parameter.xml", + "data/ir_module_type.xml", + "data/ir_module_type_rule.xml", ], - 'data': [ - 'security/ir.model.access.csv', - 'views/menu.xml', - 'views/view_base_module_update.xml', - 'views/view_ir_module_author.xml', - 'views/view_ir_module_type.xml', - 'views/view_ir_module_type_rule.xml', - 'views/view_ir_module_module.xml', - 'data/ir_config_parameter.xml', - 'data/ir_module_type.xml', - 'data/ir_module_type_rule.xml', - ], - 'external_dependencies': { - 'python': ['pygount'], - }, - 'post_init_hook': 'analyse_installed_modules', - 'installable': True, + "external_dependencies": {"python": ["pygount"],}, + "post_init_hook": "analyse_installed_modules", + "installable": True, } diff --git a/module_analysis/data/ir_config_parameter.xml b/module_analysis/data/ir_config_parameter.xml index 337ff4ab4..a5ab19622 100644 --- a/module_analysis/data/ir_config_parameter.xml +++ b/module_analysis/data/ir_config_parameter.xml @@ -1,20 +1,16 @@ - - - - module_analysis.exclude_directories lib,demo,test,tests,doc,description - module_analysis.exclude_files __openerp__.py,__manifest__.py - diff --git a/module_analysis/data/ir_module_type.xml b/module_analysis/data/ir_module_type.xml index 3e5e7a40d..3bc2193c4 100644 --- a/module_analysis/data/ir_module_type.xml +++ b/module_analysis/data/ir_module_type.xml @@ -1,18 +1,14 @@ - - - - Odoo Core - OCA - diff --git a/module_analysis/data/ir_module_type_rule.xml b/module_analysis/data/ir_module_type_rule.xml index 7e95e8e79..a789bf183 100644 --- a/module_analysis/data/ir_module_type_rule.xml +++ b/module_analysis/data/ir_module_type_rule.xml @@ -1,42 +1,37 @@ - - - - 1 [('author_ids', 'ilike', 'Odoo S.A')] - + - 2 [('author_ids', 'ilike', 'OpenERP SA')] - + - 3 [('author_ids', '=', 'Odoo SA')] - + - 4 [('author_ids', '=', 'Odoo')] - + - 100 - [('author_ids', '=', 'Odoo Community Association (OCA)')] - + [('author_ids', '=', 'Odoo Community Association (OCA)')] + - diff --git a/module_analysis/models/base_module_update.py b/module_analysis/models/base_module_update.py index 9a884de13..5c6ebafa0 100644 --- a/module_analysis/models/base_module_update.py +++ b/module_analysis/models/base_module_update.py @@ -6,13 +6,15 @@ from odoo import api, fields, models class BaseModuleUpdate(models.TransientModel): - _inherit = 'base.module.update' + _inherit = "base.module.update" analyse_installed_modules = fields.Boolean( - string='Analyse Installed Modules', default=True) + string="Analyse Installed Modules", default=True + ) @api.multi def update_module(self): - return super(BaseModuleUpdate, self.with_context( - analyse_installed_modules=self.analyse_installed_modules) + return super( + BaseModuleUpdate, + self.with_context(analyse_installed_modules=self.analyse_installed_modules), ).update_module() diff --git a/module_analysis/models/ir_module_author.py b/module_analysis/models/ir_module_author.py index 160d098ad..dbc788bcf 100644 --- a/module_analysis/models/ir_module_author.py +++ b/module_analysis/models/ir_module_author.py @@ -6,34 +6,41 @@ from odoo import api, fields, models class IrModuleAuthor(models.Model): - _name = 'ir.module.author' - _description = 'Modules Authors' + _name = "ir.module.author" + _description = "Modules Authors" - name = fields.Char(string='Name', required=True) + name = fields.Char(string="Name", required=True) installed_module_ids = fields.Many2many( - string='Modules', comodel_name='ir.module.module', - relation='ir_module_module_author_rel') + string="Modules", + comodel_name="ir.module.module", + relation="ir_module_module_author_rel", + ) installed_module_qty = fields.Integer( string="Installed Modules Quantity", - compute='_compute_installed_module_qty', store=True) + compute="_compute_installed_module_qty", + store=True, + ) _sql_constraints = [ - ('name_uniq', 'unique(name)', - 'The name of the modules author should be unique per database!'), + ( + "name_uniq", + "unique(name)", + "The name of the modules author should be unique per database!", + ), ] @api.multi - @api.depends('installed_module_ids') + @api.depends("installed_module_ids") def _compute_installed_module_qty(self): for author in self: author.installed_module_qty = len(author.installed_module_ids) @api.model def _get_or_create(self, name): - authors = self.search([('name', '=', name)]) + authors = self.search([("name", "=", name)]) if authors: return authors[0] else: - return self.create({'name': name}) + return self.create({"name": name}) diff --git a/module_analysis/models/ir_module_module.py b/module_analysis/models/ir_module_module.py index b59dc299b..9bc9083fa 100644 --- a/module_analysis/models/ir_module_module.py +++ b/module_analysis/models/ir_module_module.py @@ -2,39 +2,40 @@ # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import os -import pygount -from pathlib import Path import logging +import os +from pathlib import Path + +import pygount from odoo import api, fields, models -from odoo.tools.safe_eval import safe_eval from odoo.modules.module import get_module_path +from odoo.tools.safe_eval import safe_eval _logger = logging.getLogger(__name__) class IrModuleModule(models.Model): - _inherit = 'ir.module.module' + _inherit = "ir.module.module" author_ids = fields.Many2many( - string='Authors', comodel_name='ir.module.author', readonly=True, - relation='ir_module_module_author_rel') + string="Authors", + comodel_name="ir.module.author", + readonly=True, + relation="ir_module_module_author_rel", + ) module_type_id = fields.Many2one( - string='Module Type', comodel_name='ir.module.type', readonly=True) + string="Module Type", comodel_name="ir.module.type", readonly=True + ) - python_code_qty = fields.Integer( - string='Python Code Quantity', readonly=True) + python_code_qty = fields.Integer(string="Python Code Quantity", readonly=True) - xml_code_qty = fields.Integer( - string='XML Code Quantity', readonly=True) + xml_code_qty = fields.Integer(string="XML Code Quantity", readonly=True) - js_code_qty = fields.Integer( - string='JS Code Quantity', readonly=True) + js_code_qty = fields.Integer(string="JS Code Quantity", readonly=True) - css_code_qty = fields.Integer( - string='CSS Code Quantity', readonly=True) + css_code_qty = fields.Integer(string="CSS Code Quantity", readonly=True) # Overloadable Section @api.model @@ -51,76 +52,69 @@ class IrModuleModule(models.Model): field_name: Odoo field name to store the analysis """ return { - '.py': { - 'code': 'python_code_qty', - }, - '.xml': { - 'code': 'xml_code_qty', - }, - '.js': { - 'code': 'js_code_qty', - }, - '.css': { - 'code': 'css_code_qty', - }, + ".py": {"code": "python_code_qty",}, + ".xml": {"code": "xml_code_qty",}, + ".js": {"code": "js_code_qty",}, + ".css": {"code": "css_code_qty",}, } @api.model def _get_clean_analyse_values(self): """List of fields to unset when a module is uninstalled""" return { - 'author_ids': [6, 0, []], - 'module_type_id': False, - 'python_code_qty': False, - 'xml_code_qty': 0, - 'js_code_qty': 0, - 'css_code_qty': 0, + "author_ids": [6, 0, []], + "module_type_id": False, + "python_code_qty": False, + "xml_code_qty": 0, + "js_code_qty": 0, + "css_code_qty": 0, } @api.model def _get_module_encoding(self, file_ext): - return 'utf-8' + return "utf-8" # Overload Section @api.model def update_list(self): res = super().update_list() - if self.env.context.get('analyse_installed_modules', False): - self.search([('state', '=', 'installed')]).button_analyse_code() + if self.env.context.get("analyse_installed_modules", False): + self.search([("state", "=", "installed")]).button_analyse_code() return res @api.multi def write(self, vals): res = super().write(vals) - if vals.get('state', False) == 'installed': + if vals.get("state", False) == "installed": self.button_analyse_code() - elif vals.get('state', False) == 'uninstalled'\ - and 'module_analysis' not in [x.name for x in self]: + elif vals.get("state", False) == "uninstalled" and "module_analysis" not in [ + x.name for x in self + ]: self.write(self._get_clean_analyse_values()) return res # Public Section @api.multi def button_analyse_code(self): - IrModuleAuthor = self.env['ir.module.author'] - IrModuleTypeRule = self.env['ir.module.type.rule'] + IrModuleAuthor = self.env["ir.module.author"] + IrModuleTypeRule = self.env["ir.module.type.rule"] rules = IrModuleTypeRule.search([]) - cfg = self.env['ir.config_parameter'] - val = cfg.get_param('module_analysis.exclude_directories', '') - exclude_directories = [x.strip() for x in val.split(',') if x.strip()] - val = cfg.get_param('module_analysis.exclude_files', '') - exclude_files = [x.strip() for x in val.split(',') if x.strip()] + cfg = self.env["ir.config_parameter"] + val = cfg.get_param("module_analysis.exclude_directories", "") + exclude_directories = [x.strip() for x in val.split(",") if x.strip()] + val = cfg.get_param("module_analysis.exclude_files", "") + exclude_files = [x.strip() for x in val.split(",") if x.strip()] for module in self: _logger.info("Analysing Code for module %s ..." % (module.name)) # Update Authors, based on manifest key authors = [] - if module.author and module.author[0] == '[': + if module.author and module.author[0] == "[": author_txt_list = safe_eval(module.author) else: - author_txt_list = module.author.split(',') + author_txt_list = module.author.split(",") author_txt_list = [x.strip() for x in author_txt_list] author_txt_list = [x for x in author_txt_list if x] @@ -141,27 +135,28 @@ class IrModuleModule(models.Model): analysed_datas = self._get_analyse_data_dict() file_extensions = analysed_datas.keys() file_list = self._get_files_to_analyse( - module_path, file_extensions, exclude_directories, - exclude_files) + module_path, file_extensions, exclude_directories, exclude_files + ) for file_path, file_ext in file_list: file_res = pygount.source_analysis( - file_path, '', - encoding=self._get_module_encoding(file_ext)) + file_path, "", encoding=self._get_module_encoding(file_ext) + ) for k, v in analysed_datas.get(file_ext).items(): - v['value'] += getattr(file_res, k) + v["value"] += getattr(file_res, k) # Update the module with the datas values = {} for file_ext, analyses in analysed_datas.items(): for k, v in analyses.items(): - values[v['field']] = v['value'] + values[v["field"]] = v["value"] module.write(values) # Custom Section @api.model def _get_files_to_analyse( - self, path, file_extensions, exclude_directories, exclude_files): + self, path, file_extensions, exclude_directories, exclude_files + ): res = [] for root, dirs, files in os.walk(path, followlinks=True): if set(Path(root).parts) & set(exclude_directories): @@ -179,8 +174,5 @@ class IrModuleModule(models.Model): res_dict = self._get_analyse_settings().copy() for file_ext, analyse_dict in res_dict.items(): for analyse_type, v in analyse_dict.items(): - analyse_dict[analyse_type] = { - 'field': v, - 'value': 0 - } + analyse_dict[analyse_type] = {"field": v, "value": 0} return res_dict diff --git a/module_analysis/models/ir_module_type.py b/module_analysis/models/ir_module_type.py index 0a59a3d1b..9bbecbacd 100644 --- a/module_analysis/models/ir_module_type.py +++ b/module_analysis/models/ir_module_type.py @@ -6,25 +6,26 @@ from odoo import api, fields, models class IrModuleType(models.Model): - _name = 'ir.module.type' - _description = 'Modules Types' - _order = 'sequence' + _name = "ir.module.type" + _description = "Modules Types" + _order = "sequence" - name = fields.Char(string='Name', required=True) + name = fields.Char(string="Name", required=True) - sequence = fields.Integer(string='Sequence') + sequence = fields.Integer(string="Sequence") installed_module_ids = fields.One2many( - string='Installed Modules', comodel_name='ir.module.module', - inverse_name='module_type_id') + string="Installed Modules", + comodel_name="ir.module.module", + inverse_name="module_type_id", + ) installed_module_qty = fields.Integer( - string='Modules Quantity', compute='_compute_installed_module_qty', - store=True) + string="Modules Quantity", compute="_compute_installed_module_qty", store=True + ) @api.multi - @api.depends('installed_module_ids.module_type_id') + @api.depends("installed_module_ids.module_type_id") def _compute_installed_module_qty(self): for module_type in self: - module_type.installed_module_qty = len( - module_type.installed_module_ids) + module_type.installed_module_qty = len(module_type.installed_module_ids) diff --git a/module_analysis/models/ir_module_type_rule.py b/module_analysis/models/ir_module_type_rule.py index d74a341cb..cd8f93b64 100644 --- a/module_analysis/models/ir_module_type_rule.py +++ b/module_analysis/models/ir_module_type_rule.py @@ -7,24 +7,24 @@ from odoo.tools.safe_eval import safe_eval class IrModuleType(models.Model): - _name = 'ir.module.type.rule' - _description = 'Modules Types Rules' - _order = 'sequence' + _name = "ir.module.type.rule" + _description = "Modules Types Rules" + _order = "sequence" - sequence = fields.Integer(string='Sequence') + sequence = fields.Integer(string="Sequence") - module_domain = fields.Char( - string='Module Domain', required=True, default='[]') + module_domain = fields.Char(string="Module Domain", required=True, default="[]") module_type_id = fields.Many2one( - string='Module type', comodel_name='ir.module.type', required=True) + string="Module type", comodel_name="ir.module.type", required=True + ) @api.multi def _get_module_type_id_from_module(self, module): - IrModuleModule = self.env['ir.module.module'] + IrModuleModule = self.env["ir.module.module"] for rule in self: domain = safe_eval(rule.module_domain) - domain.append(('id', '=', module.id)) + domain.append(("id", "=", module.id)) if IrModuleModule.search(domain): return rule.module_type_id.id return False diff --git a/module_analysis/post_init_hook.py b/module_analysis/post_init_hook.py index 5f9a882e8..d55fbec47 100644 --- a/module_analysis/post_init_hook.py +++ b/module_analysis/post_init_hook.py @@ -2,12 +2,13 @@ # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import api, SUPERUSER_ID +from odoo import SUPERUSER_ID, api def analyse_installed_modules(cr, registry): with api.Environment.manage(): env = api.Environment(cr, SUPERUSER_ID, {}) - installed_modules = env['ir.module.module'].search( - [('state', '=', 'installed')]) + installed_modules = env["ir.module.module"].search( + [("state", "=", "installed")] + ) installed_modules.button_analyse_code() diff --git a/module_analysis/readme/USAGE.rst b/module_analysis/readme/USAGE.rst index 2676bb76c..eea896d0f 100644 --- a/module_analysis/readme/USAGE.rst +++ b/module_analysis/readme/USAGE.rst @@ -5,4 +5,3 @@ Open the stats to analyse the detail of the code installed .. image:: ../static/description/analysis_pivot.png .. image:: ../static/description/analysis_pie.png - diff --git a/module_analysis/tests/test_module.py b/module_analysis/tests/test_module.py index 66bc5a017..c481420a2 100644 --- a/module_analysis/tests/test_module.py +++ b/module_analysis/tests/test_module.py @@ -7,27 +7,26 @@ from odoo.tests.common import TransactionCase, post_install @post_install(True) class TestModule(TransactionCase): - def setUp(self): super().setUp() - self.IrModuleModule = self.env['ir.module.module'] + self.IrModuleModule = self.env["ir.module.module"] def test_installed_modules(self): - installed_modules = self.IrModuleModule.search( - [('state', '=', 'installed')]) + installed_modules = self.IrModuleModule.search([("state", "=", "installed")]) for module in installed_modules: self.assertTrue( - module.python_code_qty > 0 or - module.xml_code_qty > 0 or - module.js_code_qty > 0, + module.python_code_qty > 0 + or module.xml_code_qty > 0 + or module.js_code_qty > 0, "module '%s' doesn't have code analysed defined, whereas it is" - " installed." % (module.name)) + " installed." % (module.name), + ) def test_uninstalled_modules(self): - uninstalled_modules = self.IrModuleModule.search( - [('state', '!=', 'installed')]) + uninstalled_modules = self.IrModuleModule.search([("state", "!=", "installed")]) for module in uninstalled_modules: self.assertTrue( module.python_code_qty == 0, "module '%s' has python lines defined, whereas it is" - " not installed." % (module.name)) + " not installed." % (module.name), + ) diff --git a/module_analysis/views/menu.xml b/module_analysis/views/menu.xml index 70afacfdf..97c906349 100644 --- a/module_analysis/views/menu.xml +++ b/module_analysis/views/menu.xml @@ -1,24 +1,27 @@ - - - - - - - + - - + - - + parent="menu_module_analysis" + sequence="20" + /> diff --git a/module_analysis/views/view_base_module_update.xml b/module_analysis/views/view_base_module_update.xml index 68182a227..bdd9e19c1 100644 --- a/module_analysis/views/view_base_module_update.xml +++ b/module_analysis/views/view_base_module_update.xml @@ -1,20 +1,17 @@ - - - - base.module.update - + - + - diff --git a/module_analysis/views/view_ir_module_author.xml b/module_analysis/views/view_ir_module_author.xml index 67df118e1..95f970372 100644 --- a/module_analysis/views/view_ir_module_author.xml +++ b/module_analysis/views/view_ir_module_author.xml @@ -1,40 +1,39 @@ - - - - ir.module.author
-
-

+
+
+

+ +

- +
- - ir.module.author - - + + - Modules Authors ir.actions.act_window @@ -42,11 +41,11 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). form tree,form - - - - + groups="base.group_no_one" + />
diff --git a/module_analysis/views/view_ir_module_module.xml b/module_analysis/views/view_ir_module_module.xml index 29baf1d01..e022472e5 100644 --- a/module_analysis/views/view_ir_module_module.xml +++ b/module_analysis/views/view_ir_module_module.xml @@ -1,55 +1,55 @@ - - - - ir.module.module - + -