From a9761578835226ab8df897b1ba397d8e6e85987d Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Wed, 9 Jul 2014 19:03:27 +0200 Subject: [PATCH] [ADD] new module 'module_parent_dependencies' --- module_parent_dependencies/__init__.py | 23 ++++++ module_parent_dependencies/__openerp__.py | 54 +++++++++++++ module_parent_dependencies/i18n/fr.po | 41 ++++++++++ module_parent_dependencies/model/__init__.py | 23 ++++++ .../model/ir_module_module.py | 72 ++++++++++++++++++ .../static/src/img/icon.png | Bin 0 -> 2177 bytes .../src/img/screenshots/dependencies_list.jpg | Bin 0 -> 82954 bytes module_parent_dependencies/tests/__init__.py | 24 ++++++ .../tests/test_module_parent_dependencies.py | 65 ++++++++++++++++ module_parent_dependencies/view/view.xml | 40 ++++++++++ 10 files changed, 342 insertions(+) create mode 100644 module_parent_dependencies/__init__.py create mode 100644 module_parent_dependencies/__openerp__.py create mode 100644 module_parent_dependencies/i18n/fr.po create mode 100644 module_parent_dependencies/model/__init__.py create mode 100755 module_parent_dependencies/model/ir_module_module.py create mode 100644 module_parent_dependencies/static/src/img/icon.png create mode 100644 module_parent_dependencies/static/src/img/screenshots/dependencies_list.jpg create mode 100644 module_parent_dependencies/tests/__init__.py create mode 100644 module_parent_dependencies/tests/test_module_parent_dependencies.py create mode 100644 module_parent_dependencies/view/view.xml diff --git a/module_parent_dependencies/__init__.py b/module_parent_dependencies/__init__.py new file mode 100644 index 000000000..ff4216998 --- /dev/null +++ b/module_parent_dependencies/__init__.py @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Module - Parent Dependencies module for Odoo +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import model diff --git a/module_parent_dependencies/__openerp__.py b/module_parent_dependencies/__openerp__.py new file mode 100644 index 000000000..da628ca3e --- /dev/null +++ b/module_parent_dependencies/__openerp__.py @@ -0,0 +1,54 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Module - Parent Dependencies module for Odoo +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + 'name': 'Parent Dependencies of Modules', + 'version': '0.1', + 'summary': 'Display the parent dependencies of a module', + 'category': 'Tools', + 'description': """ +Display the parent dependencies of a module +=========================================== + +Functionality: +-------------- + * This module display to the admin user, the possibility to see the list""" + """ of the modules that depends (directly or indirectly) on a module. + +Copyright, Authors and Licence: +------------------------------- + * Copyright: 2014, GRAP: Groupement Régional Alimentaire de Proximité; + * Author: Sylvain LE GAL (https://twitter.com/legalsylvain); + * Licence: AGPL-3 (http://www.gnu.org/licenses/);""", + 'author': 'GRAP', + 'website': 'http://www.grap.coop', + 'license': 'AGPL-3', + 'depends': [ + 'base', + ], + 'data': [ + 'view/view.xml', + ], + 'images': [ + 'static/src/img/screenshots/dependencies_list.jpg' + ], +} diff --git a/module_parent_dependencies/i18n/fr.po b/module_parent_dependencies/i18n/fr.po new file mode 100644 index 000000000..1649b2a64 --- /dev/null +++ b/module_parent_dependencies/i18n/fr.po @@ -0,0 +1,41 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * module_parent_dependencies +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-07-09 15:55+0000\n" +"PO-Revision-Date: 2014-07-09 15:55+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: module_parent_dependencies +#: view:ir.module.module:0 +#: field:ir.module.module,direct_parent_ids:0 +msgid "Direct Parent Modules" +msgstr "Modules Parents Directs" + +#. module: module_parent_dependencies +#: view:ir.module.module:0 +#: field:ir.module.module,all_parent_ids:0 +msgid "Direct and Indirect Parent Modules" +msgstr "Modules Parents Directs et Indirectes" + +#. module: module_parent_dependencies +#: code:_description:0 +#: model:ir.model,name:module_parent_dependencies.model_ir_module_module +#, python-format +msgid "Module" +msgstr "Module" + +#. module: module_parent_dependencies +#: view:ir.module.module:0 +msgid "Parent informations" +msgstr "Informations relatives aux modules parents" + diff --git a/module_parent_dependencies/model/__init__.py b/module_parent_dependencies/model/__init__.py new file mode 100644 index 000000000..9522bfc7e --- /dev/null +++ b/module_parent_dependencies/model/__init__.py @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Module - Parent Dependencies module for Odoo +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import ir_module_module diff --git a/module_parent_dependencies/model/ir_module_module.py b/module_parent_dependencies/model/ir_module_module.py new file mode 100755 index 000000000..c3a6e1941 --- /dev/null +++ b/module_parent_dependencies/model/ir_module_module.py @@ -0,0 +1,72 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Module - Parent Dependencies module for Odoo +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv.orm import Model +from openerp.osv import fields + + +class module(Model): + _inherit = 'ir.module.module' + + # Field function Section + def _get_all_parent_ids( + self, cr, uid, ids, field_name, arg, context=None): + res = self._get_direct_parent_ids( + cr, uid, ids, field_name, arg, context=context) + for id in ids: + parent_ids = list(res[id]) + undirect_parent_ids = self._get_all_parent_ids( + cr, uid, res[id], field_name, arg, context=context) + for parent_id in parent_ids: + res[id] += undirect_parent_ids[parent_id] + res[id] = list(set(res[id])) + return res + + def _get_direct_parent_ids( + self, cr, uid, ids, field_name, arg, context=None): + res = {} + imd_obj = self.pool['ir.module.module.dependency'] + for imm in self.browse(cr, uid, ids, context=context): + imd_ids = imd_obj.search( + cr, uid, [('name', '=', imm.name)], context=context) + tmp = imd_obj.read( + cr, uid, imd_ids, ['module_id'], context=context) + imm_ids = [x['module_id'][0] for x in tmp] + # Select only non uninstalled module + imm_ids = self.search( + cr, uid, [ + ('id', 'in', imm_ids), + ('state', 'not in', ['uninstalled', 'uninstallable'])], + context=context) + res[imm.id] = imm_ids + return res + + # Column Section + _columns = { + 'direct_parent_ids': fields.function( + _get_direct_parent_ids, type='many2many', + relation='ir.module.module', string='Direct Parent Modules'), + 'all_parent_ids': fields.function( + _get_all_parent_ids, type='many2many', + relation='ir.module.module', + string='Direct and Indirect Parent Modules'), + } diff --git a/module_parent_dependencies/static/src/img/icon.png b/module_parent_dependencies/static/src/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ee9cbdfa6cbaf385a03615c411e83241a1953752 GIT binary patch literal 2177 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. +# +############################################################################## + + +from . import test_module_parent_dependencies diff --git a/module_parent_dependencies/tests/test_module_parent_dependencies.py b/module_parent_dependencies/tests/test_module_parent_dependencies.py new file mode 100644 index 000000000..830eae660 --- /dev/null +++ b/module_parent_dependencies/tests/test_module_parent_dependencies.py @@ -0,0 +1,65 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Database Integrity module for OpenERP +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.tests.common import TransactionCase + + +class TestmoduleParentDependencies(TransactionCase): + """Tests for 'DataBase Integrity' Module""" + + def setUp(self): + super(TestmoduleParentDependencies, self).setUp() + self.im_obj = self.registry('ir.module.module') + + # Test Section + def test_01_direct_parent(self): + """Test if the compute of the field direct_parent_ids is correct.""" + cr, uid = self.cr, self.uid + # compute expected values + cr.execute("""SELECT module_id + FROM ir_module_module_dependency immd + INNER JOIN ir_module_module imm on imm.id = immd.module_id + WHERE immd.name='base' + AND imm.state not in ('uninstalled', 'uninstallable')""") + expected_parent_ids = [x[0] for x in cr.fetchall()] + + # Get values + base_id = self.im_obj.search(cr, uid, [('name', '=', 'base')]) + tmp = self.im_obj.browse( + cr, uid, base_id) + parent_ids = [x.id for x in tmp[0].direct_parent_ids] + + self.assertEqual( + sorted(parent_ids), sorted(expected_parent_ids), + "Incorrect computation of 'direct_parent_id's fields.") + + def test_02_all_parent(self): + """Test if the compute of the field direct_parent_ids doesn't crash.""" + cr, uid = self.cr, self.uid + base_id = self.im_obj.search(cr, uid, [('name', '=', 'base')]) + tmp = self.im_obj.browse( + cr, uid, base_id) + parent_ids = [x.id for x in tmp[0].all_parent_ids] + + self.assertNotEqual( + sorted(parent_ids), [], + "Incorrect computation of 'direct_parent_id's fields.") diff --git a/module_parent_dependencies/view/view.xml b/module_parent_dependencies/view/view.xml new file mode 100644 index 000000000..533dc0bf1 --- /dev/null +++ b/module_parent_dependencies/view/view.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + ir.module.module.form + ir.module.module + + + + + + + + + + + + + + +