[IMP] models: keep a consistent order for record metadata

When reading the metadata of a record, ensure the order is consistent.
The retrieval of ir.model.data is now done using an order=id query

Use the ORM to retrieve ir.model.data instead of making an SQL to clean old
code (introduced at b3b22afc68)

Closes #25658
This commit is contained in:
Florent de Labarre
2018-08-13 16:44:08 +02:00
committed by Martin Trigaux
parent 5038f068c0
commit d319160d3d
+13 -21
View File
@@ -2955,28 +2955,20 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
* xmlid: XML ID to use to refer to this record (if there is one), in format ``module.name``
* noupdate: A boolean telling if the record will be updated or not
"""
fields = ['id']
IrModelData = self.env['ir.model.data'].sudo()
if self._log_access:
fields += LOG_ACCESS_COLUMNS
quoted_table = '"%s"' % self._table
fields_str = ",".join('%s.%s' % (quoted_table, field) for field in fields)
query = '''SELECT %s, __imd.noupdate, __imd.module, __imd.name
FROM %s LEFT JOIN ir_model_data __imd
ON (__imd.model = %%s and __imd.res_id = %s.id)
WHERE %s.id IN %%s''' % (fields_str, quoted_table, quoted_table, quoted_table)
self._cr.execute(query, (self._name, tuple(self.ids)))
res = self._cr.dictfetchall()
uids = set(r[k] for r in res for k in ['write_uid', 'create_uid'] if r.get(k))
names = dict(self.env['res.users'].browse(uids).name_get())
res = self.sudo().read(LOG_ACCESS_COLUMNS)
else:
res = [{'id': x} for x in self.ids]
xml_data = dict((x['res_id'], x) for x in IrModelData.search_read([('model', '=', self._name),
('res_id', 'in', self.ids)],
['res_id', 'noupdate', 'module', 'name'],
order='id'))
for r in res:
for key in r:
value = r[key] = r[key] or False
if key in ('write_uid', 'create_uid') and value in names:
r[key] = (value, names[value])
r['xmlid'] = ("%(module)s.%(name)s" % r) if r['name'] else False
del r['name'], r['module']
value = xml_data.get(r['id'], {})
r['xmlid'] = '%(module)s.%(name)s' % value if value else False
r['noupdate'] = value.get('noupdate', False)
return res
@api.multi
@@ -4337,7 +4329,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
"""
result = {record.id: [] for record in self}
domain = [('model', '=', self._name), ('res_id', 'in', self.ids)]
for data in self.env['ir.model.data'].sudo().search_read(domain, ['module', 'name', 'res_id']):
for data in self.env['ir.model.data'].sudo().search_read(domain, ['module', 'name', 'res_id'], order='id'):
result[data['res_id']].append('%(module)s.%(name)s' % data)
return result