xrg has proposed merging lp:~openerp-dev/openobject-server/trunk-bug-795443-xrg
into lp:openobject-server.
Requested reviews:
OpenERP Core Team (openerp)
Related bugs:
Bug #795443 in OpenERP Server: "orm: refactor orm.default_get() to avoid
redundant computations"
https://bugs.launchpad.net/openobject-server/+bug/795443
For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-bug-795443-xrg/+merge/64133
--
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-bug-795443-xrg/+merge/64133
Your team OpenERP R&D Team is subscribed to branch
lp:~openerp-dev/openobject-server/trunk-bug-795443-xrg.
=== modified file 'openerp/osv/orm.py'
--- openerp/osv/orm.py 2011-05-27 12:32:36 +0000
+++ openerp/osv/orm.py 2011-06-10 09:28:10 +0000
@@ -1122,6 +1122,8 @@
contents. This can also be selectively overriden by passing a field-specific flag
in the form ``bin_size_XXX: True/False`` where ``XXX`` is the name of the field.
Note: The ``bin_size_XXX`` form is new in OpenERP v6.0.
+ If the ``__ignore_ir_values`` is passed and is positive,
+ defaults will NOT be looked up in ir.values
:return: dictionary of the default values (set on the object model class, through user preferences, or in the context)
"""
# trigger view init hook
@@ -1131,13 +1133,64 @@
context = {}
defaults = {}
- # get the default values for the inherited fields
- for t in self._inherits.keys():
- defaults.update(self.pool.get(t).default_get(cr, uid, fields_list,
- context))
-
- # get the default values defined in the object
- for f in fields_list:
+ # Most significant: get the default values from the context
+ for f in fields_list:
+ if ('default_' + f) in context:
+ defaults[f] = context['default_' + f]
+
+ # Next significant:
+ # get the default values set by the user and override the default
+ # values defined in the object
+ ir_values_obj = self.pool.get('ir.values')
+ if context.get('__ignore_ir_values', False):
+ res = []
+ else:
+ res = ir_values_obj.get(cr, uid, 'default', False, [self._name])
+
+ for id, field, field_value in res:
+ if field in defaults or (field not in fields_list):
+ continue
+
+ fld_def = (field in self._columns) and self._columns[field] or self._inherit_fields[field][2]
+ if fld_def._type in ('many2one', 'one2one'):
+ obj = self.pool.get(fld_def._obj)
+ if not obj.search(cr, uid, [('id', '=', field_value or False)]):
+ continue
+ if fld_def._type in ('many2many'):
+ obj = self.pool.get(fld_def._obj)
+ field_value2 = []
+ for i in range(len(field_value)):
+ if not obj.search(cr, uid, [('id', '=',
+ field_value[i])]):
+ continue
+ field_value2.append(field_value[i])
+ field_value = field_value2
+ if fld_def._type in ('one2many'):
+ obj = self.pool.get(fld_def._obj)
+ field_value2 = []
+ for i in range(len(field_value)):
+ field_value2.append({})
+ for field2 in field_value[i]:
+ if field2 in obj._columns.keys() and obj._columns[field2]._type in ('many2one', 'one2one'):
+ obj2 = self.pool.get(obj._columns[field2]._obj)
+ if not obj2.search(cr, uid,
+ [('id', '=', field_value[i][field2])]):
+ continue
+ elif field2 in obj._inherit_fields.keys() and obj._inherit_fields[field2][2]._type in ('many2one', 'one2one'):
+ obj2 = self.pool.get(obj._inherit_fields[field2][2]._obj)
+ if not obj2.search(cr, uid,
+ [('id', '=', field_value[i][field2])]):
+ continue
+ # TODO add test for many2many and one2many
+ field_value2[i][field2] = field_value[i][field2]
+ field_value = field_value2
+ defaults[field] = field_value
+
+ # Next method: get the default values defined in the object
+ defaults_props = [] # will take last-resort values
+ for f in fields_list:
+ if f in defaults:
+ continue
if f in self._defaults:
if callable(self._defaults[f]):
defaults[f] = self._defaults[f](self, cr, uid, context)
@@ -1158,53 +1211,21 @@
defaults[f] = prop_value
else:
if f not in defaults:
- defaults[f] = False
-
- # get the default values set by the user and override the default
- # values defined in the object
- ir_values_obj = self.pool.get('ir.values')
- res = ir_values_obj.get(cr, uid, 'default', False, [self._name])
- for id, field, field_value in res:
- if field in fields_list:
- fld_def = (field in self._columns) and self._columns[field] or self._inherit_fields[field][2]
- if fld_def._type in ('many2one', 'one2one'):
- obj = self.pool.get(fld_def._obj)
- if not obj.search(cr, uid, [('id', '=', field_value or False)]):
- continue
- if fld_def._type in ('many2many'):
- obj = self.pool.get(fld_def._obj)
- field_value2 = []
- for i in range(len(field_value)):
- if not obj.search(cr, uid, [('id', '=',
- field_value[i])]):
- continue
- field_value2.append(field_value[i])
- field_value = field_value2
- if fld_def._type in ('one2many'):
- obj = self.pool.get(fld_def._obj)
- field_value2 = []
- for i in range(len(field_value)):
- field_value2.append({})
- for field2 in field_value[i]:
- if field2 in obj._columns.keys() and obj._columns[field2]._type in ('many2one', 'one2one'):
- obj2 = self.pool.get(obj._columns[field2]._obj)
- if not obj2.search(cr, uid,
- [('id', '=', field_value[i][field2])]):
- continue
- elif field2 in obj._inherit_fields.keys() and obj._inherit_fields[field2][2]._type in ('many2one', 'one2one'):
- obj2 = self.pool.get(obj._inherit_fields[field2][2]._obj)
- if not obj2.search(cr, uid,
- [('id', '=', field_value[i][field2])]):
- continue
- # TODO add test for many2many and one2many
- field_value2[i][field2] = field_value[i][field2]
- field_value = field_value2
- defaults[field] = field_value
-
- # get the default values from the context
- for key in context or {}:
- if key.startswith('default_') and (key[8:] in fields_list):
- defaults[key[8:]] = context[key]
+ defaults_props[f] = False
+
+
+ remaining_fields = [ f for f in fields_list if f not in defaults ]
+
+ if remaining_fields:
+ # get the default values for the inherited fields
+ for t in self._inherits.keys():
+ defaults.update(self.pool.get(t).default_get(cr, uid, remaining_fields,
+ context))
+
+ if defaults_props:
+ # must be updated after the _inherits.keys() lookup
+ defaults.update(defaults_props)
+
return defaults
_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help : https://help.launchpad.net/ListHelp