[FIX] models: improve rationale for the management of flag 'recompute' in context

When the context contains 'recompute': False, the recomputation was not even
prepared. Now both create() and write() prepare the recomputation by invoking
method modified(). The flag only controls whether method recompute() is invoked.
In addintion, the former flag 'no_store_function' was converted to the flag
'recompute', so that both create() and write() use the same flag.

Fixes #1456
This commit is contained in:
Raphael Collet 2014-08-18 11:53:13 +02:00
parent 62b0d99cfe
commit 052f9ed5d7
4 changed files with 9 additions and 14 deletions

View File

@ -1297,7 +1297,7 @@ class account_move_line(osv.osv):
self.create(cr, uid, data, context) self.create(cr, uid, data, context)
del vals['account_tax_id'] del vals['account_tax_id']
if check and not context.get('novalidate') and ((not context.get('no_store_function')) or journal.entry_posted): if check and not context.get('novalidate') and (context.get('recompute', True) or journal.entry_posted):
tmp = move_obj.validate(cr, uid, [vals['move_id']], context) tmp = move_obj.validate(cr, uid, [vals['move_id']], context)
if journal.entry_posted and tmp: if journal.entry_posted and tmp:
move_obj.button_validate(cr,uid, [vals['move_id']], context) move_obj.button_validate(cr,uid, [vals['move_id']], context)

View File

@ -137,7 +137,7 @@ class project_work(osv.osv):
amount = vals_line['unit_amount'] amount = vals_line['unit_amount']
prod_id = vals_line['product_id'] prod_id = vals_line['product_id']
unit = False unit = False
context = dict(context, no_store_function=False) context = dict(context, recompute=True)
timeline_id = timesheet_obj.create(cr, uid, vals_line, context=context) timeline_id = timesheet_obj.create(cr, uid, vals_line, context=context)
# Compute based on pricetype # Compute based on pricetype

View File

@ -3972,15 +3972,10 @@ class BaseModel(object):
record_id = tocreate[table].pop('id', None) record_id = tocreate[table].pop('id', None)
# When linking/creating parent records, force context without 'no_store_function' key that
# defers stored functions computing, as these won't be computed in batch at the end of create().
parent_context = dict(context)
parent_context.pop('no_store_function', None)
if record_id is None or not record_id: if record_id is None or not record_id:
record_id = self.pool[table].create(cr, user, tocreate[table], context=parent_context) record_id = self.pool[table].create(cr, user, tocreate[table], context=context)
else: else:
self.pool[table].write(cr, user, [record_id], tocreate[table], context=parent_context) self.pool[table].write(cr, user, [record_id], tocreate[table], context=context)
updates.append((self._inherits[table], '%s', record_id)) updates.append((self._inherits[table], '%s', record_id))
@ -4105,13 +4100,13 @@ class BaseModel(object):
# check Python constraints # check Python constraints
recs._validate_fields(vals) recs._validate_fields(vals)
# Mark new-style fields to recompute # invalidate and mark new-style fields to recompute
modified_fields = list(vals) modified_fields = list(vals)
if self._log_access: if self._log_access:
modified_fields += ['create_uid', 'create_date', 'write_uid', 'write_date'] modified_fields += ['create_uid', 'create_date', 'write_uid', 'write_date']
recs.modified(modified_fields) recs.modified(modified_fields)
if not context.get('no_store_function', False): if context.get('recompute', True):
result += self._store_get_values(cr, user, [id_new], result += self._store_get_values(cr, user, [id_new],
list(set(vals.keys() + self._inherits.values())), list(set(vals.keys() + self._inherits.values())),
context) context)
@ -4124,7 +4119,7 @@ class BaseModel(object):
# recompute new-style fields # recompute new-style fields
recs.recompute() recs.recompute()
if self._log_create and not (context and context.get('no_store_function', False)): if self._log_create and context.get('recompute', True):
message = self._description + \ message = self._description + \
" '" + \ " '" + \
self.name_get(cr, user, [id_new], context=context)[0][1] + \ self.name_get(cr, user, [id_new], context=context)[0][1] + \
@ -4269,7 +4264,7 @@ class BaseModel(object):
cr.execute('update "' + self._table + '" set ' + \ cr.execute('update "' + self._table + '" set ' + \
'"'+f+'"='+self._columns[f]._symbol_set[0] + ' where id = %s', (self._columns[f]._symbol_set[1](value), id)) '"'+f+'"='+self._columns[f]._symbol_set[0] + ' where id = %s', (self._columns[f]._symbol_set[1](value), id))
# invalidate the cache for the modified fields # invalidate and mark new-style fields to recompute
self.browse(cr, uid, ids, context).modified(fields) self.browse(cr, uid, ids, context).modified(fields)
return True return True

View File

@ -684,7 +684,7 @@ class one2many(_column):
result = [] result = []
context = dict(context or {}) context = dict(context or {})
context.update(self._context) context.update(self._context)
context['no_store_function'] = True context['recompute'] = False # recomputation is done by outer create/write
if not values: if not values:
return return
obj = obj.pool[self._obj] obj = obj.pool[self._obj]