From 03673f36529a98515f18fe9d6acd4b71102cb814 Mon Sep 17 00:00:00 2001 From: SilvioC2C Date: Mon, 20 May 2024 17:52:09 +0200 Subject: [PATCH 1/3] [16.0][ADD] base_force_record_noupdate --- base_force_record_noupdate/README.rst | 71 +++ base_force_record_noupdate/__init__.py | 22 + base_force_record_noupdate/__manifest__.py | 16 + .../i18n/base_force_record_noupdate.pot | 34 ++ base_force_record_noupdate/models/__init__.py | 2 + base_force_record_noupdate/models/ir_model.py | 53 +++ .../models/ir_model_data.py | 18 + .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 6 + base_force_record_noupdate/readme/USAGE.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 425 ++++++++++++++++++ base_force_record_noupdate/tests/__init__.py | 1 + .../tests/test_base_force_record_noupdate.py | 75 ++++ base_force_record_noupdate/views/ir_model.xml | 25 ++ 15 files changed, 751 insertions(+) create mode 100644 base_force_record_noupdate/README.rst create mode 100644 base_force_record_noupdate/__init__.py create mode 100644 base_force_record_noupdate/__manifest__.py create mode 100644 base_force_record_noupdate/i18n/base_force_record_noupdate.pot create mode 100644 base_force_record_noupdate/models/__init__.py create mode 100644 base_force_record_noupdate/models/ir_model.py create mode 100644 base_force_record_noupdate/models/ir_model_data.py create mode 100644 base_force_record_noupdate/readme/CONTRIBUTORS.rst create mode 100644 base_force_record_noupdate/readme/DESCRIPTION.rst create mode 100644 base_force_record_noupdate/readme/USAGE.rst create mode 100644 base_force_record_noupdate/static/description/icon.png create mode 100644 base_force_record_noupdate/static/description/index.html create mode 100644 base_force_record_noupdate/tests/__init__.py create mode 100644 base_force_record_noupdate/tests/test_base_force_record_noupdate.py create mode 100644 base_force_record_noupdate/views/ir_model.xml diff --git a/base_force_record_noupdate/README.rst b/base_force_record_noupdate/README.rst new file mode 100644 index 00000000000..f5266153b62 --- /dev/null +++ b/base_force_record_noupdate/README.rst @@ -0,0 +1,71 @@ +====================== +Force Record No-update +====================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:da312318da6a5b90118144f6d5b265f86380b4c6d6c26eb129b5a534839bdc0e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-SilvioC2C%2Fserver--tools-lightgray.png?logo=github + :target: https://github.com/SilvioC2C/server-tools/tree/16.0-new-base_force_record_noupdate/base_force_record_noupdate + :alt: SilvioC2C/server-tools + +|badge1| |badge2| |badge3| + +This module adds a boolean field on models form view, allowing to force +``noupdate=True`` to data linked to those models. + +Upon setting the field to ``True`` on a given model, ``noupdate=True`` will be set upon +existing data linked to it. When creating new data linked to that model, they will +always have ``noupdate=True`` (unless the field is reset on the model itself). + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to open the models' form view and check field "Force No-Update" + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Camtocamp + +Contributors +~~~~~~~~~~~~ + +* Italo Lopes +* Silvio Gregorini + +Maintainers +~~~~~~~~~~~ + +This module is part of the `SilvioC2C/server-tools `_ project on GitHub. + +You are welcome to contribute. diff --git a/base_force_record_noupdate/__init__.py b/base_force_record_noupdate/__init__.py new file mode 100644 index 00000000000..88bdfee2c65 --- /dev/null +++ b/base_force_record_noupdate/__init__.py @@ -0,0 +1,22 @@ +from . import models + + +def post_init_hook(cr, registry): + """Configure a list of models having ``force_noupdate`` set by default""" + from odoo import SUPERUSER_ID, api + + env = api.Environment(cr, SUPERUSER_ID, {}) + mods = env["ir.model"].sudo() + for model_name in [ + "res.lang", + "ir.rule", + "ir.model.access", + "res.groups", + "mail.template", + "res.users.role", # Don't care if the module providing this is installed + ]: + mod = env["ir.model"]._get(model_name) + if mod and mod.exists(): + mods |= mod + if mods: + mods.write({"force_noupdate": True}) diff --git a/base_force_record_noupdate/__manifest__.py b/base_force_record_noupdate/__manifest__.py new file mode 100644 index 00000000000..dc6ed7dcca1 --- /dev/null +++ b/base_force_record_noupdate/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2024 Camptocamp (https://www.camptocamp.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +{ + "name": "Force Record No-update", + "summary": "Manually force noupdate=True on models", + "author": "Camtocamp, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/server-tools", + "category": "Hidden", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "depends": ["base"], + "data": ["views/ir_model.xml"], + "installable": True, + "post_init_hook": "post_init_hook", +} diff --git a/base_force_record_noupdate/i18n/base_force_record_noupdate.pot b/base_force_record_noupdate/i18n/base_force_record_noupdate.pot new file mode 100644 index 00000000000..68525fb9e5b --- /dev/null +++ b/base_force_record_noupdate/i18n/base_force_record_noupdate.pot @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_force_record_noupdate +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \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: base_force_record_noupdate +#: model:ir.model.fields,field_description:base_force_record_noupdate.field_ir_model__force_noupdate +msgid "Force No-Update" +msgstr "" + +#. module: base_force_record_noupdate +#: model:ir.model,name:base_force_record_noupdate.model_ir_model_data +msgid "Model Data" +msgstr "" + +#. module: base_force_record_noupdate +#: model:ir.model,name:base_force_record_noupdate.model_ir_model +msgid "Models" +msgstr "" + +#. module: base_force_record_noupdate +#: model:ir.actions.server,name:base_force_record_noupdate.action_run_ir_action_todo +msgid "Toggle Force Noupdate" +msgstr "" diff --git a/base_force_record_noupdate/models/__init__.py b/base_force_record_noupdate/models/__init__.py new file mode 100644 index 00000000000..11b44d76dae --- /dev/null +++ b/base_force_record_noupdate/models/__init__.py @@ -0,0 +1,2 @@ +from . import ir_model +from . import ir_model_data diff --git a/base_force_record_noupdate/models/ir_model.py b/base_force_record_noupdate/models/ir_model.py new file mode 100644 index 00000000000..44dd1302b34 --- /dev/null +++ b/base_force_record_noupdate/models/ir_model.py @@ -0,0 +1,53 @@ +# Copyright 2024 Camptocamp (https://www.camptocamp.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo import api, fields, models +from odoo.tools.cache import ormcache + + +class Model(models.Model): + _inherit = "ir.model" + + force_noupdate = fields.Boolean("Force No-Update") + + @api.model_create_multi + def create(self, vals_list): + mods = super().create(vals_list) + type(self)._get_noupdate_model_ids.clear_cache(self.browse()) + self._propagate_noupdate_to_model_data() + return mods + + def write(self, vals): + res = super().write(vals) + if "force_noupdate" in vals: + type(self)._get_noupdate_model_ids.clear_cache(self.browse()) + self._propagate_noupdate_to_model_data() + return res + + def unlink(self): + res = super().unlink() + type(self)._get_noupdate_model_ids.clear_cache(self.browse()) + return res + + def _get_noupdate_models(self): + return self.browse(self._get_noupdate_model_ids()) + + @ormcache() + def _get_noupdate_model_ids(self): + return self.search([("force_noupdate", "=", True)]).ids + + @api.model + def _propagate_noupdate_to_model_data(self): + noupdate = self._get_noupdate_models().mapped("model") + imd = self.env["ir.model.data"].sudo() + model_data = imd.search([("model", "in", noupdate), ("noupdate", "=", False)]) + if model_data: + model_data.write({"noupdate": True}) + + def toggle_force_noupdate(self): + true_to_false = self.filtered("force_noupdate") + if true_to_false: + true_to_false.write({"force_noupdate": False}) + false_to_true = self - true_to_false + if false_to_true: + false_to_true.write({"force_noupdate": True}) diff --git a/base_force_record_noupdate/models/ir_model_data.py b/base_force_record_noupdate/models/ir_model_data.py new file mode 100644 index 00000000000..cb18f166b32 --- /dev/null +++ b/base_force_record_noupdate/models/ir_model_data.py @@ -0,0 +1,18 @@ +# Copyright 2024 Camptocamp (https://www.camptocamp.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo import api, models + + +class IrModelData(models.Model): + _inherit = "ir.model.data" + + @api.model_create_multi + def create(self, vals_list): + noupdate_models = self.env["ir.model"].sudo()._get_noupdate_models() + if noupdate_models: + noupdate_model_names = set(noupdate_models.mapped("model")) + for vals in vals_list: + if vals.get("model") in noupdate_model_names: + vals["noupdate"] = True + return super().create(vals_list) diff --git a/base_force_record_noupdate/readme/CONTRIBUTORS.rst b/base_force_record_noupdate/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..5a20d7cc198 --- /dev/null +++ b/base_force_record_noupdate/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Italo Lopes +* Silvio Gregorini diff --git a/base_force_record_noupdate/readme/DESCRIPTION.rst b/base_force_record_noupdate/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..8312bf94aab --- /dev/null +++ b/base_force_record_noupdate/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +This module adds a boolean field on models form view, allowing to force +``noupdate=True`` to data linked to those models. + +Upon setting the field to ``True`` on a given model, ``noupdate=True`` will be set upon +existing data linked to it. When creating new data linked to that model, they will +always have ``noupdate=True`` (unless the field is reset on the model itself). diff --git a/base_force_record_noupdate/readme/USAGE.rst b/base_force_record_noupdate/readme/USAGE.rst new file mode 100644 index 00000000000..ff19b776fc0 --- /dev/null +++ b/base_force_record_noupdate/readme/USAGE.rst @@ -0,0 +1 @@ +To use this module, you need to open the models' form view and check field "Force No-Update" diff --git a/base_force_record_noupdate/static/description/icon.png b/base_force_record_noupdate/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/base_force_record_noupdate/static/description/index.html b/base_force_record_noupdate/static/description/index.html new file mode 100644 index 00000000000..cea66deef54 --- /dev/null +++ b/base_force_record_noupdate/static/description/index.html @@ -0,0 +1,425 @@ + + + + + +Force Record No-update + + + +
+

Force Record No-update

+ + +

Beta License: AGPL-3 SilvioC2C/server-tools

+

This module adds a boolean field on models form view, allowing to force +noupdate=True to data linked to those models.

+

Upon setting the field to True on a given model, noupdate=True will be set upon +existing data linked to it. When creating new data linked to that model, they will +always have noupdate=True (unless the field is reset on the model itself).

+

Table of contents

+ +
+

Usage

+

To use this module, you need to open the models’ form view and check field “Force No-Update”

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camtocamp
  • +
+
+ +
+

Maintainers

+

This module is part of the SilvioC2C/server-tools project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/base_force_record_noupdate/tests/__init__.py b/base_force_record_noupdate/tests/__init__.py new file mode 100644 index 00000000000..106e3eed2d1 --- /dev/null +++ b/base_force_record_noupdate/tests/__init__.py @@ -0,0 +1 @@ +from . import test_base_force_record_noupdate diff --git a/base_force_record_noupdate/tests/test_base_force_record_noupdate.py b/base_force_record_noupdate/tests/test_base_force_record_noupdate.py new file mode 100644 index 00000000000..aaba308b695 --- /dev/null +++ b/base_force_record_noupdate/tests/test_base_force_record_noupdate.py @@ -0,0 +1,75 @@ +# Copyright 2024 Camptocamp (https://www.camptocamp.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo.tests import TransactionCase + +MODULE = "base_force_record_noupdate" + + +class TestBaseForceRecordNoupdate(TransactionCase): + def test_00_test_model_create_noupdate_propagation(self): + # NB: we're only testing models created through UI, the feature is not + # supported yet for models created by the code itself + imd = self.env["ir.model.data"].create( + { + "module": MODULE, + "name": "test_ir_model_data_record", + "model": "x_my.model.test.00", + "noupdate": False, + } + ) + self.env["ir.model"].create( + { + "name": "My Model Test 00", + "state": "manual", + "model": "x_my.model.test.00", + "force_noupdate": True, + } + ) + self.assertTrue(imd.noupdate) + + def test_01_test_model_write_noupdate_propagation(self): + my_model = self.env["ir.model"].create( + { + "name": "My Model Test 01", + "state": "manual", + "model": "x_my.model.test.01", + "force_noupdate": False, + } + ) + imd = self.env["ir.model.data"].create( + { + "module": MODULE, + "name": "test_ir_model_data_record", + "model": "x_my.model.test.01", + "noupdate": False, + } + ) + my_model.force_noupdate = True + self.assertTrue(imd.noupdate) + + def test_02_test_model_data_create_noupdate(self): + self.env["ir.model"].create( + [ + { + "name": f"My Model Test 02.{n}", + "state": "manual", + "model": f"x_my.model.test.02.{n}", + "force_noupdate": force_noupdate, + } + for n, force_noupdate in [(1, True), (2, False)] + ] + ) + imd1, imd2 = self.env["ir.model.data"].create( + [ + { + "module": MODULE, + "name": f"test_ir_model_data_record_{n}", + "model": f"x_my.model.test.02.{n}", + "noupdate": False, + } + for n in (1, 2) + ] + ) + self.assertTrue(imd1.noupdate) + self.assertFalse(imd2.noupdate) diff --git a/base_force_record_noupdate/views/ir_model.xml b/base_force_record_noupdate/views/ir_model.xml new file mode 100644 index 00000000000..2540b0309eb --- /dev/null +++ b/base_force_record_noupdate/views/ir_model.xml @@ -0,0 +1,25 @@ + + + + + ir.model + + + + + + + + + + Toggle Force Noupdate + ir.actions.server + + code + +if records: + records.toggle_force_noupdate() + + + + From c88bb3dafef81561ccae3fc0ec8189b2d6acc99a Mon Sep 17 00:00:00 2001 From: Vincent Van Rossem Date: Fri, 24 May 2024 11:23:09 +0200 Subject: [PATCH 2/3] [IMP] base_force_record_noupdate: black, isort, prettier --- .../odoo/addons/base_force_record_noupdate | 1 + setup/base_force_record_noupdate/setup.py | 6 ++++++ 2 files changed, 7 insertions(+) create mode 120000 setup/base_force_record_noupdate/odoo/addons/base_force_record_noupdate create mode 100644 setup/base_force_record_noupdate/setup.py diff --git a/setup/base_force_record_noupdate/odoo/addons/base_force_record_noupdate b/setup/base_force_record_noupdate/odoo/addons/base_force_record_noupdate new file mode 120000 index 00000000000..991c951d33e --- /dev/null +++ b/setup/base_force_record_noupdate/odoo/addons/base_force_record_noupdate @@ -0,0 +1 @@ +../../../../base_force_record_noupdate \ No newline at end of file diff --git a/setup/base_force_record_noupdate/setup.py b/setup/base_force_record_noupdate/setup.py new file mode 100644 index 00000000000..28c57bb6403 --- /dev/null +++ b/setup/base_force_record_noupdate/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From d0fa87353e03c6576055adfb5c5043d0f38509ee Mon Sep 17 00:00:00 2001 From: Vincent Van Rossem Date: Fri, 24 May 2024 11:27:43 +0200 Subject: [PATCH 3/3] [MIG] base_force_record_noupdate: Backport to 15.0 --- base_force_record_noupdate/README.rst | 34 ++++++++++++++----- base_force_record_noupdate/__manifest__.py | 2 +- .../static/description/index.html | 24 ++++++++----- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/base_force_record_noupdate/README.rst b/base_force_record_noupdate/README.rst index f5266153b62..8d22d29e78c 100644 --- a/base_force_record_noupdate/README.rst +++ b/base_force_record_noupdate/README.rst @@ -16,11 +16,17 @@ Force Record No-update .. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-SilvioC2C%2Fserver--tools-lightgray.png?logo=github - :target: https://github.com/SilvioC2C/server-tools/tree/16.0-new-base_force_record_noupdate/base_force_record_noupdate - :alt: SilvioC2C/server-tools - -|badge1| |badge2| |badge3| +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github + :target: https://github.com/OCA/server-tools/tree/15.0/base_force_record_noupdate + :alt: OCA/server-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-tools-15-0/server-tools-15-0-base_force_record_noupdate + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds a boolean field on models form view, allowing to force ``noupdate=True`` to data linked to those models. @@ -42,10 +48,10 @@ To use this module, you need to open the models' form view and check field "Forc Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -66,6 +72,16 @@ Contributors Maintainers ~~~~~~~~~~~ -This module is part of the `SilvioC2C/server-tools `_ project on GitHub. +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-tools `_ project on GitHub. -You are welcome to contribute. +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_force_record_noupdate/__manifest__.py b/base_force_record_noupdate/__manifest__.py index dc6ed7dcca1..53c989a63e7 100644 --- a/base_force_record_noupdate/__manifest__.py +++ b/base_force_record_noupdate/__manifest__.py @@ -7,7 +7,7 @@ "author": "Camtocamp, Odoo Community Association (OCA)", "website": "https://github.com/OCA/server-tools", "category": "Hidden", - "version": "16.0.1.0.0", + "version": "15.0.1.0.0", "license": "AGPL-3", "depends": ["base"], "data": ["views/ir_model.xml"], diff --git a/base_force_record_noupdate/static/description/index.html b/base_force_record_noupdate/static/description/index.html index cea66deef54..026f89046b9 100644 --- a/base_force_record_noupdate/static/description/index.html +++ b/base_force_record_noupdate/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -368,7 +369,7 @@

Force Record No-update

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:da312318da6a5b90118144f6d5b265f86380b4c6d6c26eb129b5a534839bdc0e !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 SilvioC2C/server-tools

+

Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

This module adds a boolean field on models form view, allowing to force noupdate=True to data linked to those models.

Upon setting the field to True on a given model, noupdate=True will be set upon @@ -393,10 +394,10 @@

Usage

Bug Tracker

-

Bugs are tracked on GitHub Issues. +

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -416,8 +417,15 @@

Contributors

Maintainers

-

This module is part of the SilvioC2C/server-tools project on GitHub.

-

You are welcome to contribute.

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/server-tools project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.