diff --git a/base_field_deprecated/README.rst b/base_field_deprecated/README.rst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/base_field_deprecated/__init__.py b/base_field_deprecated/__init__.py new file mode 100644 index 0000000000..cc6b6354ad --- /dev/null +++ b/base_field_deprecated/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import post_init_hook diff --git a/base_field_deprecated/__manifest__.py b/base_field_deprecated/__manifest__.py new file mode 100644 index 0000000000..c06df09c49 --- /dev/null +++ b/base_field_deprecated/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2023 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + "name": "Base Field Deprecated", + "summary": "Adds the deprecated attribute to the Odoo field model.", + "version": "15.0.1.0.0", + "category": "Usability", + "license": "AGPL-3", + "website": "https://github.com/OCA/server-ux", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "depends": ["base"], + "data": ["views/ir_model_fields_views.xml"], + "maintainers": ["GuillemCForgeFlow"], + "installable": True, + "application": False, + "post_init_hook": "post_init_hook", +} diff --git a/base_field_deprecated/hooks.py b/base_field_deprecated/hooks.py new file mode 100644 index 0000000000..59fb2031dc --- /dev/null +++ b/base_field_deprecated/hooks.py @@ -0,0 +1,22 @@ +from odoo import SUPERUSER_ID, api + + +def post_init_hook(cr, registry): + """ + Set deprecated value for all existing fields + """ + env = api.Environment(cr, SUPERUSER_ID, {}) + + model_obj = env["ir.model"] + field_obj = env["ir.model.fields"] + for model in model_obj.search([]): + all_fields = model._fields.items() + for field_name, field in all_fields: + # Only assign for deprecated fields to avoid too many useless searches + to_assign = bool(field.deprecated) + if to_assign: + odoo_field = field_obj.search( + [("name", "=", field_name), ("model", "=", model._name)], limit=1 + ) + if odoo_field: + odoo_field.write({"deprecated": to_assign}) diff --git a/base_field_deprecated/models/__init__.py b/base_field_deprecated/models/__init__.py new file mode 100644 index 0000000000..4236f0a44c --- /dev/null +++ b/base_field_deprecated/models/__init__.py @@ -0,0 +1 @@ +from . import ir_model_fields diff --git a/base_field_deprecated/models/ir_model_fields.py b/base_field_deprecated/models/ir_model_fields.py new file mode 100644 index 0000000000..e6dfc21918 --- /dev/null +++ b/base_field_deprecated/models/ir_model_fields.py @@ -0,0 +1,12 @@ +from odoo import fields, models + + +class IrModelFields(models.Model): + _inherit = "ir.model.fields" + + deprecated = fields.Boolean(help="Whether the field is deprecated or not.") + + def _reflect_field_params(self, field, model_id): + result = super()._reflect_field_params(field, model_id) + result["deprecated"] = bool(field.deprecated) + return result diff --git a/base_field_deprecated/readme/CONTRIBUTORS.rst b/base_field_deprecated/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..a502d31e5b --- /dev/null +++ b/base_field_deprecated/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `ForgeFlow S.L. `_: + + * Guillem Casassas diff --git a/base_field_deprecated/readme/DESCRIPTION.rst b/base_field_deprecated/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..f0a440b97a --- /dev/null +++ b/base_field_deprecated/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module adds the deprecated field to the Odoo field itself based on the value set to the Python field. +This can be useful to determine which are the declared deprecated fields in a fast way. diff --git a/base_field_deprecated/readme/USAGE.rst b/base_field_deprecated/readme/USAGE.rst new file mode 100644 index 0000000000..8a52a00cc8 --- /dev/null +++ b/base_field_deprecated/readme/USAGE.rst @@ -0,0 +1,4 @@ +#. By setting **deprecated=True** to a declared field, the Odoo field will inherit the value and it will be stored at the database level. +#. For instance: + #. If we have the following field: test_field = fields.Boolean(deprecated=True). + #. By looking at the instance that saves the information of the Python field on the **ir.model.fields** model, the deprecated attribute will be set there, just like copied, store, computed, among others. diff --git a/base_field_deprecated/views/ir_model_fields_views.xml b/base_field_deprecated/views/ir_model_fields_views.xml new file mode 100644 index 0000000000..1d408d6769 --- /dev/null +++ b/base_field_deprecated/views/ir_model_fields_views.xml @@ -0,0 +1,37 @@ + + + + ir.model.fields.tree - base_field_deprecated + ir.model.fields + + + + + + + + + ir.model.fields.form - base_field_deprecated + ir.model.fields + + + + + + + + + ir.model.fields.search - base_field_deprecated + ir.model.fields + + + + + + + + diff --git a/setup/base_field_deprecated/odoo/addons/base_field_deprecated b/setup/base_field_deprecated/odoo/addons/base_field_deprecated new file mode 120000 index 0000000000..d2915f0aac --- /dev/null +++ b/setup/base_field_deprecated/odoo/addons/base_field_deprecated @@ -0,0 +1 @@ +../../../../base_field_deprecated \ No newline at end of file diff --git a/setup/base_field_deprecated/setup.py b/setup/base_field_deprecated/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/base_field_deprecated/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)