From 9e63f90527860f7c157e3721375f3680a8500029 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Sat, 22 Sep 2018 03:28:30 +0200 Subject: [PATCH] [IMP] account_chart_update: Include field selection With this option, you can select which fields do you want to compare for updating. Use case: you have specific accounts in taxes, and you don't want to lose them, but you want to update their groups through the wizard. Before this, the update was all or nothing. Now, you have total control! --- account_chart_update/__init__.py | 4 +- account_chart_update/__manifest__.py | 2 +- .../i18n/account_chart_update.pot | 67 +++++++++++++---- account_chart_update/models/__init__.py | 4 + .../models/ir_model_fields.py | 20 +++++ .../tests/test_account_chart_update.py | 40 +++++++++- .../wizard/wizard_chart_update.py | 69 +++++++++++++++++- .../wizard/wizard_chart_update_view.xml | 73 ++++++++++++++----- 8 files changed, 238 insertions(+), 41 deletions(-) create mode 100644 account_chart_update/models/__init__.py create mode 100644 account_chart_update/models/ir_model_fields.py diff --git a/account_chart_update/__init__.py b/account_chart_update/__init__.py index bdf9279b..4d7a49b5 100644 --- a/account_chart_update/__init__.py +++ b/account_chart_update/__init__.py @@ -1,6 +1,4 @@ -# © 2010 Zikzakmedia S.L. (http://www.zikzakmedia.com) -# © 2010 Pexego Sistemas Informáticos S.L.(http://www.pexego.es) -# © 2016 Jairo Llopis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from . import models from . import wizard diff --git a/account_chart_update/__manifest__.py b/account_chart_update/__manifest__.py index 54aa9588..07708d61 100644 --- a/account_chart_update/__manifest__.py +++ b/account_chart_update/__manifest__.py @@ -8,7 +8,7 @@ { 'name': "Detect changes and update the Account Chart from a template", "summary": "Wizard to update a company's account chart from a template", - 'version': "11.0.1.0.1", + 'version': "11.0.1.1.0", 'author': "Tecnativa, " "BCIM, " "Okia, " diff --git a/account_chart_update/i18n/account_chart_update.pot b/account_chart_update/i18n/account_chart_update.pot index 1747ebb6..fa0f6f94 100644 --- a/account_chart_update/i18n/account_chart_update.pot +++ b/account_chart_update/i18n/account_chart_update.pot @@ -23,6 +23,11 @@ msgstr "" msgid " or " msgstr "" +#. module: account_chart_update +#: model:ir.model.fields,field_description:account_chart_update.field_wizard_update_charts_accounts_account_field_ids +msgid "Account fields" +msgstr "" + #. module: account_chart_update #: model:ir.model.fields,field_description:account_chart_update.field_wizard_update_charts_accounts_account_account_id msgid "Account template" @@ -85,7 +90,7 @@ msgid "Create/Update" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:616 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:679 #, python-format msgid "Created account %s." msgstr "" @@ -107,19 +112,19 @@ msgid "Created on" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:717 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:780 #, python-format msgid "Created or updated fiscal position %s." msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:583 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:646 #, python-format msgid "Created tax %s." msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:578 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:641 #, python-format msgid "Deactivated tax %s." msgstr "" @@ -135,7 +140,7 @@ msgid "Determines where the tax is selectable. Note : 'None' means a tax can't b msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:453 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:516 #, python-format msgid "Differences in these fields: %s." msgstr "" @@ -149,13 +154,13 @@ msgid "Display Name" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:625 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:688 #, python-format msgid "Exception creating account %s." msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:647 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:710 #, python-format msgid "Exception writing account %s." msgstr "" @@ -175,6 +180,21 @@ msgstr "" msgid "Existing taxes are updated. Taxes are searched by name." msgstr "" +#. module: account_chart_update +#: model:ir.ui.view,arch_db:account_chart_update.view_update_multi_chart +msgid "Field options" +msgstr "" + +#. module: account_chart_update +#: model:ir.model,name:account_chart_update.model_ir_model_fields +msgid "Fields" +msgstr "" + +#. module: account_chart_update +#: model:ir.model.fields,field_description:account_chart_update.field_wizard_update_charts_accounts_fp_field_ids +msgid "Fiscal position fields" +msgstr "" + #. module: account_chart_update #: model:ir.model.fields,field_description:account_chart_update.field_wizard_update_charts_accounts_fiscal_position_fiscal_position_id msgid "Fiscal position template" @@ -201,6 +221,16 @@ msgstr "" msgid "For records searched by name (taxes, fiscal positions), the template name will be matched against the record name on this language." msgstr "" +#. module: account_chart_update +#: model:ir.ui.view,arch_db:account_chart_update.view_update_multi_chart +msgid "General options" +msgstr "" + +#. module: account_chart_update +#: model:ir.ui.view,arch_db:account_chart_update.view_update_multi_chart +msgid "Here you can select the fields you want to check if they have been updated in the templates." +msgstr "" + #. module: account_chart_update #: model:ir.model.fields,field_description:account_chart_update.field_wizard_update_charts_accounts_account_id #: model:ir.model.fields,field_description:account_chart_update.field_wizard_update_charts_accounts_fiscal_position_id @@ -264,7 +294,7 @@ msgid "Messages and Errors" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:477 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:540 #, python-format msgid "Name or description not found." msgstr "" @@ -297,13 +327,13 @@ msgid "Next" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:520 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:583 #, python-format msgid "No account found with this code." msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:554 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:617 #, python-format msgid "No fiscal position found with this name." msgstr "" @@ -326,7 +356,7 @@ msgid "Notes" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:245 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:296 #, python-format msgid "One or more errors detected!\n" "\n" @@ -339,7 +369,7 @@ msgid "Other options" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:670 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:733 #, python-format msgid "Post-updated tax %s." msgstr "" @@ -390,7 +420,12 @@ msgid "Tax Scope" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:458 +#: model:ir.model.fields,field_description:account_chart_update.field_wizard_update_charts_accounts_tax_field_ids +msgid "Tax fields" +msgstr "" + +#. module: account_chart_update +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:521 #, python-format msgid "Tax is disabled." msgstr "" @@ -427,7 +462,7 @@ msgid "This wizard will update your accounts, taxes and fiscal positions accordi msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:504 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:567 #, python-format msgid "To deactivate: not in the template" msgstr "" @@ -487,7 +522,7 @@ msgid "Update taxes" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:638 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:701 #, python-format msgid "Updated account %s." msgstr "" @@ -503,7 +538,7 @@ msgid "Updated fiscal positions" msgstr "" #. module: account_chart_update -#: code:addons/account_chart_update/wizard/wizard_chart_update.py:591 +#: code:addons/account_chart_update/wizard/wizard_chart_update.py:654 #, python-format msgid "Updated tax %s." msgstr "" diff --git a/account_chart_update/models/__init__.py b/account_chart_update/models/__init__.py new file mode 100644 index 00000000..66c44ea1 --- /dev/null +++ b/account_chart_update/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import ir_model_fields diff --git a/account_chart_update/models/ir_model_fields.py b/account_chart_update/models/ir_model_fields.py new file mode 100644 index 00000000..54aa7664 --- /dev/null +++ b/account_chart_update/models/ir_model_fields.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class IrModelFields(models.Model): + _inherit = 'ir.model.fields' + + def name_get(self): + """Return special label when showing fields in chart update wizard.""" + if self.env.context.get('account_chart_update'): + res = [] + for record in self: + res.append((record.id, "%s (%s)" % ( + record.field_description, record.name, + ))) + return res + return super(IrModelFields, self).name_get() diff --git a/account_chart_update/tests/test_account_chart_update.py b/account_chart_update/tests/test_account_chart_update.py index 553be153..7b2c4b63 100644 --- a/account_chart_update/tests/test_account_chart_update.py +++ b/account_chart_update/tests/test_account_chart_update.py @@ -135,9 +135,21 @@ class TestAccountChartUpdate(common.HttpCase): @mute_logger('odoo.sql_db') def test_chart_update(self): - # Test no changes wizard = self.wizard_obj.create(self.wizard_vals) wizard.action_find_records() + # Test ir.model.fields name_get + field = wizard.fp_field_ids[:1] + name = field.with_context(account_chart_update=True).name_get()[0] + self.assertEqual(name[0], field.id) + self.assertEqual( + name[1], "%s (%s)" % (field.field_description, field.name), + ) + name = field.name_get()[0] + self.assertEqual(name[0], field.id) + self.assertEqual( + name[1], "%s (%s)" % (field.field_description, field.model), + ) + # Test no changes self.assertEqual(wizard.state, 'ready') self.assertFalse(wizard.tax_ids) self.assertFalse(wizard.account_ids) @@ -254,6 +266,32 @@ class TestAccountChartUpdate(common.HttpCase): self.assertEqual(self.fp.account_ids.account_dest_id, new_account) self.assertEqual(self.fp.tax_ids.tax_dest_id, self.tax) wizard.unlink() + # Exclude fields from check + self.tax_template.description = "Test description 2" + self.account_template.name = "Other name 2" + self.fp_template.note = "Test note 2" + wizard = self.wizard_obj.create(self.wizard_vals) + wizard.action_find_records() + wizard.tax_field_ids -= self.env['ir.model.fields'].search([ + ('model', '=', 'account.tax.template'), + ('name', '=', 'description'), + ]) + wizard.account_field_ids -= self.env['ir.model.fields'].search([ + ('model', '=', 'account.account.template'), + ('name', '=', 'name'), + ]) + wizard.fp_field_ids -= self.env['ir.model.fields'].search([ + ('model', '=', 'account.fiscal.position.template'), + ('name', '=', 'note'), + ]) + wizard.action_find_records() + self.assertFalse(wizard.tax_ids) + self.assertFalse(wizard.account_ids) + self.assertFalse(wizard.fiscal_position_ids) + self.tax_template.description = "Test description" + self.account_template.name = "Other name" + self.fp_template.note = "Test note" + wizard.unlink() # Remove objects new_tax_tmpl.unlink() wizard = self.wizard_obj.create(self.wizard_vals) diff --git a/account_chart_update/wizard/wizard_chart_update.py b/account_chart_update/wizard/wizard_chart_update.py index c164ec12..f5693b47 100644 --- a/account_chart_update/wizard/wizard_chart_update.py +++ b/account_chart_update/wizard/wizard_chart_update.py @@ -96,6 +96,57 @@ class WizardUpdateChartsAccounts(models.TransientModel): string='Deactivated taxes', compute="_compute_deleted_taxes_count") log = fields.Text(string='Messages and Errors', readonly=True) + tax_field_ids = fields.Many2many( + comodel_name="ir.model.fields", + relation="wizard_update_charts_tax_fields_rel", + string="Tax fields", + domain=lambda self: self._domain_tax_field_ids(), + default=lambda self: self._default_tax_field_ids(), + ) + account_field_ids = fields.Many2many( + comodel_name="ir.model.fields", + relation="wizard_update_charts_account_fields_rel", + string="Account fields", + domain=lambda self: self._domain_account_field_ids(), + default=lambda self: self._default_account_field_ids(), + ) + fp_field_ids = fields.Many2many( + comodel_name="ir.model.fields", + relation="wizard_update_charts_fp_fields_rel", + string="Fiscal position fields", + domain=lambda self: self._domain_fp_field_ids(), + default=lambda self: self._default_fp_field_ids(), + ) + + def _domain_per_name(self, name): + return [ + ('model', '=', name), + ('name', 'not in', tuple(self.fields_to_ignore(name))), + ] + + def _domain_tax_field_ids(self): + return self._domain_per_name('account.tax.template') + + def _domain_account_field_ids(self): + return self._domain_per_name('account.account.template') + + def _domain_fp_field_ids(self): + return self._domain_per_name('account.fiscal.position.template') + + def _default_tax_field_ids(self): + return [(4, x.id) for x in self.env['ir.model.fields'].search( + self._domain_tax_field_ids() + )] + + def _default_account_field_ids(self): + return [(4, x.id) for x in self.env['ir.model.fields'].search( + self._domain_account_field_ids() + )] + + def _default_fp_field_ids(self): + return [(4, x.id) for x in self.env['ir.model.fields'].search( + self._domain_fp_field_ids() + )] @api.model def _get_lang_selection_options(self): @@ -355,7 +406,7 @@ class WizardUpdateChartsAccounts(models.TransientModel): @api.model @tools.ormcache("name") - def fields_to_ignore(self, template, name): + def fields_to_ignore(self, name): """Get fields that will not be used when checking differences. :param str template: A template record. @@ -364,11 +415,16 @@ class WizardUpdateChartsAccounts(models.TransientModel): """ specials_mapping = { "account.tax.template": { + "chart_template_id", "children_tax_ids", }, "account.account.template": { + "chart_template_id", "code", }, + "account.fiscal.position.template": { + "chart_template_id", + }, } specials = ({"display_name", "__last_update", "company_id"} | specials_mapping.get(name, set())) @@ -387,9 +443,16 @@ class WizardUpdateChartsAccounts(models.TransientModel): Fields that are different in both records, and the expected value. """ result = dict() - ignore = self.fields_to_ignore(template, template._name) + ignore = self.fields_to_ignore(template._name) + to_include = [] + if template._name == 'account.tax.template': + to_include = self.tax_field_ids.mapped('name') + elif template._name == 'account.account.template': + to_include = self.account_field_ids.mapped('name') + elif template._name == 'account.fiscal.position.template': + to_include = self.fp_field_ids.mapped('name') for key, field in template._fields.items(): - if key in ignore: + if key in ignore or key not in to_include: continue expected = t = None # Translate template records to reals for comparison diff --git a/account_chart_update/wizard/wizard_chart_update_view.xml b/account_chart_update/wizard/wizard_chart_update_view.xml index a9fc794c..94bf2c59 100644 --- a/account_chart_update/wizard/wizard_chart_update_view.xml +++ b/account_chart_update/wizard/wizard_chart_update_view.xml @@ -32,23 +32,62 @@ /> - - - - - - - - - - - - -
-

If you leave these options set, the wizard will not just create new records, but also update records with changes (i.e. different tax amount)

-

Note: Only the changed fields are updated.

-
-
+ + + + + + + + + + + + + +
+

If you leave these options set, the wizard will not just create new records, but also update records with changes (i.e. different tax amount)

+

Note: Only the changed fields are updated.

+
+
+
+ +

+

Here you can select the fields you want to check if they have been updated in the templates.

+

+ + + + + + + + + + + +
+