[IMP] models: in model/field reflection, trigger recomputations
This enables extensions of `ir.model` and `ir.model.fields` with computed fields without messing up too much with reflection itself.
This commit is contained in:
committed by
Géry Debongnie
parent
1c4661ee9d
commit
6b1f6aa1d4
+17
-11
@@ -289,7 +289,9 @@ class BaseModel(object):
|
||||
cr.execute(""" INSERT INTO ir_model (model, name, info, state, transient)
|
||||
VALUES (%(model)s, %(name)s, %(info)s, %(state)s, %(transient)s)
|
||||
RETURNING id """, params)
|
||||
model_id = cr.fetchone()[0]
|
||||
model = self.env['ir.model'].browse(cr.fetchone()[0])
|
||||
self._context['todo'].append((10, model.modified, [list(params)]))
|
||||
|
||||
if 'module' in self._context:
|
||||
xmlid = 'model_' + self._name.replace('.', '_')
|
||||
cr.execute("SELECT * FROM ir_model_data WHERE name=%s AND module=%s",
|
||||
@@ -297,7 +299,7 @@ class BaseModel(object):
|
||||
if not cr.rowcount:
|
||||
cr.execute(""" INSERT INTO ir_model_data (name, date_init, date_update, module, model, res_id)
|
||||
VALUES (%s, (now() at time zone 'UTC'), (now() at time zone 'UTC'), %s, %s, %s) """,
|
||||
(xmlid, self._context['module'], 'ir.model', model_id))
|
||||
(xmlid, self._context['module'], 'ir.model', model.id))
|
||||
|
||||
# create/update the entries in 'ir.model.fields' and 'ir.model.data'
|
||||
cr.execute("SELECT * FROM ir_model_fields WHERE model=%s", (self._name,))
|
||||
@@ -309,7 +311,7 @@ class BaseModel(object):
|
||||
model_fields = sorted(self._fields.itervalues(), key=lambda field: field.type == 'sparse')
|
||||
for field in model_fields:
|
||||
vals = {
|
||||
'model_id': model_id,
|
||||
'model_id': model.id,
|
||||
'model': self._name,
|
||||
'name': field.name,
|
||||
'field_description': field.string,
|
||||
@@ -344,6 +346,8 @@ class BaseModel(object):
|
||||
)
|
||||
cr.execute(query, vals)
|
||||
field_id = cr.fetchone()[0]
|
||||
self._context['todo'].append((20, Fields.browse(field_id).modified, [list(vals)]))
|
||||
|
||||
module = field._module or self._context.get('module')
|
||||
if module:
|
||||
xmlid = 'field_%s_%s' % (self._table, field.name)
|
||||
@@ -353,15 +357,17 @@ class BaseModel(object):
|
||||
cr.execute(""" INSERT INTO ir_model_data (name, date_init, date_update, module, model, res_id)
|
||||
VALUES (%s, (now() at time zone 'UTC'), (now() at time zone 'UTC'), %s, %s, %s) """,
|
||||
(xmlid, module, 'ir.model.fields', field_id))
|
||||
else:
|
||||
if not all(cols[field.name][key] == vals[key] for key in vals):
|
||||
names = set(vals) - {'model', 'name'}
|
||||
query = "UPDATE ir_model_fields SET %s WHERE model=%%(model)s and name=%%(name)s" % (
|
||||
",".join("%s=%%(%s)s" % (name, name) for name in names),
|
||||
)
|
||||
cr.execute(query, vals)
|
||||
self.invalidate_cache()
|
||||
|
||||
elif not all(cols[field.name][key] == vals[key] for key in vals):
|
||||
names = set(vals) - {'model', 'name'}
|
||||
query = "UPDATE ir_model_fields SET %s WHERE model=%%(model)s AND name=%%(name)s RETURNING id" % (
|
||||
",".join("%s=%%(%s)s" % (name, name) for name in names),
|
||||
)
|
||||
cr.execute(query, vals)
|
||||
field_id = cr.fetchone()[0]
|
||||
self._context['todo'].append((20, Fields.browse(field_id).modified, [names]))
|
||||
|
||||
self.invalidate_cache()
|
||||
|
||||
@api.model
|
||||
def _add_field(self, name, field):
|
||||
|
||||
Reference in New Issue
Block a user