diff --git a/src/c3nav/editor/models.py b/src/c3nav/editor/models.py index 1b604ad7..8271ff14 100644 --- a/src/c3nav/editor/models.py +++ b/src/c3nav/editor/models.py @@ -72,7 +72,7 @@ class ChangeSet(models.Model): m2m_remove_existing.remove(value) else: self.m2m_add_existing.setdefault(model, {}).setdefault(change.obj_pk, set()).add(value) - elif change.action == 'm2m_add': + elif change.action == 'm2m_remove': m2m_add_existing = self.m2m_add_existing.get(model, {}).get(change.obj_pk, ()) if value in m2m_add_existing: m2m_add_existing.remove(value) diff --git a/src/c3nav/editor/wrappers.py b/src/c3nav/editor/wrappers.py index 034dbfa3..5de0d339 100644 --- a/src/c3nav/editor/wrappers.py +++ b/src/c3nav/editor/wrappers.py @@ -1,7 +1,7 @@ from collections import deque from django.db import models -from django.db.models import Manager, Prefetch +from django.db.models import Manager, Prefetch, Q from django.db.models.fields.related_descriptors import ForwardManyToOneDescriptor @@ -340,6 +340,15 @@ class ManyRelatedManagerWrapper(RelatedManagerWrapper): pk = (obj.pk if isinstance(obj, self._obj.model) else obj) self._changeset.add_m2m_remove(self._obj.instance, name=self._get_cache_name(), value=pk, author=author) + def all(self): + # todo: this filtering is temporary as long as querysets do not filter themselves according to changes + filter = Q(**self._obj.core_filters) + model = type(self._obj.instance) + instance_pk = self._obj.instance.pk + filter &= ~Q(pk__in=self._changeset.m2m_remove_existing.get(model, {}).get(instance_pk, ())) + filter |= Q(pk__in=self._changeset.m2m_add_existing.get(model, {}).get(instance_pk, ())) + return self.model.objects.filter(filter) + class QuerySetWrapper(BaseQueryWrapper): @property