Hello everyone. While trying to upgrade a module from Odoo 13 to Odoo 14 (stock_split_picking to be exact), I found an error that I don't really understand and I can't figure how to fix it.
It's an error that happen when I want to install the module, and after hours of search on the Internet, hours of just reading Odoo's code in a hope of understanding what's happening... I just can't understand where is the problem, nothing seems to be anormal from what I've read on Odoo's Documentation on their website.
Here is my error :
Odoo Server ErrorTraceback (most recent call last): File "/opt/odoo/odoo/odoo/tools/convert.py", line 677, in _tag_root f(rec) File "/opt/odoo/odoo/odoo/tools/convert.py", line 580, in _tag_record record = model._load_records([data], self.mode == 'update') File "/opt/odoo/odoo/odoo/models.py", line 4185, in _load_records records = self._load_records_create([data['values'] for data in to_create]) File "/opt/odoo/odoo/odoo/models.py", line 4114, in _load_records_create return self.create(values) File "<decorator-gen-43>", line 2, in create File "/opt/odoo/odoo/odoo/api.py", line 345, in _model_create_multi return create(self, arg) File "/opt/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 482, in create return super(View, self).create(vals_list) File "<decorator-gen-65>", line 2, in create File "/opt/odoo/odoo/odoo/api.py", line 345, in _model_create_multi return create(self, arg) File "/opt/odoo/odoo/odoo/addons/base/models/ir_fields.py", line 508, in create recs = super().create(vals_list) File "<decorator-gen-13>", line 2, in create File "/opt/odoo/odoo/odoo/api.py", line 345, in _model_create_multi return create(self, arg) File "/opt/odoo/odoo/odoo/models.py", line 3875, in create fields[0].determine_inverse(batch_recs) File "/opt/odoo/odoo/odoo/fields.py", line 1128, in determine_inverse getattr(records, self.inverse)() File "/opt/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 300, in _inverse_arch view.write(data) File "/opt/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 500, in write res = super(View, self).write(self._compute_defaults(vals)) File "/opt/odoo/odoo/odoo/models.py", line 3664, in write real_recs._validate_fields(set(vals) - set(inverse_fields)) File "/opt/odoo/odoo/odoo/models.py", line 1249, in _validate_fields check(self) File "/opt/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 385, in _check_xml view_def = view.read_combined(['arch']) File "/opt/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 813, in read_combined arch = root.apply_view_inheritance(arch_tree, self.model) File "/opt/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 755, in apply_view_inheritance return self._apply_view_inheritance(source, inherit_tree) File "/opt/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 764, in _apply_view_inheritance source = view._apply_view_inheritance(source, inherit_tree) File "/opt/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 760, in _apply_view_inheritance arch_tree = etree.fromstring(view.arch.encode('utf-8')) File "src/lxml/lxml.etree.pyx", line 3213, in lxml.etree.fromstring (src/lxml/lxml.etree.c:79003) File "src/lxml/parser.pxi", line 1848, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:118334) File "src/lxml/parser.pxi", line 1736, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:117014) File "src/lxml/parser.pxi", line 1102, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:111258) File "src/lxml/parser.pxi", line 595, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:105102) File "src/lxml/parser.pxi", line 706, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:106810) File "src/lxml/parser.pxi", line 646, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:105956) File "<string>", line 0 lxml.etree.XMLSyntaxError: <no detail available> The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/opt/odoo/odoo/odoo/addons/base/models/ir_http.py", line 237, in _dispatch result = request.dispatch() File "/opt/odoo/odoo/odoo/http.py", line 683, in dispatch result = self._call_function(**self.params) File "/opt/odoo/odoo/odoo/http.py", line 359, in _call_function return checked_call(self.db, *args, **kwargs) File "/opt/odoo/odoo/odoo/service/model.py", line 94, in wrapper return f(dbname, *args, **kwargs) File "/opt/odoo/odoo/odoo/http.py", line 347, in checked_call result = self.endpoint(*a, **kw) File "/opt/odoo/odoo/odoo/http.py", line 912, in __call__ return self.method(*args, **kw) File "/opt/odoo/odoo/odoo/http.py", line 531, in response_wrap response = f(*args, **kw) File "/opt/odoo/odoo/addons/web/controllers/main.py", line 1367, in call_button action = self._call_kw(model, method, args, kwargs) File "/opt/odoo/odoo/addons/web/controllers/main.py", line 1355, in _call_kw return call_kw(request.env[model], method, args, kwargs) File "/opt/odoo/odoo/odoo/api.py", line 396, in call_kw result = _call_kw_multi(method, model, args, kwargs) File "/opt/odoo/odoo/odoo/api.py", line 383, in _call_kw_multi result = method(recs, *args, **kwargs) File "/opt/odoo/odoo/addons/gfi_base/models/ir_module_module.py", line 35, in button_immediate_install return super(IrModuleModule, self).button_immediate_install() File "<decorator-gen-72>", line 2, in button_immediate_install File "/opt/odoo/odoo/odoo/addons/base/models/ir_module.py", line 73, in check_and_log return method(self, *args, **kwargs) File "/opt/odoo/odoo/odoo/addons/base/models/ir_module.py", line 474, in button_immediate_install return self._button_immediate_function(type(self).button_install) File "/opt/odoo/odoo/odoo/addons/base/models/ir_module.py", line 592, in _button_immediate_function modules.registry.Registry.new(self._cr.dbname, update_module=True) File "/opt/odoo/odoo/odoo/modules/registry.py", line 89, in new odoo.modules.load_modules(registry._db, force_demo, status, update_module) File "/opt/odoo/odoo/odoo/modules/loading.py", line 455, in load_modules loaded_modules, update_module, models_to_check) File "/opt/odoo/odoo/odoo/modules/loading.py", line 348, in load_marked_modules perform_checks=perform_checks, models_to_check=models_to_check File "/opt/odoo/odoo/odoo/modules/loading.py", line 221, in load_module_graph load_data(cr, idref, mode, kind='data', package=package) File "/opt/odoo/odoo/odoo/modules/loading.py", line 69, in load_data tools.convert_file(cr, package.name, filename, idref, mode, noupdate, kind) File "/opt/odoo/odoo/odoo/tools/convert.py", line 733, in convert_file convert_xml_import(cr, module, fp, idref, mode, noupdate) File "/opt/odoo/odoo/odoo/tools/convert.py", line 799, in convert_xml_import obj.parse(doc.getroot()) File "/opt/odoo/odoo/odoo/tools/convert.py", line 719, in parse self._tag_root(de) File "/opt/odoo/odoo/odoo/tools/convert.py", line 677, in _tag_root f(rec) File "/opt/odoo/odoo/odoo/tools/convert.py", line 685, in _tag_root )) from e Exception The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/opt/odoo/odoo/odoo/http.py", line 639, in _handle_exception return super(JsonRequest, self)._handle_exception(exception) File "/opt/odoo/odoo/odoo/http.py", line 315, in _handle_exception raise exception.with_traceback(None) from new_cause odoo.tools.convert.ParseError: while parsing /opt/odoo/odoo/addons/stock/views/res_partner_views.xml:8, near <record id="view_partner_stock_form" model="ir.ui.view"> <field name="name">res.partner.stock.property.form.inherit</field> <field name="model">res.partner</field> <field name="inherit_id" ref="mail.res_partner_view_form_inherit_mail"/> <field name="arch" type="xml"> <xpath expr="//page[@name='sales_purchases']/group" position="inside"> <group name="container_row_stock" groups="base.group_no_one" priority="6"> <group string="Inventory" name="inventory" colspan="2"> <field name="property_stock_customer"/> <field name="property_stock_supplier"/> </group> </group> </xpath> </field> </record>
My first thought was that the xpath was bad, but the error is not the same as an xpath error. I already tried to delete this record for the installation, and then rewrite the record after having installing the module, and magic : the module can be upgraded without any error. Problem is that when we want to use the module, the error come again and make it impossible to use the module.
Do someone already saw this error, or can help me to figure how to fix it please ?