[REF] fields: implement company-dependent fields as computed fields

This commit is contained in:
Raphael Collet
2016-08-31 17:21:47 +02:00
parent 6956696eb2
commit b258f4b842
3 changed files with 38 additions and 46 deletions
+33 -8
View File
@@ -420,8 +420,13 @@ class Field(object):
attrs['copy'] = attrs.get('copy', False)
if attrs.get('company_dependent'):
# by default, company-dependent fields are not stored and not copied
attrs['store'] = attrs.get('store', False)
attrs['store'] = False
attrs['copy'] = attrs.get('copy', False)
attrs['default'] = self._default_company_dependent
attrs['compute'] = self._compute_company_dependent
if not attrs.get('readonly'):
attrs['inverse'] = self._inverse_company_dependent
attrs['search'] = self._search_company_dependent
# fix for function fields overridden by regular columns
if not isinstance(attrs.get('origin'), (NoneType, fields.function)):
@@ -566,6 +571,31 @@ class Field(object):
""" Return the base field of an inherited field, or ``self``. """
return self.related_field.base_field if self.inherited else self
#
# Company-dependent fields
#
def _default_company_dependent(self, model):
return model.env['ir.property'].get(self.name, self.model_name)
def _compute_company_dependent(self, records):
Property = records.env['ir.property']
values = Property.get_multi(self.name, self.model_name, records.ids)
for record in records:
record[self.name] = values.get(record.id)
def _inverse_company_dependent(self, records):
Property = records.env['ir.property']
values = {
record.id: self.convert_to_write(record[self.name], record)
for record in records
}
Property.set_multi(self.name, self.model_name, values)
def _search_company_dependent(self, records, operator, value):
Property = records.env['ir.property']
return Property.search_multi(self.name, self.model_name, operator, value)
#
# Setup of field triggers
#
@@ -679,7 +709,7 @@ class Field(object):
if self.column:
return self.column
if not self.store and (self.compute or not self.origin) and not self.company_dependent:
if not self.store and (self.compute or not self.origin):
# non-stored computed fields do not have a corresponding column
return None
@@ -691,12 +721,7 @@ class Field(object):
for attr, value in self._attrs.iteritems():
args[attr] = value
if self.company_dependent:
# company-dependent fields are mapped to former property fields
args['type'] = self.type
args['relation'] = self.comodel_name
self.column = fields.property(**args)
elif self.origin:
if self.origin:
# let the origin provide a valid column for the given parameters
self.column = self.origin.new(_computed_field=bool(self.compute), **args)
else:
+2 -9
View File
@@ -1271,18 +1271,12 @@ class BaseModel(object):
field = self._fields.get(name)
# 3. look up property fields
# TODO: get rid of this one
if field and field.company_dependent:
defaults[name] = self.env['ir.property'].get(name, self._name)
continue
# 4. look up field.default
# 3. look up field.default
if field and field.default:
defaults[name] = field.default(self)
continue
# 5. delegate to parent model
# 4. delegate to parent model
if field and field.inherited:
field = field.related_field
parent_fields[field.model_name].append(field.name)
@@ -1762,7 +1756,6 @@ class BaseModel(object):
for name, field in self._fields.iteritems()
if name not in values
if name not in MAGIC_COLUMNS
if field.base_field.column
if not (field.inherited and field.related_field.model_name in avoid_models)
}
+3 -29
View File
@@ -1769,39 +1769,13 @@ class property(function):
return args
def _property_search(self, tobj, cr, uid, obj, name, domain, context=None):
ir_property = obj.pool['ir.property']
result = []
for field, operator, value in domain:
result += ir_property.search_multi(cr, uid, name, tobj._name, operator, value, context=context)
return result
raise TypeError("Dead method")
def _property_write(self, obj, cr, uid, id, prop_name, value, obj_dest, context=None):
ir_property = obj.pool['ir.property']
ir_property.set_multi(cr, uid, prop_name, obj._name, {id: value}, context=context)
return True
raise TypeError("Dead method")
def _property_read(self, obj, cr, uid, ids, prop_name, obj_dest, context=None):
ir_property = obj.pool['ir.property']
res = dict.fromkeys(ids, False)
field = obj._fields[prop_name]
values = ir_property.get_multi(cr, uid, prop_name, obj._name, ids, context=context)
if field.type == 'many2one':
# name_get the non-null values as SUPERUSER_ID
vals = sum(set(filter(None, values.itervalues())),
obj.pool[field.comodel_name].browse(cr, uid, [], context=context))
vals_name = dict(vals.sudo().name_get()) if vals else {}
for id, value in values.iteritems():
ng = False
if value and value.id in vals_name:
ng = value.id, vals_name[value.id]
res[id] = ng
else:
for id, value in values.iteritems():
res[id] = value
return res
raise TypeError("Dead method")
def __init__(self, **args):
if 'view_load' in args: