diff --git a/openerp/api.py b/openerp/api.py index da9e62f1549..d13bcd57567 100644 --- a/openerp/api.py +++ b/openerp/api.py @@ -2,7 +2,7 @@ ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2013 OpenERP (). +# Copyright (C) 2013-2014 OpenERP (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -717,7 +717,7 @@ class Environment(object): self.cache = defaultdict(dict) # {field: {id: value, ...}, ...} self.prefetch = defaultdict(set) # {model_name: set(id), ...} self.computed = defaultdict(set) # {field: set(id), ...} - self.dirty = set() # set(record) + self.dirty = defaultdict(set) # {record: set(field_name), ...} self.all = envs envs.add(self) return self diff --git a/openerp/fields.py b/openerp/fields.py index 43b63f84b13..69869db6e4e 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -791,7 +791,7 @@ class Field(object): if env.in_onchange: for invf in self.inverse_fields: invf._update(value, record) - record._dirty = True + record._set_dirty_by(self.name) # determine more dependent fields, and invalidate them if self.relational: @@ -1578,7 +1578,8 @@ class _RelationalMulti(_Relational): # add new and existing records for record in value: if not record.id or record._dirty: - values = dict((k, v) for k, v in record._cache.iteritems() if k in fnames) + dirty_fields = record.env.dirty[record] + values = dict((k, v) for k, v in record._cache.iteritems() if k in fnames and k in dirty_fields) values = record._convert_to_write(values) if not record.id: result.append((0, 0, values)) diff --git a/openerp/models.py b/openerp/models.py index df46fce4d5d..d44ced403a4 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -5320,15 +5320,12 @@ class BaseModel(object): def _dirty(self): """ Return whether any record in `self` is dirty. """ dirty = self.env.dirty - return any(record in dirty for record in self) + return any(bool(dirty.get(record)) for record in self) - @_dirty.setter - def _dirty(self, value): - """ Mark the records in `self` as dirty. """ - if value: - map(self.env.dirty.add, self) - else: - map(self.env.dirty.discard, self) + def _set_dirty_by(self, field_name): + dirty = self.env.dirty + for record in self: + dirty[record].add(field_name) # # "Dunder" methods