Monday, August 3, 2026
1 change · saas-18.1
Resolved issues and error corrections
This fixes a crash that could occur when a custom or upgraded database had a reference-style relationship field missing required configuration. Users and upgrade processes can now open affected model views without hitting a server error, improving stability for uncommon customizations.
Original PR description
- without `model_field` M2O_reference field raising an error if linked with any O2M field - actually studio is not allowed to create M2O_reference field but using UI, created it and linked to O2M…
- without `model_field` M2O_reference field raising an error if linked with any O2M field
- actually studio is not allowed to create M2O_reference field but using UI, created it and linked to O2M field
- raising an TypeError for invalid argument at Domain()
- also raising an error while upgrade the databse having custom module with M2O_reference field, because upgrade is unable to read the `model_field` as it's not stored anywhere
- Steps to reproduce:
1. for saas:
- create M2O field for `ir.model.fields`
- create O2M field for `ir.model` link with above created M2O as inverse
- from UI create M2O_reference field for `ir.model.fields`
- replace inverse field for O2M field with M2O_reference field
- go for access the views of `Models`
2. for module:
- create M2O_reference field without passing `model_field`
- at O2M field set inverse the above created field
- go for access the view of model having O2M field
3. for upgrade:
- install custom module in version `18.0` with custom O2M field, But make sure the inverse of that field to be many2one_reference typed
- upgrade to `19.0`
- Error:
```py
Traceback (most recent call last):
File "/data/build/odoo/odoo/http.py", line 2329, in _serve_db
return service_model.retrying(serve_func, env=self.env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/service/model.py", line 188, in retrying
result = func()
^^^^^^
File "/data/build/odoo/odoo/http.py", line 2384, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/http.py", line 2599, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/addons/base/models/ir_http.py", line 353, in _dispatch
result = endpoint(**request.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/http.py", line 838, in route_wrapper
result = endpoint(self, *args, **params_ok)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/web/controllers/dataset.py", line 32, in call_kw
return call_kw(request.env[model], method, args, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/service/model.py", line 97, in call_kw
result = method(recs, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/enterprise/web_studio/models/models.py", line 10, in get_views
result = super().get_views(views, options=options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/enterprise/web_studio/models/ir_ui_view.py", line 52, in get_views
return super().get_views(views, options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/addons/base/models/ir_ui_view.py", line 2934, in get_views
v_type: self.get_view(
^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/addons/base/models/ir_ui_view.py", line 3169, in get_view
result = dict(self._get_view_cache(view_id, view_type, **options))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/tools/cache.py", line 98, in lookup
return self.lookup(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/tools/cache.py", line 156, in lookup
value = self.method(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/addons/base/models/ir_ui_view.py", line 3122, in _get_view_cache
arch, models = self._get_view_postprocessed(view, arch, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/addons/base/models/ir_ui_view.py", line 3061, in _get_view_postprocessed
return view.postprocess_and_fields(arch, model=self._name, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/addons/base/models/ir_ui_view.py", line 1307, in postprocess_and_fields
name_manager = self._postprocess_view(node, model or self.model, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/addons/base/models/ir_ui_view.py", line 1488, in _postprocess_view
postprocessor(node, name_manager, node_info)
File "/data/build/odoo/odoo/addons/base/models/ir_ui_view.py", line 1679, in _postprocess_tag_field
or node_info['editable'] and field._description_domain(self.env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/orm/fields_relational.py", line 131, in _description_domain
domain = self._internal_description_domain_raw(env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/orm/fields_relational.py", line 926, in _internal_description_domain_raw
additional_domain = self._additional_domain(env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/orm/fields_relational.py", line 918, in _additional_domain
return Domain(inverse_field.model_field, '=', self.model_name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/orm/domains.py", line 231, in __new__
raise TypeError(f"Domain() invalid arguments: {args!r}")
TypeError: Domain() invalid arguments: (None, '=', 'ir.model')
```
- we have couple of database are failing for the same reason
- TBG-[2409](https://upgrade.odoo.com/odoo/tbg/2409)
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr