From e2715453a84faf5624cfb3f88cd7132ff23f4770 Mon Sep 17 00:00:00 2001 From: Albert Cervera i Areny Date: Thu, 30 Aug 2018 22:45:38 +0200 Subject: [PATCH] Add review53361003/issue7665: proteus: Use the context of the group when record is inside a ModelList --- issue53361003_1.diff | 147 +++++++++++++++++++++++++++++++++++++++++++ series | 1 + 2 files changed, 148 insertions(+) create mode 100644 issue53361003_1.diff diff --git a/issue53361003_1.diff b/issue53361003_1.diff new file mode 100644 index 0000000..b9700ce --- /dev/null +++ b/issue53361003_1.diff @@ -0,0 +1,147 @@ +--- a/proteus/proteus/__init__.py ++++ b/proteus/proteus/__init__.py +@@ -520,11 +520,9 @@ + + def __check(self, records, on_change=True): + config = None +- context = self._get_context() + for record in records: + assert isinstance(record, Model) + assert record.__class__.__name__ == self.model_name +- assert record._context == context, (record._context, context) + if self.parent: + assert record._config == self.parent._config + elif self: +@@ -533,14 +531,10 @@ + assert record._config == config + else: + config = record._config ++ if record._group is not self: ++ assert record._group is None ++ record._group = self + for record in records: +- assert record._parent is None +- assert not record._parent_field_name +- assert not record._parent_name +- record._parent = self.parent +- record._parent_field_name = self.parent_field_name +- record._parent_name = self.parent_name +- + # Set parent field to trigger on_change + if (on_change + and self.parent +@@ -572,9 +566,7 @@ + + def pop(self, index=-1): + self.record_removed.add(self[index]) +- self[index]._parent = None +- self[index]._parent_field_name = '' +- self[index]._parent_name = '' ++ self[index]._group = None + res = super(ModelList, self).pop(index) + self._changed() + return res +@@ -583,9 +575,7 @@ + def remove(self, record, _changed=True): + if record.id >= 0: + self.record_deleted.add(record) +- record._parent = None +- record._parent_field_name = '' +- record._parent_name = '' ++ record._group = None + res = super(ModelList, self).remove(record) + if _changed: + self._changed() +@@ -606,15 +596,7 @@ + config = Relation._config + with config.reset_context(), config.set_context(self._get_context()): + # Set parent for on_change calls from default_get +- new_record = Relation( +- _parent=self.parent, +- _parent_field_name=self.parent_field_name, +- _parent_name=self.parent_name, +- **kwargs) +- # Remove parent to pass __check test +- new_record._parent = None +- new_record._parent_field_name = '' +- new_record._parent_name = '' ++ new_record = Relation(_group=self, **kwargs) + self.append(new_record) + return new_record + +@@ -675,9 +657,7 @@ + _config = None + _fields = None + +- def __init__(self, id=None, _default=True, +- _parent=None, _parent_field_name='', _parent_name='', +- **kwargs): ++ def __init__(self, id=None, _default=True, _group=None, **kwargs): + super(Model, self).__init__() + if id: + assert not kwargs +@@ -686,12 +666,8 @@ + Model.__counter -= 1 + self._values = {} # store the values of fields + self._changed = set() # store the changed fields +- self._parent = _parent # store the parent record +- # store the field name in parent record +- self._parent_field_name = _parent_field_name +- # store the field name to parent record +- self._parent_name = _parent_name +- self._context = self._config.context # store the context ++ self._group = _group # store the parent group ++ self.__context = self._config.context # store the context + if self.id < 0 and _default: + self._default_get() + +@@ -718,6 +694,31 @@ + setattr(self, field_name, value) + __init__.__doc__ = object.__init__.__doc__ + ++ @property ++ def _parent(self): ++ if self._group is not None: ++ return self._group.parent ++ ++ @property ++ def _parent_field_name(self): ++ if self._group is not None: ++ return self._group.parent_field_name ++ return '' ++ ++ @property ++ def _parent_name(self): ++ if self._group is not None: ++ return self._group.parent_name ++ return '' ++ ++ @property ++ def _context(self): ++ if self._group: ++ context = self._group._get_context() ++ else: ++ context = self.__context ++ return context ++ + @classmethod + def get(cls, name, config=None): + 'Get a class for the named Model' +@@ -944,13 +945,10 @@ + Relation = Model.get(definition['relation'], self._config) + self._values[field] = records = ModelList( + definition, [], self, field) +- config = Relation._config +- with config.reset_context(), \ +- config.set_context(records._get_context()): +- for vals in (value or []): +- record = Relation() +- record._default_set(vals) +- records.append(record) ++ for vals in (value or []): ++ record = Relation() ++ record._default_set(vals) ++ records.append(record) + else: + self._values[field] = value + fieldnames.append(field) diff --git a/series b/series index 8d5c2ed..755ba62 100644 --- a/series +++ b/series @@ -1 +1,2 @@ issue6253.diff # add invoice type criteria +issue53361003_1.diff # Proteus: Use the context of the group when record is inside a ModelList