From a162dc43d19aa5af1d181df5c78f27f70a183c4d Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Wed, 14 Aug 2024 08:23:21 +0200 Subject: [PATCH 1/6] [ADD] web_widget_remaining_days_exact_date: New module to show exact date when remaining days shown This module is adding an option to the remaining_days widget to be able to show the exact date. --- .../README.rst | 105 +++++ .../__init__.py | 0 .../__manifest__.py | 20 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 1 + .../readme/USAGE.rst | 9 + .../static/description/index.html | 446 ++++++++++++++++++ .../src/remaining_days/remaining_days.esm.js | 42 ++ 8 files changed, 627 insertions(+) create mode 100644 web_widget_remaining_days_exact_date/README.rst create mode 100644 web_widget_remaining_days_exact_date/__init__.py create mode 100644 web_widget_remaining_days_exact_date/__manifest__.py create mode 100644 web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.rst create mode 100644 web_widget_remaining_days_exact_date/readme/DESCRIPTION.rst create mode 100644 web_widget_remaining_days_exact_date/readme/USAGE.rst create mode 100644 web_widget_remaining_days_exact_date/static/description/index.html create mode 100644 web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js diff --git a/web_widget_remaining_days_exact_date/README.rst b/web_widget_remaining_days_exact_date/README.rst new file mode 100644 index 000000000000..ffaa7cc1efb4 --- /dev/null +++ b/web_widget_remaining_days_exact_date/README.rst @@ -0,0 +1,105 @@ +==================================== +Web Widget Remaining Days Exact Date +==================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c71bd5f0f41e5a6661d1d1866db575053f328abd16c559071f5eb8e916cd4f88 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |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_widget_remaining_days_exact_date + :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_widget_remaining_days_exact_date + :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| + +This module allows displaying the exact date alongside the remaining days. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +If in any case the exact date doesn't need to be displayed, we can disable the +functionality by adding `options="{'exact_date': False}"` to the field that has the +widget. + +**Example** + +.. code:: xml + + + +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 +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_ + + * Pedro M. Baeza + * Carlos Roca + +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. + +.. |maintainer-CarlosRoca13| image:: https://github.com/CarlosRoca13.png?size=40px + :target: https://github.com/CarlosRoca13 + :alt: CarlosRoca13 + +Current `maintainer `__: + +|maintainer-CarlosRoca13| + +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_widget_remaining_days_exact_date/__init__.py b/web_widget_remaining_days_exact_date/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_widget_remaining_days_exact_date/__manifest__.py b/web_widget_remaining_days_exact_date/__manifest__.py new file mode 100644 index 000000000000..a4c52a9937e6 --- /dev/null +++ b/web_widget_remaining_days_exact_date/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2024 Tecnativa - Carlos Roca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0) + +{ + "name": "Web Widget Remaining Days Exact Date", + "summary": "Allows displaying the exact date alongside the remaining days", + "version": "16.0.1.0.0", + "development_status": "Alpha", + "website": "https://github.com/OCA/web", + "author": "Tecnativa, Odoo Community Association (OCA)", + "maintainers": ["CarlosRoca13"], + "license": "AGPL-3", + "depends": ["web"], + "assets": { + "web.assets_backend": [ + "web_widget_remaining_days_exact_date/static/src/remaining_days" + "/remaining_days.esm.js", + ], + }, +} diff --git a/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.rst b/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000000..825701131223 --- /dev/null +++ b/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `Tecnativa `_ + + * Pedro M. Baeza + * Carlos Roca \ No newline at end of file diff --git a/web_widget_remaining_days_exact_date/readme/DESCRIPTION.rst b/web_widget_remaining_days_exact_date/readme/DESCRIPTION.rst new file mode 100644 index 000000000000..320025e9f885 --- /dev/null +++ b/web_widget_remaining_days_exact_date/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows displaying the exact date alongside the remaining days. \ No newline at end of file diff --git a/web_widget_remaining_days_exact_date/readme/USAGE.rst b/web_widget_remaining_days_exact_date/readme/USAGE.rst new file mode 100644 index 000000000000..a764d75899b9 --- /dev/null +++ b/web_widget_remaining_days_exact_date/readme/USAGE.rst @@ -0,0 +1,9 @@ +If in any case the exact date doesn't need to be displayed, we can disable the +functionality by adding `options="{'exact_date': False}"` to the field that has the +widget. + +**Example** + +.. code:: xml + + \ No newline at end of file diff --git a/web_widget_remaining_days_exact_date/static/description/index.html b/web_widget_remaining_days_exact_date/static/description/index.html new file mode 100644 index 000000000000..03c5ed3dc39f --- /dev/null +++ b/web_widget_remaining_days_exact_date/static/description/index.html @@ -0,0 +1,446 @@ + + + + + +Web Widget Remaining Days Exact Date + + + +
+

Web Widget Remaining Days Exact Date

+ + +

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

+

This module allows displaying the exact date alongside the remaining days.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Usage

+

If in any case the exact date doesn’t need to be displayed, we can disable the +functionality by adding options=”{‘exact_date’: False}” to the field that has the +widget.

+

Example

+
+<field name="date_deadline" widget="remaining_days" options="{'exact_date': False}"/>
+
+
+
+

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

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa
      +
    • Pedro M. Baeza
    • +
    • Carlos Roca
    • +
    +
  • +
+
+
+

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.

+

Current maintainer:

+

CarlosRoca13

+

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_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js b/web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js new file mode 100644 index 000000000000..de8d8fcd5843 --- /dev/null +++ b/web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js @@ -0,0 +1,42 @@ +/** @odoo-module **/ +/* Copyright 2024 Tecnativa - Carlos Roca + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ +import {RemainingDaysField} from "@web/views/fields/remaining_days/remaining_days_field"; +import {patch} from "@web/core/utils/patch"; +import {sprintf} from "@web/core/utils/strings"; + +patch( + RemainingDaysField.prototype, + "web_widget_remaining_days_exact_date.RemainingDaysField", + { + get diffString() { + var value = this._super(...arguments); + // 99 is hardcoded because Odoo uses this value to display the exact + // date at this point + // https://github.com/odoo/odoo/blob/9cb802340f7a769327e9e5f0c4085cb837269551/addons/web/static/src/views/fields/remaining_days/remaining_days_field.js#L42 + if (value && this.props.exact_date && Math.abs(this.diffDays) <= 99) { + value = sprintf("%s (%s)", value, this.formattedValue); + } + return value; + }, + } +); +RemainingDaysField.props = { + ...RemainingDaysField.props, + exact_date: {type: Boolean, optional: true}, +}; +RemainingDaysField.defaultProps = { + ...RemainingDaysField.defaultProps, + exact_date: true, +}; +const superExtractProps = RemainingDaysField.extractProps; +RemainingDaysField.extractProps = ({attrs}) => { + var res = {}; + if (superExtractProps) { + res = superExtractProps({attrs}); + } + return { + ...res, + exact_date: attrs.options.exact_date, + }; +}; From de43bddc4723f407b5d9ced7bc1103673303f9ed Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 14 Aug 2024 17:56:50 +0000 Subject: [PATCH 2/6] [UPD] Update web_widget_remaining_days_exact_date.pot --- web_widget_remaining_days_exact_date/README.rst | 2 +- .../web_widget_remaining_days_exact_date.pot | 13 +++++++++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 2 +- 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 web_widget_remaining_days_exact_date/i18n/web_widget_remaining_days_exact_date.pot create mode 100644 web_widget_remaining_days_exact_date/static/description/icon.png diff --git a/web_widget_remaining_days_exact_date/README.rst b/web_widget_remaining_days_exact_date/README.rst index ffaa7cc1efb4..3b3919665b0c 100644 --- a/web_widget_remaining_days_exact_date/README.rst +++ b/web_widget_remaining_days_exact_date/README.rst @@ -7,7 +7,7 @@ Web Widget Remaining Days Exact Date !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:c71bd5f0f41e5a6661d1d1866db575053f328abd16c559071f5eb8e916cd4f88 + !! source digest: sha256:a84ad30ebfaa64e7c8874579509890ef6e9fecfeac8202b233ddfc57b2dde5ca !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/web_widget_remaining_days_exact_date/i18n/web_widget_remaining_days_exact_date.pot b/web_widget_remaining_days_exact_date/i18n/web_widget_remaining_days_exact_date.pot new file mode 100644 index 000000000000..78d58d53fe07 --- /dev/null +++ b/web_widget_remaining_days_exact_date/i18n/web_widget_remaining_days_exact_date.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +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" diff --git a/web_widget_remaining_days_exact_date/static/description/icon.png b/web_widget_remaining_days_exact_date/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/web_widget_remaining_days_exact_date/static/description/index.html b/web_widget_remaining_days_exact_date/static/description/index.html index 03c5ed3dc39f..d5f2dbb1022f 100644 --- a/web_widget_remaining_days_exact_date/static/description/index.html +++ b/web_widget_remaining_days_exact_date/static/description/index.html @@ -367,7 +367,7 @@

Web Widget Remaining Days Exact Date

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:c71bd5f0f41e5a6661d1d1866db575053f328abd16c559071f5eb8e916cd4f88 +!! source digest: sha256:a84ad30ebfaa64e7c8874579509890ef6e9fecfeac8202b233ddfc57b2dde5ca !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module allows displaying the exact date alongside the remaining days.

From 7af820ca0c143e5aa5c202309718a94882953ea1 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 16 Sep 2024 08:56:57 +0000 Subject: [PATCH 3/6] Added translation using Weblate (Italian) --- web_widget_remaining_days_exact_date/i18n/it.po | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 web_widget_remaining_days_exact_date/i18n/it.po diff --git a/web_widget_remaining_days_exact_date/i18n/it.po b/web_widget_remaining_days_exact_date/i18n/it.po new file mode 100644 index 000000000000..73388557f6d5 --- /dev/null +++ b/web_widget_remaining_days_exact_date/i18n/it.po @@ -0,0 +1,14 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" From 16ed186dbcf2c31d799ce45bb0a6909bdcd796ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Le=C3=B3n?= Date: Sat, 29 Nov 2025 12:58:15 -0500 Subject: [PATCH 4/6] [IMP] web_widget_remaining_days_exact_date: pre-commit auto fixes --- .../README.rst | 33 ++++++++++--------- .../pyproject.toml | 3 ++ .../readme/CONTRIBUTORS.md | 3 ++ .../readme/CONTRIBUTORS.rst | 4 --- .../{DESCRIPTION.rst => DESCRIPTION.md} | 3 +- .../readme/USAGE.md | 9 +++++ .../readme/USAGE.rst | 9 ----- .../static/description/index.html | 15 +++++---- 8 files changed, 42 insertions(+), 37 deletions(-) create mode 100644 web_widget_remaining_days_exact_date/pyproject.toml create mode 100644 web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.md delete mode 100644 web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.rst rename web_widget_remaining_days_exact_date/readme/{DESCRIPTION.rst => DESCRIPTION.md} (85%) create mode 100644 web_widget_remaining_days_exact_date/readme/USAGE.md delete mode 100644 web_widget_remaining_days_exact_date/readme/USAGE.rst diff --git a/web_widget_remaining_days_exact_date/README.rst b/web_widget_remaining_days_exact_date/README.rst index 3b3919665b0c..0a33a08c0447 100644 --- a/web_widget_remaining_days_exact_date/README.rst +++ b/web_widget_remaining_days_exact_date/README.rst @@ -17,18 +17,19 @@ Web Widget Remaining Days Exact Date :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_widget_remaining_days_exact_date + :target: https://github.com/OCA/web/tree/18.0/web_widget_remaining_days_exact_date :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_widget_remaining_days_exact_date + :target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_widget_remaining_days_exact_date :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 + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -This module allows displaying the exact date alongside the remaining days. +This module allows displaying the exact date alongside the remaining +days. .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. @@ -43,15 +44,15 @@ This module allows displaying the exact date alongside the remaining days. Usage ===== -If in any case the exact date doesn't need to be displayed, we can disable the -functionality by adding `options="{'exact_date': False}"` to the field that has the -widget. +If in any case the exact date doesn't need to be displayed, we can +disable the functionality by adding options="{'exact_date': False}" to +the field that has the widget. **Example** .. code:: xml - + Bug Tracker =========== @@ -59,7 +60,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -67,20 +68,20 @@ Credits ======= Authors -~~~~~~~ +------- * Tecnativa Contributors -~~~~~~~~~~~~ +------------ -* `Tecnativa `_ +- `Tecnativa `__ - * Pedro M. Baeza - * Carlos Roca + - Pedro M. Baeza + - Carlos Roca Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -100,6 +101,6 @@ Current `maintainer `__: |maintainer-CarlosRoca13| -This module is part of the `OCA/web `_ project on GitHub. +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_widget_remaining_days_exact_date/pyproject.toml b/web_widget_remaining_days_exact_date/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/web_widget_remaining_days_exact_date/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.md b/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..6116b492380c --- /dev/null +++ b/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com) + - Pedro M. Baeza + - Carlos Roca diff --git a/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.rst b/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.rst deleted file mode 100644 index 825701131223..000000000000 --- a/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,4 +0,0 @@ -* `Tecnativa `_ - - * Pedro M. Baeza - * Carlos Roca \ No newline at end of file diff --git a/web_widget_remaining_days_exact_date/readme/DESCRIPTION.rst b/web_widget_remaining_days_exact_date/readme/DESCRIPTION.md similarity index 85% rename from web_widget_remaining_days_exact_date/readme/DESCRIPTION.rst rename to web_widget_remaining_days_exact_date/readme/DESCRIPTION.md index 320025e9f885..439f3b70480f 100644 --- a/web_widget_remaining_days_exact_date/readme/DESCRIPTION.rst +++ b/web_widget_remaining_days_exact_date/readme/DESCRIPTION.md @@ -1 +1,2 @@ -This module allows displaying the exact date alongside the remaining days. \ No newline at end of file +This module allows displaying the exact date alongside the remaining +days. diff --git a/web_widget_remaining_days_exact_date/readme/USAGE.md b/web_widget_remaining_days_exact_date/readme/USAGE.md new file mode 100644 index 000000000000..41eeb01c5853 --- /dev/null +++ b/web_widget_remaining_days_exact_date/readme/USAGE.md @@ -0,0 +1,9 @@ +If in any case the exact date doesn't need to be displayed, we can +disable the functionality by adding options="{'exact_date': False}" to +the field that has the widget. + +**Example** + +``` xml + +``` diff --git a/web_widget_remaining_days_exact_date/readme/USAGE.rst b/web_widget_remaining_days_exact_date/readme/USAGE.rst deleted file mode 100644 index a764d75899b9..000000000000 --- a/web_widget_remaining_days_exact_date/readme/USAGE.rst +++ /dev/null @@ -1,9 +0,0 @@ -If in any case the exact date doesn't need to be displayed, we can disable the -functionality by adding `options="{'exact_date': False}"` to the field that has the -widget. - -**Example** - -.. code:: xml - - \ No newline at end of file diff --git a/web_widget_remaining_days_exact_date/static/description/index.html b/web_widget_remaining_days_exact_date/static/description/index.html index d5f2dbb1022f..46241be5fdb8 100644 --- a/web_widget_remaining_days_exact_date/static/description/index.html +++ b/web_widget_remaining_days_exact_date/static/description/index.html @@ -369,8 +369,9 @@

Web Widget Remaining Days Exact Date

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:a84ad30ebfaa64e7c8874579509890ef6e9fecfeac8202b233ddfc57b2dde5ca !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

-

This module allows displaying the exact date alongside the remaining days.

+

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

+

This module allows displaying the exact date alongside the remaining +days.

Important

This is an alpha version, the data model and design can change at any time without warning. @@ -392,9 +393,9 @@

Web Widget Remaining Days Exact Date

Usage

-

If in any case the exact date doesn’t need to be displayed, we can disable the -functionality by adding options=”{‘exact_date’: False}” to the field that has the -widget.

+

If in any case the exact date doesn’t need to be displayed, we can +disable the functionality by adding options=”{‘exact_date’: False}” to +the field that has the widget.

Example

 <field name="date_deadline" widget="remaining_days" options="{'exact_date': False}"/>
@@ -405,7 +406,7 @@ 

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.

+feedback.

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

@@ -437,7 +438,7 @@

Maintainers

promote its widespread use.

Current maintainer:

CarlosRoca13

-

This module is part of the OCA/web project on GitHub.

+

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.

From b28acbd65b4e002ecda2c1503392042adc0a8a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Le=C3=B3n?= Date: Mon, 5 Jan 2026 12:27:36 -0500 Subject: [PATCH 5/6] [MIG] web_widget_remaining_days_exact_date --- .../__manifest__.py | 5 ++-- .../src/remaining_days/remaining_days.esm.js | 29 ++++++++----------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/web_widget_remaining_days_exact_date/__manifest__.py b/web_widget_remaining_days_exact_date/__manifest__.py index a4c52a9937e6..c1eeb0dcb786 100644 --- a/web_widget_remaining_days_exact_date/__manifest__.py +++ b/web_widget_remaining_days_exact_date/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Web Widget Remaining Days Exact Date", "summary": "Allows displaying the exact date alongside the remaining days", - "version": "16.0.1.0.0", + "version": "18.0.1.0.0", "development_status": "Alpha", "website": "https://github.com/OCA/web", "author": "Tecnativa, Odoo Community Association (OCA)", @@ -13,8 +13,7 @@ "depends": ["web"], "assets": { "web.assets_backend": [ - "web_widget_remaining_days_exact_date/static/src/remaining_days" - "/remaining_days.esm.js", + "web_widget_remaining_days_exact_date/static/src/**/*", ], }, } diff --git a/web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js b/web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js index de8d8fcd5843..3b694602c3a9 100644 --- a/web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js +++ b/web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js @@ -1,26 +1,21 @@ -/** @odoo-module **/ /* Copyright 2024 Tecnativa - Carlos Roca * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ import {RemainingDaysField} from "@web/views/fields/remaining_days/remaining_days_field"; import {patch} from "@web/core/utils/patch"; import {sprintf} from "@web/core/utils/strings"; -patch( - RemainingDaysField.prototype, - "web_widget_remaining_days_exact_date.RemainingDaysField", - { - get diffString() { - var value = this._super(...arguments); - // 99 is hardcoded because Odoo uses this value to display the exact - // date at this point - // https://github.com/odoo/odoo/blob/9cb802340f7a769327e9e5f0c4085cb837269551/addons/web/static/src/views/fields/remaining_days/remaining_days_field.js#L42 - if (value && this.props.exact_date && Math.abs(this.diffDays) <= 99) { - value = sprintf("%s (%s)", value, this.formattedValue); - } - return value; - }, - } -); +patch(RemainingDaysField.prototype, { + get diffString() { + var value = super.diffString; + // 99 is hardcoded because Odoo uses this value to display the exact + // date at this point + // https://github.com/odoo/odoo/blob/9cb802340f7a769327e9e5f0c4085cb837269551/addons/web/static/src/views/fields/remaining_days/remaining_days_field.js#L42 + if (value && this.props.exact_date && Math.abs(this.diffDays) <= 99) { + value = sprintf("%s (%s)", value, this.formattedValue); + } + return value; + }, +}); RemainingDaysField.props = { ...RemainingDaysField.props, exact_date: {type: Boolean, optional: true}, From 604c6ec0fa3e777514a63a2fdcb76bd537c4d06a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Le=C3=B3n?= Date: Mon, 5 Jan 2026 12:43:01 -0500 Subject: [PATCH 6/6] [IMP] Improvement to the web_widget_remaining_days_exact_date module --- .../README.rst | 32 ++- .../__init__.py | 2 + .../__manifest__.py | 18 +- .../i18n/it.po | 14 -- .../web_widget_remaining_days_exact_date.pot | 13 -- .../models/__init__.py | 4 + .../models/disable_remaining_days_rule.py | 208 ++++++++++++++++++ .../models/ir_http.py | 14 ++ .../models/res_company.py | 13 ++ .../models/res_config_settings.py | 13 ++ .../readme/CONTRIBUTORS.md | 2 + .../readme/DESCRIPTION.md | 1 + .../disable_remaining_days_security.xml | 8 + .../security/ir.model.access.csv | 5 + .../static/description/index.html | 41 ++-- .../src/remaining_days/remaining_days.esm.js | 37 ---- .../src/widgets/remaining_days_fields.esm.js | 47 ++++ .../tests/__init__.py | 1 + .../tests/test_main.py | 108 +++++++++ .../disable_remaining_days_rule_views.xml | 43 ++++ .../views/res_config_settings_views.xml | 26 +++ .../wizards/__init__.py | 2 + ...disable_remaining_days_rule_line_wizard.py | 32 +++ .../disable_remaining_days_rule_wizard.py | 36 +++ ...sable_remaining_days_rule_wizard_views.xml | 33 +++ 25 files changed, 659 insertions(+), 94 deletions(-) delete mode 100644 web_widget_remaining_days_exact_date/i18n/it.po delete mode 100644 web_widget_remaining_days_exact_date/i18n/web_widget_remaining_days_exact_date.pot create mode 100644 web_widget_remaining_days_exact_date/models/__init__.py create mode 100644 web_widget_remaining_days_exact_date/models/disable_remaining_days_rule.py create mode 100644 web_widget_remaining_days_exact_date/models/ir_http.py create mode 100644 web_widget_remaining_days_exact_date/models/res_company.py create mode 100644 web_widget_remaining_days_exact_date/models/res_config_settings.py create mode 100644 web_widget_remaining_days_exact_date/security/disable_remaining_days_security.xml create mode 100644 web_widget_remaining_days_exact_date/security/ir.model.access.csv delete mode 100644 web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js create mode 100644 web_widget_remaining_days_exact_date/static/src/widgets/remaining_days_fields.esm.js create mode 100644 web_widget_remaining_days_exact_date/tests/__init__.py create mode 100644 web_widget_remaining_days_exact_date/tests/test_main.py create mode 100644 web_widget_remaining_days_exact_date/views/disable_remaining_days_rule_views.xml create mode 100644 web_widget_remaining_days_exact_date/views/res_config_settings_views.xml create mode 100644 web_widget_remaining_days_exact_date/wizards/__init__.py create mode 100644 web_widget_remaining_days_exact_date/wizards/disable_remaining_days_rule_line_wizard.py create mode 100644 web_widget_remaining_days_exact_date/wizards/disable_remaining_days_rule_wizard.py create mode 100644 web_widget_remaining_days_exact_date/wizards/disable_remaining_days_rule_wizard_views.xml diff --git a/web_widget_remaining_days_exact_date/README.rst b/web_widget_remaining_days_exact_date/README.rst index 0a33a08c0447..c50f4e0853c4 100644 --- a/web_widget_remaining_days_exact_date/README.rst +++ b/web_widget_remaining_days_exact_date/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ==================================== Web Widget Remaining Days Exact Date ==================================== @@ -7,29 +11,29 @@ Web Widget Remaining Days Exact Date !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:a84ad30ebfaa64e7c8874579509890ef6e9fecfeac8202b233ddfc57b2dde5ca + !! source digest: sha256:04e1fccbb2fb34f3070c1a479bc49f65e0887e6e898f9b7da33911a3e1c85669 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png :target: https://odoo-community.org/page/development-status :alt: Alpha -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-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/18.0/web_widget_remaining_days_exact_date + :target: https://github.com/OCA/web/tree/TRESCLOUD:18.0-mig-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date :alt: OCA/web .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_widget_remaining_days_exact_date + :target: https://translation.odoo-community.org/projects/web-TRESCLOUD:18-0-mig-web_widget_remaining_days_exact_date/web-TRESCLOUD:18-0-mig-web_widget_remaining_days_exact_date-web_widget_remaining_days_exact_date :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=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=TRESCLOUD:18.0-mig-web_widget_remaining_days_exact_date :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| This module allows displaying the exact date alongside the remaining -days. +days. You can also control it by model, view, or specific field. .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. @@ -60,7 +64,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -71,6 +75,7 @@ Authors ------- * Tecnativa +* Trescloud Contributors ------------ @@ -80,6 +85,10 @@ Contributors - Pedro M. Baeza - Carlos Roca +- `Trescloud `__ + + - César León + Maintainers ----------- @@ -96,11 +105,14 @@ promote its widespread use. .. |maintainer-CarlosRoca13| image:: https://github.com/CarlosRoca13.png?size=40px :target: https://github.com/CarlosRoca13 :alt: CarlosRoca13 +.. |maintainer-CILC98| image:: https://github.com/CILC98.png?size=40px + :target: https://github.com/CILC98 + :alt: CILC98 -Current `maintainer `__: +Current `maintainers `__: -|maintainer-CarlosRoca13| +|maintainer-CarlosRoca13| |maintainer-CILC98| -This module is part of the `OCA/web `_ project on GitHub. +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_widget_remaining_days_exact_date/__init__.py b/web_widget_remaining_days_exact_date/__init__.py index e69de29bb2d1..976591c996e1 100644 --- a/web_widget_remaining_days_exact_date/__init__.py +++ b/web_widget_remaining_days_exact_date/__init__.py @@ -0,0 +1,2 @@ +from . import wizards +from . import models diff --git a/web_widget_remaining_days_exact_date/__manifest__.py b/web_widget_remaining_days_exact_date/__manifest__.py index c1eeb0dcb786..1eb11d8f6518 100644 --- a/web_widget_remaining_days_exact_date/__manifest__.py +++ b/web_widget_remaining_days_exact_date/__manifest__.py @@ -1,5 +1,6 @@ -# Copyright 2024 Tecnativa - Carlos Roca -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0) +# Copyright 2025 Tecnativa - Carlos Roca +# Copyright 2025 Trescloud - César León +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Web Widget Remaining Days Exact Date", @@ -7,13 +8,20 @@ "version": "18.0.1.0.0", "development_status": "Alpha", "website": "https://github.com/OCA/web", - "author": "Tecnativa, Odoo Community Association (OCA)", - "maintainers": ["CarlosRoca13"], + "author": "Tecnativa, Trescloud, Odoo Community Association (OCA)", + "maintainers": ["CarlosRoca13", "CILC98"], "license": "AGPL-3", "depends": ["web"], + "data": [ + "security/disable_remaining_days_security.xml", + "security/ir.model.access.csv", + "views/disable_remaining_days_rule_views.xml", + "views/res_config_settings_views.xml", + "wizards/disable_remaining_days_rule_wizard_views.xml", + ], "assets": { "web.assets_backend": [ "web_widget_remaining_days_exact_date/static/src/**/*", - ], + ] }, } diff --git a/web_widget_remaining_days_exact_date/i18n/it.po b/web_widget_remaining_days_exact_date/i18n/it.po deleted file mode 100644 index 73388557f6d5..000000000000 --- a/web_widget_remaining_days_exact_date/i18n/it.po +++ /dev/null @@ -1,14 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" -"Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" diff --git a/web_widget_remaining_days_exact_date/i18n/web_widget_remaining_days_exact_date.pot b/web_widget_remaining_days_exact_date/i18n/web_widget_remaining_days_exact_date.pot deleted file mode 100644 index 78d58d53fe07..000000000000 --- a/web_widget_remaining_days_exact_date/i18n/web_widget_remaining_days_exact_date.pot +++ /dev/null @@ -1,13 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# -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" diff --git a/web_widget_remaining_days_exact_date/models/__init__.py b/web_widget_remaining_days_exact_date/models/__init__.py new file mode 100644 index 000000000000..012bd1ed454b --- /dev/null +++ b/web_widget_remaining_days_exact_date/models/__init__.py @@ -0,0 +1,4 @@ +from . import disable_remaining_days_rule +from . import res_company +from . import res_config_settings +from . import ir_http diff --git a/web_widget_remaining_days_exact_date/models/disable_remaining_days_rule.py b/web_widget_remaining_days_exact_date/models/disable_remaining_days_rule.py new file mode 100644 index 000000000000..281802e0486a --- /dev/null +++ b/web_widget_remaining_days_exact_date/models/disable_remaining_days_rule.py @@ -0,0 +1,208 @@ +import ast + +from odoo import Command, _, api, fields, models + + +class DisableRemainingDaysRule(models.Model): + _name = "disable.remaining.days.rule" + _description = "Disable Remaining Days Rule" + + res_model_id = fields.Many2one( + "ir.model", + string="Model", + required=True, + ondelete="cascade", + copy=False, + help="Select the model where you want to disable the remaining days widget.", + ) + res_model_name = fields.Char( + related="res_model_id.model", + string="Technical model name", + store=True, + ) + active = fields.Boolean(string="Active record", default=True) + company_id = fields.Many2one( + "res.company", + required=True, + default=lambda self: self.env.company, + string="Company", + ) + diseable_view_types = fields.Char( + string="Disable View Types", + compute="_compute_diseable_view_types", + store=True, + help="Name of the view types where the remaining days widget will be disabled.", + ) + diseable_view_types_json = fields.Char( + string="Disable View Types JSON", + readonly=True, + help="JSON representation of the view types where the remaining days" + " widget will be disabled. {'list': List, 'form': Form}", + ) + date_type_fields_ids = fields.Many2many( + "ir.model.fields", + string="Date/Datetime Fields", + help="Select the date/datetime fields of the model where you want to disable" + " the remaining days widget.", + domain="[('model_id', '=', res_model_id)," + " ('ttype', 'in', ['date', 'datetime'])]", + copy=False, + ) + + @api.depends("diseable_view_types_json") + def _compute_diseable_view_types(self): + """ + Get Values of diseable_view_types_json + """ + for record in self: + # Convert chart to json array + diseable_view_types_json = ast.literal_eval( + record.diseable_view_types_json or "{}" + ) + # Get values of dict + view_types = [] + for value in diseable_view_types_json.values(): + if value: + view_types.append(value) + record.diseable_view_types = ", ".join(view_types) + + @api.constrains("res_model_id") + def _constrains_res_model_id(self): + """Ensure that there is only one rule per model""" + for record in self: + domain = [ + ("res_model_id", "=", record.res_model_id.id), + ("id", "!=", record.id), + ("company_id", "=", record.company_id.id), + ] + if self.search_count(domain) > 0: + raise models.ValidationError( + self.env._( + "There is already a rule for the model '%s'." + " You cannot create two rules for the same model.", + record.res_model_id.name, + ) + ) + + @api.onchange("res_model_id") + def _onchange_res_model_id(self): + """ " On change of the model, reset the date field""" + for record in self: + record.date_type_fields_ids = False + + def action_open_set_disable_remaining_days_rule_wizard(self): + """ + Open the wizard to set the disable remaining days rule + """ + self.ensure_one() + model_id = self.res_model_id + view_ids = model_id.view_ids + if not view_ids: + raise models.ValidationError( + _( + "The model '%s' does not have any views." + " You cannot set the disable remaining days rule by view type" + " for this model." + ) + % model_id.name + ) + IrUiView = self.env["ir.ui.view"] + # Get selection from ir.ui.view. + selection = IrUiView._fields["type"].selection + view_types = [] + for technical_name, name in selection: + selected = technical_name in ast.literal_eval( + self.diseable_view_types_json or "{}" + ) + view_types.append((name, technical_name, selected)) + wizard_id = ( + self.env["disable.remaining.days.rule.wizard"] + .sudo() + .create( + { + "disable_remaining_days_rule_id": self.id, + "line_ids": [ + Command.create( + { + "name": name, + "technical_name": technical_name, + "selected": selected, + }, + ) + for name, technical_name, selected in view_types + ], + } + ) + ) + # Return wizard created + return { + "type": "ir.actions.act_window", + "view_mode": "form", + "res_model": "disable.remaining.days.rule.wizard", + "target": "new", + "res_id": wizard_id.id, + } + + @api.model + def get_all_rules(self): + """ + Get all rules like {'model_name': active} + """ + # Return one rule per model if some company has it active + rules_ids = self.search([]) + if self.get_disable_all_models(): + # If all models are disabled, return True for all + return True + rules = {} + for rule in rules_ids: + view_types = rule.get_data_by_view_type() + fields = rule.get_data_by_field() + rules[rule.res_model_id.model] = { + "model": rule.get_data_by_model() + if not view_types and not fields + else False, + "view_types": view_types, + "fields": fields, + } + return rules + + def get_data_by_model(self): + """ + Get rule data for a specific model + """ + self.ensure_one() + return self.active + + def get_data_by_view_type(self): + """ + Get rule data for a specific model and view type + """ + self.ensure_one() + diseable_view_types_json = ast.literal_eval( + self.diseable_view_types_json or "{}" + ) + key_list = list(diseable_view_types_json.keys()) + if not key_list: + return [] + return key_list + + def get_data_by_field(self): + """ + Get rule data for a specific model and field + """ + self.ensure_one() + field_ids = self.date_type_fields_ids + if not field_ids: + return [] + return field_ids.mapped("name") + + @api.model + def get_disable_all_models(self): + """ + Get all models with the remaining days disabled + :return: list of model names + """ + disable_remaining_days = self.env.company.disable_remaining_days + if disable_remaining_days: + return True + return False diff --git a/web_widget_remaining_days_exact_date/models/ir_http.py b/web_widget_remaining_days_exact_date/models/ir_http.py new file mode 100644 index 000000000000..7aba4d7c9690 --- /dev/null +++ b/web_widget_remaining_days_exact_date/models/ir_http.py @@ -0,0 +1,14 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class IrHttp(models.AbstractModel): + _inherit = "ir.http" + + def session_info(self): + res = super().session_info() + res["disable_remaining_days_rule"] = self.env[ + "disable.remaining.days.rule" + ].get_all_rules() + return res diff --git a/web_widget_remaining_days_exact_date/models/res_company.py b/web_widget_remaining_days_exact_date/models/res_company.py new file mode 100644 index 000000000000..7c329a74e7ee --- /dev/null +++ b/web_widget_remaining_days_exact_date/models/res_company.py @@ -0,0 +1,13 @@ +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + disable_remaining_days = fields.Boolean( + string="Disable Remaining Days Widget", + company_dependent=True, + default=True, + groups="base.group_system", + help="If active, the remaining days widget will be disabled for all models.", + ) diff --git a/web_widget_remaining_days_exact_date/models/res_config_settings.py b/web_widget_remaining_days_exact_date/models/res_config_settings.py new file mode 100644 index 000000000000..6c75b774db71 --- /dev/null +++ b/web_widget_remaining_days_exact_date/models/res_config_settings.py @@ -0,0 +1,13 @@ +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + disable_remaining_days = fields.Boolean( + related="company_id.disable_remaining_days", + string="Disable Remaining Days", + help="If active, the remaining days widget will be disabled for all models.", + readonly=False, + groups="base.group_system", + ) diff --git a/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.md b/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.md index 6116b492380c..cff22a7dd902 100644 --- a/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.md +++ b/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.md @@ -1,3 +1,5 @@ - [Tecnativa](https://www.tecnativa.com) - Pedro M. Baeza - Carlos Roca +- [Trescloud](https://www.trescloud.com) + - César León \ No newline at end of file diff --git a/web_widget_remaining_days_exact_date/readme/DESCRIPTION.md b/web_widget_remaining_days_exact_date/readme/DESCRIPTION.md index 439f3b70480f..836f7c1fccba 100644 --- a/web_widget_remaining_days_exact_date/readme/DESCRIPTION.md +++ b/web_widget_remaining_days_exact_date/readme/DESCRIPTION.md @@ -1,2 +1,3 @@ This module allows displaying the exact date alongside the remaining days. +You can also control it by model, view, or specific field. \ No newline at end of file diff --git a/web_widget_remaining_days_exact_date/security/disable_remaining_days_security.xml b/web_widget_remaining_days_exact_date/security/disable_remaining_days_security.xml new file mode 100644 index 000000000000..ebd36c2e0471 --- /dev/null +++ b/web_widget_remaining_days_exact_date/security/disable_remaining_days_security.xml @@ -0,0 +1,8 @@ + + + + Disable Remaining Days Rule + + [('company_id', 'in', company_ids)] + + diff --git a/web_widget_remaining_days_exact_date/security/ir.model.access.csv b/web_widget_remaining_days_exact_date/security/ir.model.access.csv new file mode 100644 index 000000000000..5da86ca53abb --- /dev/null +++ b/web_widget_remaining_days_exact_date/security/ir.model.access.csv @@ -0,0 +1,5 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_disable_remaining_days_rule_user","access_disable_remaining_days_rule_user","model_disable_remaining_days_rule","base.group_user",1,0,0,0 +"access_disable_remaining_days_rule_manager","access_disable_remaining_days_rule_manager","model_disable_remaining_days_rule","base.group_system",1,1,1,1 +"access_disable_remaining_days_rule_wizard_manager","access_disable_remaining_days_rule_wizard_manager","model_disable_remaining_days_rule_wizard","base.group_system",1,1,1,1 +"access_disable_remaining_days_rule_line_wizard_manager","access_disable_remaining_days_rule_line_wizard_manager","model_disable_remaining_days_rule_line_wizard","base.group_system",1,1,0,0 diff --git a/web_widget_remaining_days_exact_date/static/description/index.html b/web_widget_remaining_days_exact_date/static/description/index.html index 46241be5fdb8..cf85142003b9 100644 --- a/web_widget_remaining_days_exact_date/static/description/index.html +++ b/web_widget_remaining_days_exact_date/static/description/index.html @@ -360,18 +360,23 @@ -
-

Web Widget Remaining Days Exact Date

+
+ + +Odoo Community Association + +
+

Web Widget Remaining Days Exact Date

-

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

+

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

This module allows displaying the exact date alongside the remaining -days.

+days. You can also control it by model, view, or specific field.

Important

This is an alpha version, the data model and design can change at any time without warning. @@ -392,7 +397,7 @@

Web Widget Remaining Days Exact Date

-

Usage

+

Usage

If in any case the exact date doesn’t need to be displayed, we can disable the functionality by adding options=”{‘exact_date’: False}” to the field that has the widget.

@@ -402,33 +407,38 @@

Usage

-

Bug Tracker

+

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.

+feedback.

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
  • +
  • Trescloud
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -436,12 +446,13 @@

Maintainers

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.

-

Current maintainer:

-

CarlosRoca13

-

This module is part of the OCA/web project on GitHub.

+

Current maintainers:

+

CarlosRoca13 CILC98

+

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_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js b/web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js deleted file mode 100644 index 3b694602c3a9..000000000000 --- a/web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright 2024 Tecnativa - Carlos Roca - * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ -import {RemainingDaysField} from "@web/views/fields/remaining_days/remaining_days_field"; -import {patch} from "@web/core/utils/patch"; -import {sprintf} from "@web/core/utils/strings"; - -patch(RemainingDaysField.prototype, { - get diffString() { - var value = super.diffString; - // 99 is hardcoded because Odoo uses this value to display the exact - // date at this point - // https://github.com/odoo/odoo/blob/9cb802340f7a769327e9e5f0c4085cb837269551/addons/web/static/src/views/fields/remaining_days/remaining_days_field.js#L42 - if (value && this.props.exact_date && Math.abs(this.diffDays) <= 99) { - value = sprintf("%s (%s)", value, this.formattedValue); - } - return value; - }, -}); -RemainingDaysField.props = { - ...RemainingDaysField.props, - exact_date: {type: Boolean, optional: true}, -}; -RemainingDaysField.defaultProps = { - ...RemainingDaysField.defaultProps, - exact_date: true, -}; -const superExtractProps = RemainingDaysField.extractProps; -RemainingDaysField.extractProps = ({attrs}) => { - var res = {}; - if (superExtractProps) { - res = superExtractProps({attrs}); - } - return { - ...res, - exact_date: attrs.options.exact_date, - }; -}; diff --git a/web_widget_remaining_days_exact_date/static/src/widgets/remaining_days_fields.esm.js b/web_widget_remaining_days_exact_date/static/src/widgets/remaining_days_fields.esm.js new file mode 100644 index 000000000000..0daa44317aee --- /dev/null +++ b/web_widget_remaining_days_exact_date/static/src/widgets/remaining_days_fields.esm.js @@ -0,0 +1,47 @@ +import {RemainingDaysField} from "@web/views/fields/remaining_days/remaining_days_field"; +import {patch} from "@web/core/utils/patch"; +import {session} from "@web/session"; + +patch(RemainingDaysField.prototype, { + setup() { + super.setup(...arguments); + this.disable_remaining_days_rule = session.disable_remaining_days_rule; + }, + /** + * @override + */ + get diffString() { + /* Check if the remaining days field is disabled for the current model */ + const disable_rules = this.disable_remaining_days_rule; + + // If disable_rules is boolean true, disable for all models + if (disable_rules === true) { + return this.formattedValue; + } + // Check by models + if ( + disable_rules && // Check if the config variable exists + this.props.record.resModel in disable_rules && // Check if the model is in the disable_rules + typeof disable_rules[this.props.record.resModel].model === "boolean" && // Check if the value is a boolean + disable_rules[this.props.record.resModel].model === true // Check if the value is true + ) { + return this.formattedValue; + } + // Check by view types + if ( + disable_rules && // Check if the config variable exists + this.props.record.resModel in disable_rules && // Check if the model is in the disable_rules + typeof disable_rules[this.props.record.resModel].view_types === "object" && // Check if the value is an list + (disable_rules[this.props.record.resModel].view_types.includes( + this.env.config.viewType + ) || // Check if the view type is in the list + disable_rules[this.props.record.resModel].fields.includes( + this.props.name + )) // Check if the field is in the list + ) { + return this.formattedValue; + } + + return super.diffString; + }, +}); diff --git a/web_widget_remaining_days_exact_date/tests/__init__.py b/web_widget_remaining_days_exact_date/tests/__init__.py new file mode 100644 index 000000000000..6c9812dc2f73 --- /dev/null +++ b/web_widget_remaining_days_exact_date/tests/__init__.py @@ -0,0 +1 @@ +from . import test_main diff --git a/web_widget_remaining_days_exact_date/tests/test_main.py b/web_widget_remaining_days_exact_date/tests/test_main.py new file mode 100644 index 000000000000..eea789a7c291 --- /dev/null +++ b/web_widget_remaining_days_exact_date/tests/test_main.py @@ -0,0 +1,108 @@ +from odoo import exceptions +from odoo.tests import tagged + +from odoo.addons.base.tests.common import BaseCommon + + +@tagged("post_install", "-at_install") +class TestWidgetRemainingDaysExactDate(BaseCommon): + def test_global_disable(self): + company_id = self.env.company + company_id.disable_remaining_days = True + response = self.env["disable.remaining.days.rule"].get_all_rules() + self.assertTrue(response) + company_id.disable_remaining_days = False + response = self.env["disable.remaining.days.rule"].get_all_rules() + self.assertFalse(response) + + def test_rule_per_model(self): + self.env.company.disable_remaining_days = False + model_name = "res.partner" + model = self.env["ir.model"].search([("model", "=", model_name)], limit=1) + self.env["disable.remaining.days.rule"].create( + { + "res_model_id": model.id, + "active": True, + } + ) + with self.assertRaises(exceptions.UserError) as e: + self.env["disable.remaining.days.rule"].create( + { + "res_model_id": model.id, + "active": True, + } + ) + # Check that creating another rule for the same model raises an error + self.assertIn("There is already a rule for the model", e.exception.args[0]) + # Check rules + # Expect: "{'res.partner': {'model': True, 'view_types': [], 'fields': []}}" + rules = self.env["disable.remaining.days.rule"].get_all_rules() + self.assertIn(model_name, rules) + self.assertTrue(rules[model_name]["model"]) + self.assertEqual(rules[model_name]["view_types"], []) + self.assertEqual(rules[model_name]["fields"], []) + + def test_rule_per_model_and_view_type(self): + self.env.company.disable_remaining_days = False + model_name = "res.partner" + model = self.env["ir.model"].search([("model", "=", model_name)], limit=1) + rule = self.env["disable.remaining.days.rule"].create( + { + "res_model_id": model.id, + "active": True, + } + ) + action = rule.action_open_set_disable_remaining_days_rule_wizard() + wizard = self.env["disable.remaining.days.rule.wizard"].browse(action["res_id"]) + # Activate 'form' and 'list' view types + for line in wizard.line_ids: + if line.technical_name in ["list", "form"]: + line.selected = True + wizard.action_define_remaining_days_rule_by_view_type() + # Check rules + # Expect: " + # { + # 'res.partner': { + # 'model': True, + # 'view_types': ['list', 'form'], + # 'fields': [] + # } + rules = self.env["disable.remaining.days.rule"].get_all_rules() + self.assertIn(model_name, rules) + self.assertFalse(rules[model_name]["model"]) + self.assertEqual(rules[model_name]["view_types"], ["list", "form"]) + self.assertEqual(rules[model_name]["fields"], []) + + def test_rule_per_model_and_fields(self): + self.env.company.disable_remaining_days = False + model_name = "ir.module.module" + model = self.env["ir.model"].search([("model", "=", model_name)], limit=1) + rule = self.env["disable.remaining.days.rule"].create( + { + "res_model_id": model.id, + "active": True, + } + ) + field_1 = self.env["ir.model.fields"].search( + [("model_id", "=", model.id), ("name", "=", "create_date")], limit=1 + ) + field_2 = self.env["ir.model.fields"].search( + [("model_id", "=", model.id), ("name", "=", "write_date")], limit=1 + ) + rule.date_type_fields_ids = [(6, 0, [field_1.id, field_2.id])] + # Check rules + # Expect: " + # { + # 'ir.module.module': { + # 'model': False, + # 'view_types': [], + # 'fields': ['create_date', 'write_date'] + # } + # }" + rules = self.env["disable.remaining.days.rule"].get_all_rules() + self.assertIn(model_name, rules) + self.assertFalse(rules[model_name]["model"]) + self.assertEqual(rules[model_name]["view_types"], []) + self.assertEqual( + sorted(rules[model_name]["fields"]), sorted(["create_date", "write_date"]) + ) diff --git a/web_widget_remaining_days_exact_date/views/disable_remaining_days_rule_views.xml b/web_widget_remaining_days_exact_date/views/disable_remaining_days_rule_views.xml new file mode 100644 index 000000000000..de33f2757c4b --- /dev/null +++ b/web_widget_remaining_days_exact_date/views/disable_remaining_days_rule_views.xml @@ -0,0 +1,43 @@ + + + + disable.remaining.days.rule.view.list + disable.remaining.days.rule + + + + + +