From 83f19740afbcf77feefbb4d4df1579d113ea28a9 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Fri, 28 Nov 2025 11:44:49 +0500 Subject: [PATCH 01/20] =?UTF-8?q?[ADD]=20tg=5Fwebsite=5Fsale=5Frenting:=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tg_website_sale_renting/README.rst | 25 ++++++++++++++++++ tg_website_sale_renting/__init__.py | 1 + tg_website_sale_renting/__manifest__.py | 15 +++++++++++ tg_website_sale_renting/models/__init__.py | 3 +++ .../models/product_template.py | 15 +++++++++++ tg_website_sale_renting/models/res_company.py | 8 ++++++ .../models/res_config_settings.py | 13 ++++++++++ tg_website_sale_renting/pyproject.toml | 3 +++ .../views/res_config_settings_views.xml | 26 +++++++++++++++++++ 9 files changed, 109 insertions(+) create mode 100644 tg_website_sale_renting/README.rst create mode 100644 tg_website_sale_renting/__init__.py create mode 100644 tg_website_sale_renting/__manifest__.py create mode 100644 tg_website_sale_renting/models/__init__.py create mode 100644 tg_website_sale_renting/models/product_template.py create mode 100644 tg_website_sale_renting/models/res_company.py create mode 100644 tg_website_sale_renting/models/res_config_settings.py create mode 100644 tg_website_sale_renting/pyproject.toml create mode 100644 tg_website_sale_renting/views/res_config_settings_views.xml diff --git a/tg_website_sale_renting/README.rst b/tg_website_sale_renting/README.rst new file mode 100644 index 00000000..60d3f593 --- /dev/null +++ b/tg_website_sale_renting/README.rst @@ -0,0 +1,25 @@ +===================================================== + eCommerce Rental modifications for Tribal Gathering +===================================================== + +_ + +__ + +Credits +======= + +Contributors +------------ + +* `Eugene Molotov `__ + +Sponsors +-------- + +* `IT-Projects LLC `__ + +Maintainers +----------- + +* `IT-Projects LLC `__ diff --git a/tg_website_sale_renting/__init__.py b/tg_website_sale_renting/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/tg_website_sale_renting/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/tg_website_sale_renting/__manifest__.py b/tg_website_sale_renting/__manifest__.py new file mode 100644 index 00000000..87d532ed --- /dev/null +++ b/tg_website_sale_renting/__manifest__.py @@ -0,0 +1,15 @@ +{ + "name": """eCommerce Rental modifications for Tribal Gathering""", + "version": "17.0.0.1.0", + "author": "IT-Projects LLC, Eugene Molotov", + "support": "it@it-projects.info", + "website": "https://github.com/it-projects-llc/tg-addons", + "license": "LGPL-3", + "depends": [ + "website_sale_renting", + ], + "data": [ + "views/res_config_settings_views.xml", + ], + "demo": [], +} diff --git a/tg_website_sale_renting/models/__init__.py b/tg_website_sale_renting/models/__init__.py new file mode 100644 index 00000000..9797edf9 --- /dev/null +++ b/tg_website_sale_renting/models/__init__.py @@ -0,0 +1,3 @@ +from . import product_template +from . import res_config_settings +from . import res_company diff --git a/tg_website_sale_renting/models/product_template.py b/tg_website_sale_renting/models/product_template.py new file mode 100644 index 00000000..2adb5484 --- /dev/null +++ b/tg_website_sale_renting/models/product_template.py @@ -0,0 +1,15 @@ +from odoo import api, models + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + @api.model + def _get_default_start_date(self, *args, **kw): + company = self.company_id or self.env.company + return company.renting_default_min_date + + @api.model + def _get_default_end_date(self, *args, **kw): + company = self.company_id or self.env.company + return company.renting_default_max_date diff --git a/tg_website_sale_renting/models/res_company.py b/tg_website_sale_renting/models/res_company.py new file mode 100644 index 00000000..ee95cc2a --- /dev/null +++ b/tg_website_sale_renting/models/res_company.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class Company(models.Model): + _inherit = "res.company" + + renting_default_min_date = fields.Date() + renting_default_max_date = fields.Date() diff --git a/tg_website_sale_renting/models/res_config_settings.py b/tg_website_sale_renting/models/res_config_settings.py new file mode 100644 index 00000000..ee176827 --- /dev/null +++ b/tg_website_sale_renting/models/res_config_settings.py @@ -0,0 +1,13 @@ +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + renting_default_min_date = fields.Date( + related="company_id.renting_default_min_date", readonly=False + ) + + renting_default_max_date = fields.Date( + related="company_id.renting_default_max_date", readonly=False + ) diff --git a/tg_website_sale_renting/pyproject.toml b/tg_website_sale_renting/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/tg_website_sale_renting/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/tg_website_sale_renting/views/res_config_settings_views.xml b/tg_website_sale_renting/views/res_config_settings_views.xml new file mode 100644 index 00000000..11ce9dfb --- /dev/null +++ b/tg_website_sale_renting/views/res_config_settings_views.xml @@ -0,0 +1,26 @@ + + + + res.config.settings.view.form.inherit.tg.website.sale.renting + res.config.settings + + + + + + + + + + + + + From 2b8c61061210ac7dc960aa328dbfe3f5054d8ffd Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Mon, 1 Dec 2025 11:12:07 +0500 Subject: [PATCH 02/20] =?UTF-8?q?[IMP]=20GitHub=20CI/CD:=20=D0=B3=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B0=D1=8F=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?enterprise=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cf5b7681..391b6a12 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,6 +32,7 @@ jobs: container: ${{ matrix.container }} name: ${{ matrix.name }} env: + ADDONS_PATH: ${{ matrix.addons_path }} EXCLUDE: ${{ matrix.exclude }} strategy: fail-fast: false @@ -39,10 +40,16 @@ jobs: include: - container: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest name: test with Odoo - exclude: tg_website_event_sale_commission + exclude: tg_website_event_sale_commission,tg_website_sale_renting + addons_path: /opt/odoo/addons - container: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest name: test with Odoo (no compat test) - exclude: test_compat_tg_addons,tg_website_event_sale_commission + exclude: test_compat_tg_addons,tg_website_event_sale_commission,tg_website_sale_renting + addons_path: /opt/odoo/addons + - container: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest + name: test with Odoo Enterprise + exclude: tg_website_event_sale_commission + addons_path: /opt/odoo/addons,./enterprise services: postgres: image: postgres:12.0 @@ -56,10 +63,19 @@ jobs: - uses: actions/checkout@v3 with: persist-credentials: false + - name: Clone enterprise + if: contains(matrix.addons_path, 'enterprise') + uses: actions/checkout@v3 + with: + repository: em230418/enterprise + path: enterprise + ref: "17.0" + token: ${{ secrets.ENTERPRISE_REPO_TOKEN }} + fetch-depth: 1 - name: Install addons and dependencies run: oca_install_addons - name: Check licenses - run: manifestoo -d . check-licenses + run: manifestoo -d . --select-exclude ${{ matrix.exclude}} check-licenses - name: Check development status run: manifestoo -d . check-dev-status --default-dev-status=Beta continue-on-error: true From 7cbbe67f19ba58eac31d446c729381bd8ba3b850 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Mon, 1 Dec 2025 11:37:04 +0500 Subject: [PATCH 03/20] temp fix --- .github/workflows/test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 391b6a12..5a302bde 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -72,6 +72,12 @@ jobs: ref: "17.0" token: ${{ secrets.ENTERPRISE_REPO_TOKEN }} fetch-depth: 1 + - name: fix oca_list_external_dependencies + if: false == contains(matrix.addons_path, 'enterprise') + run: | + rm /usr/local/bin/oca_list_external_dependencies + curl https://raw.githubusercontent.com/em230418/oca-ci/refs/heads/patch-1/bin/oca_list_external_dependencies > /usr/local/bin/oca_list_external_dependencies + chmod +x /usr/local/bin/oca_list_external_dependencies - name: Install addons and dependencies run: oca_install_addons - name: Check licenses From eae83c2a07d686d3f55cf7fa5238fe759b082550 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Fri, 5 Dec 2025 15:09:15 +0500 Subject: [PATCH 04/20] saved --- tg_website_sale_renting/README.rst | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tg_website_sale_renting/README.rst b/tg_website_sale_renting/README.rst index 60d3f593..83bc318c 100644 --- a/tg_website_sale_renting/README.rst +++ b/tg_website_sale_renting/README.rst @@ -2,9 +2,16 @@ eCommerce Rental modifications for Tribal Gathering ===================================================== -_ +Rental dates defaults +--------------------- -__ +- Settings -> Rental -> Rent online + +- Set following fields: + + * Renting Default Min Date + + * Renting Default Max Date Credits ======= @@ -17,7 +24,7 @@ Contributors Sponsors -------- -* `IT-Projects LLC `__ +* `Tribal Gathering `__ Maintainers ----------- From ac34547aee3d4952a83f9de1930a376ed5231ba5 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 09:48:21 +0500 Subject: [PATCH 05/20] sale renting --- tg_website_sale_renting/models/product_template.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tg_website_sale_renting/models/product_template.py b/tg_website_sale_renting/models/product_template.py index 2adb5484..0cca07fd 100644 --- a/tg_website_sale_renting/models/product_template.py +++ b/tg_website_sale_renting/models/product_template.py @@ -1,4 +1,4 @@ -from odoo import api, models +from odoo import api, fields, models class ProductTemplate(models.Model): @@ -6,10 +6,12 @@ class ProductTemplate(models.Model): @api.model def _get_default_start_date(self, *args, **kw): + # TODO: должна быть дата со временем company = self.company_id or self.env.company - return company.renting_default_min_date + return fields.Datetime.to_datetime(company.renting_default_min_date) @api.model def _get_default_end_date(self, *args, **kw): + # TODO: должна быть дата со временем company = self.company_id or self.env.company - return company.renting_default_max_date + return fields.Datetime.to_datetime(company.renting_default_max_date) From d1bef77f289045d1d9f1a263a95e2d50bf3a77bf Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 10:11:03 +0500 Subject: [PATCH 06/20] saved --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5a302bde..b341549d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -72,6 +72,7 @@ jobs: ref: "17.0" token: ${{ secrets.ENTERPRISE_REPO_TOKEN }} fetch-depth: 1 + persist-credentials: false - name: fix oca_list_external_dependencies if: false == contains(matrix.addons_path, 'enterprise') run: | From 463b65d21758c9b3c2715ac5c6cd74c45875c4db Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 10:13:05 +0500 Subject: [PATCH 07/20] saved --- .github/workflows/test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b341549d..90ae629c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -65,14 +65,13 @@ jobs: persist-credentials: false - name: Clone enterprise if: contains(matrix.addons_path, 'enterprise') - uses: actions/checkout@v3 + uses: actions/checkout@v6 with: repository: em230418/enterprise path: enterprise ref: "17.0" token: ${{ secrets.ENTERPRISE_REPO_TOKEN }} fetch-depth: 1 - persist-credentials: false - name: fix oca_list_external_dependencies if: false == contains(matrix.addons_path, 'enterprise') run: | From 8e7bc2ece3ddec580bea0c7e68045f9159affc08 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 10:14:29 +0500 Subject: [PATCH 08/20] saved --- .github/workflows/test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 90ae629c..1bdb3ce0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -64,8 +64,7 @@ jobs: with: persist-credentials: false - name: Clone enterprise - if: contains(matrix.addons_path, 'enterprise') - uses: actions/checkout@v6 + uses: actions/checkout@v3 with: repository: em230418/enterprise path: enterprise From 1a4d9e3e35913b92265f699953dac905322baab1 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 10:24:53 +0500 Subject: [PATCH 09/20] saved --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1bdb3ce0..8c6056d4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -64,12 +64,13 @@ jobs: with: persist-credentials: false - name: Clone enterprise + if: contains(matrix.addons_path, 'enterprise') uses: actions/checkout@v3 with: repository: em230418/enterprise path: enterprise ref: "17.0" - token: ${{ secrets.ENTERPRISE_REPO_TOKEN }} + ssh-key: ${{ secrets.ENTERPRISE_SSH_KEY }} fetch-depth: 1 - name: fix oca_list_external_dependencies if: false == contains(matrix.addons_path, 'enterprise') From 0d9b9f6cf8f3b77cfc8575ff0c1bc1cd472710eb Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 10:35:44 +0500 Subject: [PATCH 10/20] saved --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8c6056d4..073a0271 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -70,7 +70,7 @@ jobs: repository: em230418/enterprise path: enterprise ref: "17.0" - ssh-key: ${{ secrets.ENTERPRISE_SSH_KEY }} + token: ${{ github.token }} fetch-depth: 1 - name: fix oca_list_external_dependencies if: false == contains(matrix.addons_path, 'enterprise') From 67145fad6aa2587c3d6e9f432c0c5ed38a64466d Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 10:39:14 +0500 Subject: [PATCH 11/20] saved --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 073a0271..5a302bde 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -70,7 +70,7 @@ jobs: repository: em230418/enterprise path: enterprise ref: "17.0" - token: ${{ github.token }} + token: ${{ secrets.ENTERPRISE_REPO_TOKEN }} fetch-depth: 1 - name: fix oca_list_external_dependencies if: false == contains(matrix.addons_path, 'enterprise') From d81e67d07a07a7fee5eb5d2121ae120676c28ccd Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 11:01:48 +0500 Subject: [PATCH 12/20] renting --- tg_website_sale_renting/models/product_template.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tg_website_sale_renting/models/product_template.py b/tg_website_sale_renting/models/product_template.py index 0cca07fd..f4ff5494 100644 --- a/tg_website_sale_renting/models/product_template.py +++ b/tg_website_sale_renting/models/product_template.py @@ -6,12 +6,10 @@ class ProductTemplate(models.Model): @api.model def _get_default_start_date(self, *args, **kw): - # TODO: должна быть дата со временем company = self.company_id or self.env.company return fields.Datetime.to_datetime(company.renting_default_min_date) @api.model def _get_default_end_date(self, *args, **kw): - # TODO: должна быть дата со временем company = self.company_id or self.env.company return fields.Datetime.to_datetime(company.renting_default_max_date) From 2708076b6607f38caedbdea810480af5fb89abe3 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 11:11:58 +0500 Subject: [PATCH 13/20] fixup! renting --- tg_website_sale_renting/models/product_template.py | 4 ++-- tg_website_sale_renting/models/res_company.py | 4 ++-- tg_website_sale_renting/models/res_config_settings.py | 8 ++++---- .../views/res_config_settings_views.xml | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tg_website_sale_renting/models/product_template.py b/tg_website_sale_renting/models/product_template.py index f4ff5494..71ee3a28 100644 --- a/tg_website_sale_renting/models/product_template.py +++ b/tg_website_sale_renting/models/product_template.py @@ -7,9 +7,9 @@ class ProductTemplate(models.Model): @api.model def _get_default_start_date(self, *args, **kw): company = self.company_id or self.env.company - return fields.Datetime.to_datetime(company.renting_default_min_date) + return fields.Datetime.to_datetime(company.renting_default_start_date) @api.model def _get_default_end_date(self, *args, **kw): company = self.company_id or self.env.company - return fields.Datetime.to_datetime(company.renting_default_max_date) + return fields.Datetime.to_datetime(company.renting_default_end_date) diff --git a/tg_website_sale_renting/models/res_company.py b/tg_website_sale_renting/models/res_company.py index ee95cc2a..305b6e42 100644 --- a/tg_website_sale_renting/models/res_company.py +++ b/tg_website_sale_renting/models/res_company.py @@ -4,5 +4,5 @@ class Company(models.Model): _inherit = "res.company" - renting_default_min_date = fields.Date() - renting_default_max_date = fields.Date() + renting_default_start_date = fields.Date() + renting_default_end_date = fields.Date() diff --git a/tg_website_sale_renting/models/res_config_settings.py b/tg_website_sale_renting/models/res_config_settings.py index ee176827..b28b97ac 100644 --- a/tg_website_sale_renting/models/res_config_settings.py +++ b/tg_website_sale_renting/models/res_config_settings.py @@ -4,10 +4,10 @@ class ResConfigSettings(models.TransientModel): _inherit = "res.config.settings" - renting_default_min_date = fields.Date( - related="company_id.renting_default_min_date", readonly=False + renting_default_start_date = fields.Date( + related="company_id.renting_default_start_date", readonly=False ) - renting_default_max_date = fields.Date( - related="company_id.renting_default_max_date", readonly=False + renting_default_end_date = fields.Date( + related="company_id.renting_default_end_date", readonly=False ) diff --git a/tg_website_sale_renting/views/res_config_settings_views.xml b/tg_website_sale_renting/views/res_config_settings_views.xml index 11ce9dfb..02ea5a93 100644 --- a/tg_website_sale_renting/views/res_config_settings_views.xml +++ b/tg_website_sale_renting/views/res_config_settings_views.xml @@ -15,10 +15,10 @@ position="inside" > - + - + From 995758537e22e2565283e00635d40d44fe46e537 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 9 Dec 2025 11:31:07 +0500 Subject: [PATCH 14/20] fixup! fixup! renting --- tg_website_sale_renting/__manifest__.py | 1 + tg_website_sale_renting/models/product_template.py | 8 ++++++++ tg_website_sale_renting/models/res_company.py | 2 ++ .../models/res_config_settings.py | 8 ++++++++ tg_website_sale_renting/views/templates.xml | 13 +++++++++++++ 5 files changed, 32 insertions(+) create mode 100644 tg_website_sale_renting/views/templates.xml diff --git a/tg_website_sale_renting/__manifest__.py b/tg_website_sale_renting/__manifest__.py index 87d532ed..32ee43c4 100644 --- a/tg_website_sale_renting/__manifest__.py +++ b/tg_website_sale_renting/__manifest__.py @@ -9,6 +9,7 @@ "website_sale_renting", ], "data": [ + "views/templates.xml", "views/res_config_settings_views.xml", ], "demo": [], diff --git a/tg_website_sale_renting/models/product_template.py b/tg_website_sale_renting/models/product_template.py index 71ee3a28..b8d7118a 100644 --- a/tg_website_sale_renting/models/product_template.py +++ b/tg_website_sale_renting/models/product_template.py @@ -13,3 +13,11 @@ def _get_default_start_date(self, *args, **kw): def _get_default_end_date(self, *args, **kw): company = self.company_id or self.env.company return fields.Datetime.to_datetime(company.renting_default_end_date) + + def _get_renting_min_start_date(self): + company = self.company_id or self.env.company + return fields.Datetime.to_datetime(company.renting_min_start_date) + + def _get_renting_max_end_date(self): + company = self.company_id or self.env.company + return fields.Datetime.to_datetime(company.renting_max_end_date) diff --git a/tg_website_sale_renting/models/res_company.py b/tg_website_sale_renting/models/res_company.py index 305b6e42..21dc7888 100644 --- a/tg_website_sale_renting/models/res_company.py +++ b/tg_website_sale_renting/models/res_company.py @@ -6,3 +6,5 @@ class Company(models.Model): renting_default_start_date = fields.Date() renting_default_end_date = fields.Date() + renting_min_start_date = fields.Date() + renting_max_end_date = fields.Date() diff --git a/tg_website_sale_renting/models/res_config_settings.py b/tg_website_sale_renting/models/res_config_settings.py index b28b97ac..79817149 100644 --- a/tg_website_sale_renting/models/res_config_settings.py +++ b/tg_website_sale_renting/models/res_config_settings.py @@ -11,3 +11,11 @@ class ResConfigSettings(models.TransientModel): renting_default_end_date = fields.Date( related="company_id.renting_default_end_date", readonly=False ) + + renting_min_start_date = fields.Date( + related="company_id.renting_min_start_date", readonly=False + ) + + renting_max_end_date = fields.Date( + related="company_id.renting_max_end_date", readonly=False + ) diff --git a/tg_website_sale_renting/views/templates.xml b/tg_website_sale_renting/views/templates.xml new file mode 100644 index 00000000..70cb041f --- /dev/null +++ b/tg_website_sale_renting/views/templates.xml @@ -0,0 +1,13 @@ + + + + From ff42c91992219c64aa4099c73717948ab6440d9b Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Thu, 11 Dec 2025 10:25:10 +0500 Subject: [PATCH 15/20] fixup! fixup! fixup! renting --- tg_website_sale_renting/__manifest__.py | 5 ++ .../website_sale_renting_daterangepicker.js | 60 +++++++++++++++++++ .../views/res_config_settings_views.xml | 6 ++ tg_website_sale_renting/views/templates.xml | 10 ++-- 4 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js diff --git a/tg_website_sale_renting/__manifest__.py b/tg_website_sale_renting/__manifest__.py index 32ee43c4..b9b8f486 100644 --- a/tg_website_sale_renting/__manifest__.py +++ b/tg_website_sale_renting/__manifest__.py @@ -8,6 +8,11 @@ "depends": [ "website_sale_renting", ], + "assets": { + "web.assets_frontend": [ + "tg_website_sale_renting/static/src/js/*.js", + ], + }, "data": [ "views/templates.xml", "views/res_config_settings_views.xml", diff --git a/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js b/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js new file mode 100644 index 00000000..9f66beeb --- /dev/null +++ b/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js @@ -0,0 +1,60 @@ +/** @odoo-module **/ + +import {WebsiteSaleDaterangePicker} from "@website_sale_renting/js/website_sale_renting_daterangepicker"; +const {DateTime} = luxon; + +WebsiteSaleDaterangePicker.include({ + _initSaleRentingDateRangePicker(el) { + const hasDefaultDates = Boolean(this._hasDefaultDates()); + el.dataset.hasDefaultDates = hasDefaultDates; + // <-- changes start + const minStartDate = el.dataset.minStartDate; + const maxEndDate = el.dataset.maxEndDate; + // <-- changes end; + const value = + this.isShopDatePicker && !hasDefaultDates + ? ["", ""] + : [this.startDate, this.endDate]; + this.call( + "datetime_picker", + "create", + { + target: el, + pickerProps: { + value, + range: true, + type: this._isDurationWithHours() ? "datetime" : "date", + minDate: + minStartDate || DateTime.min(DateTime.now(), this.startDate), + maxDate: + maxEndDate || + DateTime.max(DateTime.now().plus({years: 3}), this.endDate), + isDateValid: this._isValidDate.bind(this), + dayCellClass: (date) => this._isCustomDate(date).join(" "), + }, + onApply: ([start_date, end_date]) => { + this.startDate = start_date; + this.endDate = end_date; + this._verifyValidPeriod(); + this.$("input[name=renting_start_date]").change(); + this.$el.trigger("daterangepicker_apply", { + start_date, + end_date, + }); + }, + }, + () => [ + el.querySelector("input[name=renting_start_date]"), + el.querySelector("input[name=renting_end_date]"), + ] + ).enable(); + + // Removing the pointer event here to avoid updating templates in stable. + const inputElement = el.querySelector("input[name=renting_start_date]"); + if (inputElement?.disabled) { + inputElement.parentElement + .querySelector("div .input-group-text.cursor-pointer") + ?.classList.add("pe-none"); + } + }, +}); diff --git a/tg_website_sale_renting/views/res_config_settings_views.xml b/tg_website_sale_renting/views/res_config_settings_views.xml index 02ea5a93..47653be2 100644 --- a/tg_website_sale_renting/views/res_config_settings_views.xml +++ b/tg_website_sale_renting/views/res_config_settings_views.xml @@ -20,6 +20,12 @@ + + + + + + diff --git a/tg_website_sale_renting/views/templates.xml b/tg_website_sale_renting/views/templates.xml index 70cb041f..8346101d 100644 --- a/tg_website_sale_renting/views/templates.xml +++ b/tg_website_sale_renting/views/templates.xml @@ -1,13 +1,13 @@ From 91ed729c6dfecab2cb949ba535807c7620a43356 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Tue, 16 Dec 2025 16:39:57 +0500 Subject: [PATCH 16/20] saved --- tg_website_sale_renting/README.rst | 25 +++++++++++++++++-- .../models/product_template.py | 8 ++++-- .../website_sale_renting_daterangepicker.js | 17 +++++++------ 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/tg_website_sale_renting/README.rst b/tg_website_sale_renting/README.rst index 83bc318c..4c57ac5c 100644 --- a/tg_website_sale_renting/README.rst +++ b/tg_website_sale_renting/README.rst @@ -9,9 +9,30 @@ Rental dates defaults - Set following fields: - * Renting Default Min Date + * Renting Default Start Date - * Renting Default Max Date + * Renting Default End Date + + * Renting Min Start Date + + * Renting Max End Date + +Usage +----- + +After settings fields above: + +- Navigate to shop (/shop) + +- Choose existing renting product + +- RESULT: default dates are set from config + +- Choose other date range + +- RESULT: minimal start date is set from config + +- RESULT: maximal end date is set from config Credits ======= diff --git a/tg_website_sale_renting/models/product_template.py b/tg_website_sale_renting/models/product_template.py index b8d7118a..820b7942 100644 --- a/tg_website_sale_renting/models/product_template.py +++ b/tg_website_sale_renting/models/product_template.py @@ -7,12 +7,16 @@ class ProductTemplate(models.Model): @api.model def _get_default_start_date(self, *args, **kw): company = self.company_id or self.env.company - return fields.Datetime.to_datetime(company.renting_default_start_date) + return fields.Datetime.to_datetime( + company.renting_default_start_date + ) or super()._get_default_start_date(*args, **kw) @api.model def _get_default_end_date(self, *args, **kw): company = self.company_id or self.env.company - return fields.Datetime.to_datetime(company.renting_default_end_date) + return fields.Datetime.to_datetime( + company.renting_default_end_date + ) or super()._get_default_end_date(*args, **kw) def _get_renting_min_start_date(self): company = self.company_id or self.env.company diff --git a/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js b/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js index 9f66beeb..139aa6f7 100644 --- a/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js +++ b/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js @@ -1,6 +1,6 @@ /** @odoo-module **/ -import {WebsiteSaleDaterangePicker} from "@website_sale_renting/js/website_sale_renting_daterangepicker"; +import WebsiteSaleDaterangePicker from "@website_sale_renting/js/website_sale_renting_daterangepicker"; const {DateTime} = luxon; WebsiteSaleDaterangePicker.include({ @@ -8,8 +8,8 @@ WebsiteSaleDaterangePicker.include({ const hasDefaultDates = Boolean(this._hasDefaultDates()); el.dataset.hasDefaultDates = hasDefaultDates; // <-- changes start - const minStartDate = el.dataset.minStartDate; - const maxEndDate = el.dataset.maxEndDate; + const minStartDate = DateTime.fromSQL(el.dataset.minStartDate); + const maxEndDate = DateTime.fromSQL(el.dataset.maxEndDate); // <-- changes end; const value = this.isShopDatePicker && !hasDefaultDates @@ -24,11 +24,12 @@ WebsiteSaleDaterangePicker.include({ value, range: true, type: this._isDurationWithHours() ? "datetime" : "date", - minDate: - minStartDate || DateTime.min(DateTime.now(), this.startDate), - maxDate: - maxEndDate || - DateTime.max(DateTime.now().plus({years: 3}), this.endDate), + minDate: minStartDate.isValid() + ? minStartDate + : DateTime.min(DateTime.now(), this.startDate), + maxDate: maxEndDate.isValid() + ? maxEndDate + : DateTime.max(DateTime.now().plus({years: 3}), this.endDate), isDateValid: this._isValidDate.bind(this), dayCellClass: (date) => this._isCustomDate(date).join(" "), }, From 0596e102d0a8a4390fc28c6c28e9d346fd9a704b Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Wed, 17 Dec 2025 17:21:44 +0500 Subject: [PATCH 17/20] fixup! saved --- .../static/src/js/website_sale_renting_daterangepicker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js b/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js index 139aa6f7..e3d641a0 100644 --- a/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js +++ b/tg_website_sale_renting/static/src/js/website_sale_renting_daterangepicker.js @@ -24,10 +24,10 @@ WebsiteSaleDaterangePicker.include({ value, range: true, type: this._isDurationWithHours() ? "datetime" : "date", - minDate: minStartDate.isValid() + minDate: minStartDate.isValid ? minStartDate : DateTime.min(DateTime.now(), this.startDate), - maxDate: maxEndDate.isValid() + maxDate: maxEndDate.isValid ? maxEndDate : DateTime.max(DateTime.now().plus({years: 3}), this.endDate), isDateValid: this._isValidDate.bind(this), From dd416935d96eb9a1fd051ec5c4d4cb6dc94cb6b1 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Fri, 19 Dec 2025 14:53:34 +0500 Subject: [PATCH 18/20] fixup! fixup! saved --- tg_website_sale_renting/models/res_company.py | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/tg_website_sale_renting/models/res_company.py b/tg_website_sale_renting/models/res_company.py index 21dc7888..cbbcc481 100644 --- a/tg_website_sale_renting/models/res_company.py +++ b/tg_website_sale_renting/models/res_company.py @@ -1,4 +1,6 @@ -from odoo import fields, models +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +from odoo.tools.misc import format_date class Company(models.Model): @@ -8,3 +10,66 @@ class Company(models.Model): renting_default_end_date = fields.Date() renting_min_start_date = fields.Date() renting_max_end_date = fields.Date() + + @api.constrains( + "renting_default_start_date", + "renting_default_end_date", + "renting_min_start_date", + "renting_max_end_date", + ) + def _check_renting_dates_and_ranges(self): + def f(v): + return format_date(self.env, v) + + for c in self: + if ( + c.renting_min_start_date + and c.renting_max_end_date + and c.renting_min_start_date > c.renting_max_end_date + ): + raise ValidationError( + _( + "Renting minimal start date (%(min_start_date)s) cannot be greater than maximal end date (%(max_end_date)s)", + min_start_date=f(c.renting_min_start_date), + max_end_date=f(c.renting_max_end_date), + ) + ) + + if ( + c.renting_default_start_date + and c.renting_default_end_date + and c.renting_default_start_date > c.renting_default_end_date + ): + raise ValidationError( + _( + "Default renting start date (%(default_start_date)s) cannot be greater default renting end date (%(default_end_date)s)", + default_start_date=f(c.renting_default_start_date), + default_end_date=f(c.renting_default_end_date), + ) + ) + + if ( + c.renting_min_start_date + and c.renting_default_start_date + and c.renting_default_start_date < c.renting_min_start_date + ): + raise ValidationError( + _( + "Renting default start date (%(default_start_date)s) cannot be less than minimal start date (%(min_start_date)s)", + default_start_date=f(c.renting_default_start_date), + min_start_date=f(c.renting_min_start_date), + ) + ) + + if ( + c.renting_max_end_date + and c.renting_default_end_date + and c.renting_default_end_date > c.renting_max_end_date + ): + raise ValidationError( + _( + "Renting default end date (%(default_end_date)s) cannot be greater than maximal end date (%(max_end_date)s)", + default_end_date=f(c.renting_default_end_date), + max_end_date=f(c.renting_max_end_date), + ) + ) From 007a3edd2338ef309a19d497ff0cfbf9989ac281 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Fri, 19 Dec 2025 20:12:08 +0500 Subject: [PATCH 19/20] fixup! fixup! fixup! saved --- tg_website_sale_renting/models/res_company.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tg_website_sale_renting/models/res_company.py b/tg_website_sale_renting/models/res_company.py index cbbcc481..161098e6 100644 --- a/tg_website_sale_renting/models/res_company.py +++ b/tg_website_sale_renting/models/res_company.py @@ -29,7 +29,7 @@ def f(v): ): raise ValidationError( _( - "Renting minimal start date (%(min_start_date)s) cannot be greater than maximal end date (%(max_end_date)s)", + "Renting minimal start date (%(min_start_date)s) cannot be greater than maximal end date (%(max_end_date)s)", # noqa: E501 min_start_date=f(c.renting_min_start_date), max_end_date=f(c.renting_max_end_date), ) @@ -42,7 +42,7 @@ def f(v): ): raise ValidationError( _( - "Default renting start date (%(default_start_date)s) cannot be greater default renting end date (%(default_end_date)s)", + "Default renting start date (%(default_start_date)s) cannot be greater default renting end date (%(default_end_date)s)", # noqa: E501 default_start_date=f(c.renting_default_start_date), default_end_date=f(c.renting_default_end_date), ) @@ -55,7 +55,7 @@ def f(v): ): raise ValidationError( _( - "Renting default start date (%(default_start_date)s) cannot be less than minimal start date (%(min_start_date)s)", + "Renting default start date (%(default_start_date)s) cannot be less than minimal start date (%(min_start_date)s)", # noqa: E501 default_start_date=f(c.renting_default_start_date), min_start_date=f(c.renting_min_start_date), ) @@ -68,7 +68,7 @@ def f(v): ): raise ValidationError( _( - "Renting default end date (%(default_end_date)s) cannot be greater than maximal end date (%(max_end_date)s)", + "Renting default end date (%(default_end_date)s) cannot be greater than maximal end date (%(max_end_date)s)", # noqa: E501 default_end_date=f(c.renting_default_end_date), max_end_date=f(c.renting_max_end_date), ) From 4baff1e312a2e4834bc16df67350745ee437474f Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Mon, 22 Dec 2025 16:25:16 +0500 Subject: [PATCH 20/20] fixup! fixup! fixup! fixup! saved --- tg_website_sale_renting/models/res_company.py | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/tg_website_sale_renting/models/res_company.py b/tg_website_sale_renting/models/res_company.py index 161098e6..7b88f596 100644 --- a/tg_website_sale_renting/models/res_company.py +++ b/tg_website_sale_renting/models/res_company.py @@ -12,12 +12,10 @@ class Company(models.Model): renting_max_end_date = fields.Date() @api.constrains( - "renting_default_start_date", - "renting_default_end_date", "renting_min_start_date", "renting_max_end_date", ) - def _check_renting_dates_and_ranges(self): + def _check_renting_dates_and_ranges1(self): def f(v): return format_date(self.env, v) @@ -35,6 +33,15 @@ def f(v): ) ) + @api.constrains( + "renting_default_start_date", + "renting_default_end_date", + ) + def _check_renting_dates_and_ranges2(self): + def f(v): + return format_date(self.env, v) + + for c in self: if ( c.renting_default_start_date and c.renting_default_end_date @@ -48,6 +55,15 @@ def f(v): ) ) + @api.constrains( + "renting_default_start_date", + "renting_min_start_date", + ) + def _check_renting_dates_and_ranges3(self): + def f(v): + return format_date(self.env, v) + + for c in self: if ( c.renting_min_start_date and c.renting_default_start_date @@ -61,6 +77,15 @@ def f(v): ) ) + @api.constrains( + "renting_default_end_date", + "renting_max_end_date", + ) + def _check_renting_dates_and_ranges4(self): + def f(v): + return format_date(self.env, v) + + for c in self: if ( c.renting_max_end_date and c.renting_default_end_date