From dd95cccde21a88a3fb944bac5a42088054fba109 Mon Sep 17 00:00:00 2001 From: David Beal Date: Mon, 2 Oct 2023 11:26:17 +0200 Subject: [PATCH] [ADD][16.0] web_apply_field_style module --- .../odoo/addons/web_apply_field_style | 1 + setup/web_apply_field_style/setup.py | 6 + web_apply_field_style/README.rst | 101 ++++ web_apply_field_style/__init__.py | 6 + web_apply_field_style/__manifest__.py | 15 + web_apply_field_style/demo/__init__.py | 1 + web_apply_field_style/demo/base.py | 30 ++ web_apply_field_style/models/__init__.py | 1 + web_apply_field_style/models/base.py | 55 +++ web_apply_field_style/readme/CONFIGURE.rst | 15 + web_apply_field_style/readme/CONTRIBUTORS.rst | 2 + web_apply_field_style/readme/DESCRIPTION.rst | 6 + .../static/description/demo.png | Bin 0 -> 48605 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 449 ++++++++++++++++++ web_apply_field_style/tests/__init__.py | 1 + web_apply_field_style/tests/test_module.py | 54 +++ 17 files changed, 743 insertions(+) create mode 120000 setup/web_apply_field_style/odoo/addons/web_apply_field_style create mode 100644 setup/web_apply_field_style/setup.py create mode 100644 web_apply_field_style/README.rst create mode 100644 web_apply_field_style/__init__.py create mode 100644 web_apply_field_style/__manifest__.py create mode 100644 web_apply_field_style/demo/__init__.py create mode 100644 web_apply_field_style/demo/base.py create mode 100644 web_apply_field_style/models/__init__.py create mode 100644 web_apply_field_style/models/base.py create mode 100644 web_apply_field_style/readme/CONFIGURE.rst create mode 100644 web_apply_field_style/readme/CONTRIBUTORS.rst create mode 100644 web_apply_field_style/readme/DESCRIPTION.rst create mode 100644 web_apply_field_style/static/description/demo.png create mode 100644 web_apply_field_style/static/description/icon.png create mode 100644 web_apply_field_style/static/description/index.html create mode 100644 web_apply_field_style/tests/__init__.py create mode 100644 web_apply_field_style/tests/test_module.py diff --git a/setup/web_apply_field_style/odoo/addons/web_apply_field_style b/setup/web_apply_field_style/odoo/addons/web_apply_field_style new file mode 120000 index 000000000..5dc7be41e --- /dev/null +++ b/setup/web_apply_field_style/odoo/addons/web_apply_field_style @@ -0,0 +1 @@ +../../../../web_apply_field_style \ No newline at end of file diff --git a/setup/web_apply_field_style/setup.py b/setup/web_apply_field_style/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/web_apply_field_style/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/web_apply_field_style/README.rst b/web_apply_field_style/README.rst new file mode 100644 index 000000000..f798acd23 --- /dev/null +++ b/web_apply_field_style/README.rst @@ -0,0 +1,101 @@ +================= +Apply Field Style +================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:dec2135f450935a31305575e98d577ccafcc5e10e314dc396f4e0c2f15f9e691 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_apply_field_style + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_apply_field_style + :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/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Allow to set an additional css class to fields in form view. + +Use case : you may highlight some fields for training purpose + +.. figure:: https://raw.githubusercontent.com/OCA/web/16.0/web_apply_field_style/static/description/demo.png + :alt: Colored fields + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Override _get_field_styles() with a dict of fields list per model + + +.. code-block:: python + + class Base(models.AbstractModel): + _inherit = "base" + + def _get_field_styles(self): + res = super()._get_field_styles() + res["product.product"] = { + "my-css-class1": ["field1", "field2"], + "my-css-class2": ["field3"], + } + return res + +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 +~~~~~~~ + +* Akretion + +Contributors +~~~~~~~~~~~~ + +* `Akretion `_: + * David BEAL + +Maintainers +~~~~~~~~~~~ + +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/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_apply_field_style/__init__.py b/web_apply_field_style/__init__.py new file mode 100644 index 000000000..ede0a44cb --- /dev/null +++ b/web_apply_field_style/__init__.py @@ -0,0 +1,6 @@ +from odoo.tools import config + +from . import models + +if not config.get("without_demo"): + from . import demo diff --git a/web_apply_field_style/__manifest__.py b/web_apply_field_style/__manifest__.py new file mode 100644 index 000000000..c49e67014 --- /dev/null +++ b/web_apply_field_style/__manifest__.py @@ -0,0 +1,15 @@ +{ + "name": "Apply Field Style", + "author": "Akretion,Odoo Community Association (OCA)", + "summary": "Apply css class style to fields from a dict parameters", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "maintainer": ["bealdav"], + "website": "https://github.com/OCA/web", + "category": "web", + "depends": [ + "base", + ], + "data": [], + "installable": True, +} diff --git a/web_apply_field_style/demo/__init__.py b/web_apply_field_style/demo/__init__.py new file mode 100644 index 000000000..0e4444933 --- /dev/null +++ b/web_apply_field_style/demo/__init__.py @@ -0,0 +1 @@ +from . import base diff --git a/web_apply_field_style/demo/base.py b/web_apply_field_style/demo/base.py new file mode 100644 index 000000000..d334d21f0 --- /dev/null +++ b/web_apply_field_style/demo/base.py @@ -0,0 +1,30 @@ +# © 2023 David BEAL @ Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import models + +# R8180 rule asks for merging demo/base.py and models/base.py content +# We need to keep these class separated because of demo mode. +# pylint: disable=R8180 + + +class Base(models.AbstractModel): + _inherit = "base" + + def _get_field_styles(self): + res = super()._get_field_styles() + style = self.env.context.get("style") + if style == "nice": + # only this entry is correct + res["res.users"] = { + "bg-info": ["login", "type"], + "bg-warning": ["partner_id"], + } + elif style == "no_dict": + res = "any" + elif style == "no_field_list": + res["res.users"] = {"bg-info": "any"} + elif style == "empty_dict": + res["res.users"] = {} + elif style == "no_style": + res["res.users"] = False + return res diff --git a/web_apply_field_style/models/__init__.py b/web_apply_field_style/models/__init__.py new file mode 100644 index 000000000..0e4444933 --- /dev/null +++ b/web_apply_field_style/models/__init__.py @@ -0,0 +1 @@ +from . import base diff --git a/web_apply_field_style/models/base.py b/web_apply_field_style/models/base.py new file mode 100644 index 000000000..9c6cf435c --- /dev/null +++ b/web_apply_field_style/models/base.py @@ -0,0 +1,55 @@ +# © 2023 David BEAL @ Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging + +from odoo import api, exceptions, models + +logger = logging.getLogger(__name__) + + +class Base(models.AbstractModel): + _inherit = "base" + + @api.model + def _get_view(self, view_id=None, view_type="form", **options): + arch, view = super()._get_view(view_id, view_type, **options) + if view_type == "form": + self._update_css_class(arch) + return arch, view + + def _update_css_class(self, arch): + css = self._get_field_styles() + if css: + self._check_css_dict(css) + for style in css.get(self._name): + for field_name in css[self._name][style]: + for field in arch.xpath(f"//field[@name='{field_name}']"): + field.attrib[ + "class" + ] = f"{style} {field.attrib.get('class') or ''}".strip() + + def _get_field_styles(self): + """Inherit me with: + + res = super()._get_field_styles() + res.append({'my_model': {"css_class": ['field1', 'field2'], "bg-info": [...] }}) + return res + """ + return {} + + def _check_css_dict(self, css): + rtfm = "\n\nPlease have a look to the readme.\n\nThe rtfm team." + if not isinstance(css, dict): + raise exceptions.ValidationError( + f"_get_field_styles() should return a dict{rtfm}" + ) + model = self._name + if model in css: + if not isinstance(css[model], dict): + raise exceptions.ValidationError(f"{css[model]} should be a dict{rtfm}") + for vals in css[model].values(): + if not isinstance(vals, list): + raise exceptions.ValidationError( + f"{vals} should be a list of fields !{rtfm}" + ) diff --git a/web_apply_field_style/readme/CONFIGURE.rst b/web_apply_field_style/readme/CONFIGURE.rst new file mode 100644 index 000000000..675b2114b --- /dev/null +++ b/web_apply_field_style/readme/CONFIGURE.rst @@ -0,0 +1,15 @@ +Override _get_field_styles() with a dict of fields list per model + + +.. code-block:: python + + class Base(models.AbstractModel): + _inherit = "base" + + def _get_field_styles(self): + res = super()._get_field_styles() + res["product.product"] = { + "my-css-class1": ["field1", "field2"], + "my-css-class2": ["field3"], + } + return res diff --git a/web_apply_field_style/readme/CONTRIBUTORS.rst b/web_apply_field_style/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..957db5f01 --- /dev/null +++ b/web_apply_field_style/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* `Akretion `_: + * David BEAL diff --git a/web_apply_field_style/readme/DESCRIPTION.rst b/web_apply_field_style/readme/DESCRIPTION.rst new file mode 100644 index 000000000..7145b7c13 --- /dev/null +++ b/web_apply_field_style/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +Allow to set an additional css class to fields in form view. + +Use case : you may highlight some fields for training purpose + +.. figure:: ../static/description/demo.png + :alt: Colored fields diff --git a/web_apply_field_style/static/description/demo.png b/web_apply_field_style/static/description/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..27c2aaa454fd3cd3d54bd7a47c35184ef280f2f4 GIT binary patch literal 48605 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/web_apply_field_style/static/description/index.html b/web_apply_field_style/static/description/index.html new file mode 100644 index 000000000..f60550b40 --- /dev/null +++ b/web_apply_field_style/static/description/index.html @@ -0,0 +1,449 @@ + + + + + + +Apply Field Style + + + +
+

Apply Field Style

+ + +

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

+

Allow to set an additional css class to fields in form view.

+

Use case : you may highlight some fields for training purpose

+
+Colored fields +
+

Table of contents

+ +
+

Configuration

+

Override _get_field_styles() with a dict of fields list per model

+
+class Base(models.AbstractModel):
+    _inherit = "base"
+
+    def _get_field_styles(self):
+        res = super()._get_field_styles()
+        res["product.product"] = {
+            "my-css-class1": ["field1", "field2"],
+            "my-css-class2": ["field3"],
+        }
+        return res
+
+
+
+

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

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

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/web project on GitHub.

+

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

+
+
+
+ + diff --git a/web_apply_field_style/tests/__init__.py b/web_apply_field_style/tests/__init__.py new file mode 100644 index 000000000..d9b96c4fa --- /dev/null +++ b/web_apply_field_style/tests/__init__.py @@ -0,0 +1 @@ +from . import test_module diff --git a/web_apply_field_style/tests/test_module.py b/web_apply_field_style/tests/test_module.py new file mode 100644 index 000000000..178521280 --- /dev/null +++ b/web_apply_field_style/tests/test_module.py @@ -0,0 +1,54 @@ +# © 2023 David BEAL @ Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.exceptions import ValidationError +from odoo.tests import common + + +class Test(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.user_view = cls.env.ref("base.view_users_form") + + def test_nice(self): + arch, view = ( + self.env["res.users"] + .with_context(style="nice") + ._get_view(view_id=self.user_view.id) + ) + for field in arch.xpath("//field[@name='partner_id']"): + self.assertEqual(field.attrib.get("class"), "bg-warning") + + def test_no_dict(self): + with self.assertRaisesRegex(ValidationError, "_get_field_styles().*"): + arch, view = ( + self.env["res.users"] + .with_context(style="no_dict") + ._get_view(view_id=self.user_view.id) + ) + + def test_no_field_list(self): + with self.assertRaisesRegex(ValidationError, ".*should be a list of fields.*"): + arch, view = ( + self.env["res.users"] + .with_context(style="no_field_list") + ._get_view(view_id=self.user_view.id) + ) + + def test_empty_dict(self): + # No effect but no broken code + arch, view = ( + self.env["res.users"] + .with_context(style="empty_dict") + ._get_view(view_id=self.user_view.id) + ) + + def test_no_style(self): + with self.assertRaisesRegex(ValidationError, ".*should be a dict.*"): + arch, view = ( + self.env["res.users"] + .with_context(style="no_style") + ._get_view(view_id=self.user_view.id) + )