[REF] fields: implement company-dependent fields as computed fields
This commit is contained in:
+33
-8
@@ -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
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user