Skip to content

Commit 0b16db2

Browse files
committed
[FIX] util/records:Mark records noupdate
If particular xml don't have noupdate marked but parent ``data`` node have noupdate in that case from update_records_from_xml creating record as noupdate ``false`` which is causing issue in future upgrade because it going for delete. For preventing such case adding noupdate flag to record and inherit created record acccoring to this commit odoo/odoo@ef709fd#diff-7144f88ea32f36feb17ce1b8dda7dee1631f5ada34075414587df3948c6b3d1bL4098-R4118 by that ``//data`` node or that ``xml node`` itself. use case: client db don't have the ``documents.document_internal_folder`` https://github.com/odoo/enterprise/blob/6c677f388c934e3fc545fc7cb2f9d65a958433da/documents/data/documents_document_data.xml#L2-L18 xmlid which is created when migrated to 18.0 from this script https://github.com/odoo/upgrade/blob/9327a2c12d9faf67d71f09bbe4d91e6105c75dca/migrations/documents/saas~17.5.1.4/post-migrate.py#L24 with noupdate false and because data node have noupdate true but particular xml don't have noupdate that is why it created as noupdate false and other inherit records also with noupdate and after migrating from onwards version related to that mail.alias records xml creating according to this https://github.com/odoo/odoo/blob/9822f5cd1fd3ac60689fc5e3101e5f6fa6a5722d/odoo/models.py#L5514 and later on version in 18.3 if related inherit model is changed but still some how use case of those records for preventing in that case. before upgrade ``` timer_test_document_test=# select * from ir_model_data where name like '%document_internal_folder%' ; id | create_uid | create_date | write_date | write_uid | res_id | noupdate | name | module | model ----+------------+-------------+------------+-----------+--------+----------+------+--------+------- (0 rows) ``` before fix ``` timer_test_document_test=# select * from ir_model_data where name like '%document_internal_folder%' ; id | create_uid | create_date | write_date | write_uid | res_id | noupdate | name | module | model -------+------------+----------------------------+----------------------------+-----------+--------+----------+-------------------------------------+-----------+-------------------- 39576 | | 2025-06-19 13:38:37.987267 | 2025-06-19 13:38:37.987267 | | 20 | f | document_internal_folder_mail_alias | documents | mail.alias 39577 | | 2025-06-19 13:38:37.987267 | 2025-06-19 13:38:37.987267 | | 20 | f | document_internal_folder | documents | documents.document ``` after fix ``` timer_test_document_test=# select * from ir_model_data where name like '%document_internal_folder%' ; id | create_uid | create_date | write_date | write_uid | res_id | noupdate | name | module | model -------+------------+----------------------------+----------------------------+-----------+--------+----------+-------------------------------------+-----------+-------------------- 39576 | | 2025-06-19 13:41:40.343454 | 2025-06-19 13:41:40.343454 | | 20 | t | document_internal_folder_mail_alias | documents | mail.alias 39577 | | 2025-06-19 13:41:40.343454 | 2025-06-19 13:41:40.343454 | | 20 | t | document_internal_folder | documents | documents.document ``` ``` Traceback (most recent call last): File "/home/odoo/src/odoo/saas-18.3/odoo/service/server.py", line 1396, in preload_registries registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update']) File "<decorator-gen-6>", line 2, in new File "/home/odoo/src/odoo/saas-18.3/odoo/tools/func.py", line 83, in locked return func(inst, *args, **kwargs) File "/home/odoo/src/odoo/saas-18.3/odoo/orm/registry.py", line 167, in new load_modules( File "/home/odoo/src/odoo/saas-18.3/odoo/modules/loading.py", line 509, in load_modules env['ir.model.data']._process_end(registry.updated_modules) File "/tmp/tmp2ipekce9/migrations/base/0.0.0/pre-models-no-model-data-delete.py", line 108, in _process_end return super(IrModelData, self)._process_end(modules) File "/home/odoo/src/odoo/saas-18.3/odoo/addons/base/models/ir_model.py", line 2589, in _process_end self._process_end_unlink_record(record) File "/home/odoo/src/odoo/saas-18.3/addons/website/models/ir_model_data.py", line 35, in _process_end_unlink_record return super()._process_end_unlink_record(record) File "/home/odoo/src/odoo/saas-18.3/odoo/addons/base/models/ir_model.py", line 2518, in _process_end_unlink_record record.unlink() File "/home/odoo/src/odoo/saas-18.3/odoo/orm/models.py", line 3913, in unlink cr.execute(SQL( File "/home/odoo/src/odoo/saas-18.3/odoo/sql_db.py", line 422, in execute self._obj.execute(query, params) psycopg2.errors.ForeignKeyViolation: update or delete on table "mail_alias" violates foreign key constraint "documents_document_alias_id_fkey" on table "documents_document" DETAIL: Key (id)=(40) is still referenced from table "documents_document". ``` upg-2987024 opw-4874805
1 parent 6ba49a9 commit 0b16db2

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

src/util/records.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -899,10 +899,10 @@ def force_noupdate(cr, xmlid, noupdate=True, warn=False):
899899
UPDATE ir_model_data
900900
SET noupdate = %s
901901
WHERE module = %s
902-
AND name = %s
902+
AND name ILIKE %s
903903
AND noupdate != %s
904904
""",
905-
[noupdate, module, name, noupdate],
905+
[noupdate, module, "{}%".format(name), noupdate],
906906
)
907907
if noupdate is False and cr.rowcount and warn:
908908
_logger.warning("Customizations on `%s` might be lost!", xmlid)
@@ -1107,8 +1107,9 @@ def __update_record_from_xml(
11071107
return
11081108
else:
11091109
# The xmlid doesn't already exists, nothing to reset
1110-
reset_write_metadata = noupdate = reset_translations = False
1110+
reset_write_metadata = reset_translations = False
11111111
fields = None
1112+
noupdate = True
11121113

11131114
write_data = None
11141115
if reset_write_metadata:
@@ -1152,7 +1153,6 @@ def add_ref(ref):
11521153
if fn.attrib["name"] not in fields:
11531154
node.remove(fn)
11541155
new_root[0].append(node)
1155-
11561156
if node.tag == "menuitem" and parent.tag == "menuitem" and "parent_id" not in node.attrib:
11571157
new_root[0].append(
11581158
lxml.builder.E.record(

0 commit comments

Comments
 (0)