diff --git a/openerp/fields.py b/openerp/fields.py index 0aa86082c65..b021e09230f 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -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: diff --git a/openerp/models.py b/openerp/models.py index 85d2978940d..68449f0d4df 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -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) } diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index d4db13ba953..bb2268bbf13 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -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: