[IMP] Speed impprovement: 2x faster for flow: sale -> invoice -> payment
bzr revid: fp@tinyerp.com-20090820152921-ntnzn2tqo1bhiss1
This commit is contained in:
+10
-1
@@ -53,6 +53,7 @@ def _symbol_set(symb):
|
|||||||
class _column(object):
|
class _column(object):
|
||||||
_classic_read = True
|
_classic_read = True
|
||||||
_classic_write = True
|
_classic_write = True
|
||||||
|
_prefetch = True
|
||||||
_properties = False
|
_properties = False
|
||||||
_type = 'unknown'
|
_type = 'unknown'
|
||||||
_obj = None
|
_obj = None
|
||||||
@@ -196,6 +197,7 @@ class binary(_column):
|
|||||||
_symbol_get = lambda self, x: x and str(x)
|
_symbol_get = lambda self, x: x and str(x)
|
||||||
|
|
||||||
_classic_read = False
|
_classic_read = False
|
||||||
|
_prefetch = False
|
||||||
|
|
||||||
def __init__(self, string='unknown', filters=None, **args):
|
def __init__(self, string='unknown', filters=None, **args):
|
||||||
_column.__init__(self, string=string, **args)
|
_column.__init__(self, string=string, **args)
|
||||||
@@ -350,6 +352,7 @@ class many2one(_column):
|
|||||||
class one2many(_column):
|
class one2many(_column):
|
||||||
_classic_read = False
|
_classic_read = False
|
||||||
_classic_write = False
|
_classic_write = False
|
||||||
|
_prefetch = False
|
||||||
_type = 'one2many'
|
_type = 'one2many'
|
||||||
|
|
||||||
def __init__(self, obj, fields_id, string='unknown', limit=None, **args):
|
def __init__(self, obj, fields_id, string='unknown', limit=None, **args):
|
||||||
@@ -426,11 +429,13 @@ class one2many(_column):
|
|||||||
return res
|
return res
|
||||||
|
|
||||||
def set(self, cr, obj, id, field, values, user=None, context=None):
|
def set(self, cr, obj, id, field, values, user=None, context=None):
|
||||||
|
result = []
|
||||||
if not context:
|
if not context:
|
||||||
context = {}
|
context = {}
|
||||||
if self._context:
|
if self._context:
|
||||||
context = context.copy()
|
context = context.copy()
|
||||||
context.update(self._context)
|
context.update(self._context)
|
||||||
|
context['no_store_function'] = True
|
||||||
if not values:
|
if not values:
|
||||||
return
|
return
|
||||||
_table = obj.pool.get(self._obj)._table
|
_table = obj.pool.get(self._obj)._table
|
||||||
@@ -438,7 +443,8 @@ class one2many(_column):
|
|||||||
for act in values:
|
for act in values:
|
||||||
if act[0] == 0:
|
if act[0] == 0:
|
||||||
act[2][self._fields_id] = id
|
act[2][self._fields_id] = id
|
||||||
obj.create(cr, user, act[2], context=context)
|
id_new = obj.create(cr, user, act[2], context=context)
|
||||||
|
result += obj._store_get_values(cr, user, [id_new], act[2].keys(), context)
|
||||||
elif act[0] == 1:
|
elif act[0] == 1:
|
||||||
obj.write(cr, user, [act[1]], act[2], context=context)
|
obj.write(cr, user, [act[1]], act[2], context=context)
|
||||||
elif act[0] == 2:
|
elif act[0] == 2:
|
||||||
@@ -455,6 +461,7 @@ class one2many(_column):
|
|||||||
cr.execute('select id from '+_table+' where '+self._fields_id+'=%s and id not in ('+','.join(map(str, ids2))+')', (id,))
|
cr.execute('select id from '+_table+' where '+self._fields_id+'=%s and id not in ('+','.join(map(str, ids2))+')', (id,))
|
||||||
ids3 = map(lambda x:x[0], cr.fetchall())
|
ids3 = map(lambda x:x[0], cr.fetchall())
|
||||||
obj.write(cr, user, ids3, {self._fields_id:False}, context=context or {})
|
obj.write(cr, user, ids3, {self._fields_id:False}, context=context or {})
|
||||||
|
return result
|
||||||
|
|
||||||
def search(self, cr, obj, args, name, value, offset=0, limit=None, uid=None, operator='like'):
|
def search(self, cr, obj, args, name, value, offset=0, limit=None, uid=None, operator='like'):
|
||||||
return obj.pool.get(self._obj).name_search(cr, uid, value, self._domain, offset, limit)
|
return obj.pool.get(self._obj).name_search(cr, uid, value, self._domain, offset, limit)
|
||||||
@@ -472,6 +479,7 @@ class one2many(_column):
|
|||||||
class many2many(_column):
|
class many2many(_column):
|
||||||
_classic_read = False
|
_classic_read = False
|
||||||
_classic_write = False
|
_classic_write = False
|
||||||
|
_prefetch = False
|
||||||
_type = 'many2many'
|
_type = 'many2many'
|
||||||
|
|
||||||
def __init__(self, obj, rel, id1, id2, string='unknown', limit=None, **args):
|
def __init__(self, obj, rel, id1, id2, string='unknown', limit=None, **args):
|
||||||
@@ -582,6 +590,7 @@ class many2many(_column):
|
|||||||
class function(_column):
|
class function(_column):
|
||||||
_classic_read = False
|
_classic_read = False
|
||||||
_classic_write = False
|
_classic_write = False
|
||||||
|
_prefetch = False
|
||||||
_type = 'function'
|
_type = 'function'
|
||||||
_properties = True
|
_properties = True
|
||||||
|
|
||||||
|
|||||||
+23
-5
@@ -174,7 +174,7 @@ class browse_record(object):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
# if the field is a classic one or a many2one, we'll fetch all classic and many2one fields
|
# if the field is a classic one or a many2one, we'll fetch all classic and many2one fields
|
||||||
if col._classic_write:
|
if col._prefetch:
|
||||||
# gen the list of "local" (ie not inherited) fields which are classic or many2one
|
# gen the list of "local" (ie not inherited) fields which are classic or many2one
|
||||||
ffields = filter(lambda x: x[1]._classic_write, self._table._columns.items())
|
ffields = filter(lambda x: x[1]._classic_write, self._table._columns.items())
|
||||||
# gen the list of inherited fields
|
# gen the list of inherited fields
|
||||||
@@ -2345,6 +2345,7 @@ class orm(orm_template):
|
|||||||
if not edit:
|
if not edit:
|
||||||
vals.pop(field)
|
vals.pop(field)
|
||||||
|
|
||||||
|
|
||||||
if not context:
|
if not context:
|
||||||
context = {}
|
context = {}
|
||||||
if not ids:
|
if not ids:
|
||||||
@@ -2356,6 +2357,7 @@ class orm(orm_template):
|
|||||||
|
|
||||||
self.pool.get('ir.model.access').check(cr, user, self._name, 'write', context=context)
|
self.pool.get('ir.model.access').check(cr, user, self._name, 'write', context=context)
|
||||||
|
|
||||||
|
|
||||||
upd0 = []
|
upd0 = []
|
||||||
upd1 = []
|
upd1 = []
|
||||||
upd_todo = []
|
upd_todo = []
|
||||||
@@ -2432,6 +2434,7 @@ class orm(orm_template):
|
|||||||
src_trans = self.pool.get(self._name).read(cr,user,ids,[f])
|
src_trans = self.pool.get(self._name).read(cr,user,ids,[f])
|
||||||
self.pool.get('ir.translation')._set_ids(cr, user, self._name+','+f, 'model', context['lang'], ids, vals[f], src_trans[0][f])
|
self.pool.get('ir.translation')._set_ids(cr, user, self._name+','+f, 'model', context['lang'], ids, vals[f], src_trans[0][f])
|
||||||
|
|
||||||
|
|
||||||
# call the 'set' method of fields which are not classic_write
|
# call the 'set' method of fields which are not classic_write
|
||||||
upd_todo.sort(lambda x, y: self._columns[x].priority-self._columns[y].priority)
|
upd_todo.sort(lambda x, y: self._columns[x].priority-self._columns[y].priority)
|
||||||
|
|
||||||
@@ -2649,13 +2652,19 @@ class orm(orm_template):
|
|||||||
if c[0].startswith('default_'):
|
if c[0].startswith('default_'):
|
||||||
del rel_context[c[0]]
|
del rel_context[c[0]]
|
||||||
|
|
||||||
|
result = []
|
||||||
for field in upd_todo:
|
for field in upd_todo:
|
||||||
self._columns[field].set(cr, self, id_new, field, vals[field], user, rel_context)
|
result += self._columns[field].set(cr, self, id_new, field, vals[field], user, rel_context) or []
|
||||||
self._validate(cr, user, [id_new], context)
|
self._validate(cr, user, [id_new], context)
|
||||||
|
|
||||||
result = self._store_get_values(cr, user, [id_new], vals.keys(), context)
|
if not context.get('no_store_function', False):
|
||||||
for order, object, ids, fields2 in result:
|
result += self._store_get_values(cr, user, [id_new], vals.keys(), context)
|
||||||
self.pool.get(object)._store_set_values(cr, user, ids, fields2, context)
|
result.sort()
|
||||||
|
done = []
|
||||||
|
for order, object, ids, fields2 in result:
|
||||||
|
if not (object, ids, fields2) in done:
|
||||||
|
self.pool.get(object)._store_set_values(cr, user, ids, fields2, context)
|
||||||
|
done.append((object, ids, fields2))
|
||||||
|
|
||||||
wf_service = netsvc.LocalService("workflow")
|
wf_service = netsvc.LocalService("workflow")
|
||||||
wf_service.trg_create(user, self._name, id_new, cr)
|
wf_service.trg_create(user, self._name, id_new, cr)
|
||||||
@@ -2665,6 +2674,15 @@ class orm(orm_template):
|
|||||||
result = {}
|
result = {}
|
||||||
fncts = self.pool._store_function.get(self._name, [])
|
fncts = self.pool._store_function.get(self._name, [])
|
||||||
for fnct in range(len(fncts)):
|
for fnct in range(len(fncts)):
|
||||||
|
if fncts[fnct][3]:
|
||||||
|
ok = False
|
||||||
|
for f in (fields or []):
|
||||||
|
if f in fncts[fnct][3]:
|
||||||
|
ok = True
|
||||||
|
break
|
||||||
|
if not ok:
|
||||||
|
continue
|
||||||
|
|
||||||
result.setdefault(fncts[fnct][0], {})
|
result.setdefault(fncts[fnct][0], {})
|
||||||
ids2 = fncts[fnct][2](self,cr, uid, ids, context)
|
ids2 = fncts[fnct][2](self,cr, uid, ids, context)
|
||||||
for id in filter(None, ids2):
|
for id in filter(None, ids2):
|
||||||
|
|||||||
Reference in New Issue
Block a user