diff --git a/core/admin/mailu/schemas.py b/core/admin/mailu/schemas.py index 4a9792ec..2af3f03b 100644 --- a/core/admin/mailu/schemas.py +++ b/core/admin/mailu/schemas.py @@ -909,16 +909,23 @@ class BaseSchema(ma.SQLAlchemyAutoSchema, Storage): # stabilize import of auto-increment primary keys (not required), # by matching import data to existing items and setting primary key if not self._primary in data: - for item in getattr(self.recall('parent'), self.recall('field', 'parent')): - existing = self.dump(item, many=False) - this = existing.pop(self._primary) - if data == existing: - instance = item - data[self._primary] = this - break + parent = self.recall('parent') + if parent is not None: + for item in getattr(parent, self.recall('field', 'parent')): + existing = self.dump(item, many=False) + this = existing.pop(self._primary) + if data == existing: + instance = item + data[self._primary] = this + break # try to load instance instance = self.instance or self.get_instance(data) + + # remember instance as parent for pruning siblings + if not self.Meta.sibling and self.context.get('update'): + self.store('parent', instance) + if instance is None: if '__delete__' in data: @@ -931,9 +938,6 @@ class BaseSchema(ma.SQLAlchemyAutoSchema, Storage): else: if self.context.get('update'): - # remember instance as parent for pruning siblings - if not self.Meta.sibling: - self.store('parent', instance) # delete instance from session when marked if '__delete__' in data: self.opts.sqla_session.delete(instance) @@ -1014,14 +1018,16 @@ class BaseSchema(ma.SQLAlchemyAutoSchema, Storage): del_items = True if add_items or del_items: - existing = {item[self._primary] for item in items if self._primary in item} - for item in getattr(self.recall('parent'), self.recall('field', 'parent')): - key = getattr(item, self._primary) - if key not in existing: - if add_items: - items.append({self._primary: key}) - else: - items.append({self._primary: key, '__delete__': '?'}) + parent = self.recall('parent') + if parent is not None: + existing = {item[self._primary] for item in items if self._primary in item} + for item in getattr(parent, self.recall('field', 'parent')): + key = getattr(item, self._primary) + if key not in existing: + if add_items: + items.append({self._primary: key}) + else: + items.append({self._primary: key, '__delete__': '?'}) return items diff --git a/towncrier/newsfragments/2601.bugfix b/towncrier/newsfragments/2601.bugfix new file mode 100644 index 00000000..cae03015 --- /dev/null +++ b/towncrier/newsfragments/2601.bugfix @@ -0,0 +1 @@ +Fix creation of deep structures using import in update mode