From 1d55f7137e1cbbc662b1e4db4afe2c82c7951a31 Mon Sep 17 00:00:00 2001 From: Aungkokolin1997 Date: Tue, 26 May 2026 03:53:26 +0000 Subject: [PATCH] [FIX] endpoint_route_handler: precompute=True on route field MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without precompute, the required computed field is evaluated after INSERT (during flush), so creating an endpoint whose route is derived from other fields by a downstream module fails with "Missing required value for the field 'Route'" — the INSERT runs before the compute can populate the column. --- .../models/endpoint_route_handler.py | 1 + endpoint_route_handler/tests/test_endpoint.py | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/endpoint_route_handler/models/endpoint_route_handler.py b/endpoint_route_handler/models/endpoint_route_handler.py index bba74a54..7fb1f821 100644 --- a/endpoint_route_handler/models/endpoint_route_handler.py +++ b/endpoint_route_handler/models/endpoint_route_handler.py @@ -22,6 +22,7 @@ class EndpointRouteHandler(models.AbstractModel): index=True, compute="_compute_route", inverse="_inverse_route", + precompute=True, readonly=False, store=True, copy=False, diff --git a/endpoint_route_handler/tests/test_endpoint.py b/endpoint_route_handler/tests/test_endpoint.py index 14901918..f488b442 100644 --- a/endpoint_route_handler/tests/test_endpoint.py +++ b/endpoint_route_handler/tests/test_endpoint.py @@ -2,6 +2,7 @@ # @author: Simone Orsi # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). from contextlib import contextmanager +from unittest.mock import patch from odoo import api, modules from odoo.tests import common @@ -50,6 +51,33 @@ def test_as_tool_base_data(self): new_route.route += "/new" self.assertNotEqual(new_route.endpoint_hash, first_hash) + def test_route_field_precomputed(self): + """``route`` is required + computed; precompute=True makes the compute + run before INSERT so downstream modules that derive ``route`` from + other fields don't get a "Missing required value" error at create + time. + + Self-contained verification: patch ``_compute_route`` to derive a + deterministic value (simulating what a downstream override would do), + then ``create()`` a record without passing ``route``. If precompute + fires before INSERT, the derived value lands on the record. Without + precompute, INSERT would fail before ``_compute_route`` runs. + """ + Model = type(self.env["endpoint.route.handler.tool"]) + + def _fake_compute_route(self): + for rec in self: + rec.route = "/precompute/probe" + + with patch.object(Model, "_compute_route", _fake_compute_route): + rec = self.env["endpoint.route.handler.tool"].create( + { + "name": "Precompute test", + "request_method": "GET", + } + ) + self.assertEqual(rec.route, "/precompute/probe") + @mute_logger("odoo.addons.base.models.ir_http") def test_as_tool_register_single_controller(self): new_route = make_new_route(self.env)