Loading django/contrib/admin/util.py +3 −0 Original line number Diff line number Diff line Loading @@ -154,6 +154,9 @@ class NestedObjects(Collector): if source_attr: self.add_edge(getattr(obj, source_attr), obj) else: if obj._meta.proxy: # Take concrete model's instance to avoid mismatch in edges obj = obj._meta.concrete_model(pk=obj.pk) self.add_edge(None, obj) try: return super(NestedObjects, self).collect(objs, source_attr=source_attr, **kwargs) Loading setup.py +1 −1 Original line number Diff line number Diff line from distutils.core import setup from setuptools import setup from distutils.command.install_data import install_data from distutils.command.install import INSTALL_SCHEMES from distutils.sysconfig import get_python_lib Loading tests/modeltests/proxy_models/fixtures/myhorses.json 0 → 100644 +24 −0 Original line number Diff line number Diff line [ { "pk": 100, "model": "proxy_models.BaseUser", "fields": { "name": "Django Pony" } }, { "pk": 100, "model": "proxy_models.TrackerUser", "fields": { "status": "emperor" } }, { "pk": 100, "model": "proxy_models.Issue", "fields": { "summary": "Pony's Issue", "assignee": 100 } } ] No newline at end of file tests/modeltests/proxy_models/tests.py +27 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ from __future__ import absolute_import, unicode_literals import copy from django.conf import settings from django.contrib import admin from django.contrib.contenttypes.models import ContentType from django.core import management from django.core.exceptions import FieldError Loading @@ -14,7 +15,7 @@ from django.test import TestCase from .models import (MyPerson, Person, StatusPerson, LowerStatusPerson, MyPersonProxy, Abstract, OtherPerson, User, UserProxy, UserProxyProxy, Country, State, StateProxy, TrackerUser, BaseUser, Bug, ProxyTrackerUser, Improvement, ProxyProxyBug, ProxyBug, ProxyImprovement) Improvement, ProxyProxyBug, ProxyBug, ProxyImprovement, Issue) class ProxyModelTests(TestCase): Loading Loading @@ -360,3 +361,28 @@ class ProxyModelTests(TestCase): management.call_command('loaddata', 'mypeople.json', verbosity=0, commit=False) p = MyPerson.objects.get(pk=100) self.assertEqual(p.name, 'Elvis Presley') class ProxyModelAdminTests(TestCase): def setUp(self): management.call_command('loaddata', 'myhorses.json', verbosity=0, commit=False) def tearDown(self): TrackerUser.objects.all().delete() Issue.objects.all().delete() def test_cascade_delete_proxy_model_admin_warning(self): """ Test if admin gives warning about cascade deleting models referenced to concrete model by deleting proxy object. """ tracker_user = TrackerUser.objects.all()[0] base_user = BaseUser.objects.all()[0] issue = Issue.objects.all()[0] with self.assertNumQueries(7): collector = admin.util.NestedObjects('default') collector.collect(ProxyTrackerUser.objects.all()) self.assertTrue(tracker_user in collector.edges.get(None, ())) self.assertTrue(base_user in collector.edges.get(None, ())) self.assertTrue(issue in collector.edges.get(tracker_user, ())) Loading
django/contrib/admin/util.py +3 −0 Original line number Diff line number Diff line Loading @@ -154,6 +154,9 @@ class NestedObjects(Collector): if source_attr: self.add_edge(getattr(obj, source_attr), obj) else: if obj._meta.proxy: # Take concrete model's instance to avoid mismatch in edges obj = obj._meta.concrete_model(pk=obj.pk) self.add_edge(None, obj) try: return super(NestedObjects, self).collect(objs, source_attr=source_attr, **kwargs) Loading
setup.py +1 −1 Original line number Diff line number Diff line from distutils.core import setup from setuptools import setup from distutils.command.install_data import install_data from distutils.command.install import INSTALL_SCHEMES from distutils.sysconfig import get_python_lib Loading
tests/modeltests/proxy_models/fixtures/myhorses.json 0 → 100644 +24 −0 Original line number Diff line number Diff line [ { "pk": 100, "model": "proxy_models.BaseUser", "fields": { "name": "Django Pony" } }, { "pk": 100, "model": "proxy_models.TrackerUser", "fields": { "status": "emperor" } }, { "pk": 100, "model": "proxy_models.Issue", "fields": { "summary": "Pony's Issue", "assignee": 100 } } ] No newline at end of file
tests/modeltests/proxy_models/tests.py +27 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ from __future__ import absolute_import, unicode_literals import copy from django.conf import settings from django.contrib import admin from django.contrib.contenttypes.models import ContentType from django.core import management from django.core.exceptions import FieldError Loading @@ -14,7 +15,7 @@ from django.test import TestCase from .models import (MyPerson, Person, StatusPerson, LowerStatusPerson, MyPersonProxy, Abstract, OtherPerson, User, UserProxy, UserProxyProxy, Country, State, StateProxy, TrackerUser, BaseUser, Bug, ProxyTrackerUser, Improvement, ProxyProxyBug, ProxyBug, ProxyImprovement) Improvement, ProxyProxyBug, ProxyBug, ProxyImprovement, Issue) class ProxyModelTests(TestCase): Loading Loading @@ -360,3 +361,28 @@ class ProxyModelTests(TestCase): management.call_command('loaddata', 'mypeople.json', verbosity=0, commit=False) p = MyPerson.objects.get(pk=100) self.assertEqual(p.name, 'Elvis Presley') class ProxyModelAdminTests(TestCase): def setUp(self): management.call_command('loaddata', 'myhorses.json', verbosity=0, commit=False) def tearDown(self): TrackerUser.objects.all().delete() Issue.objects.all().delete() def test_cascade_delete_proxy_model_admin_warning(self): """ Test if admin gives warning about cascade deleting models referenced to concrete model by deleting proxy object. """ tracker_user = TrackerUser.objects.all()[0] base_user = BaseUser.objects.all()[0] issue = Issue.objects.all()[0] with self.assertNumQueries(7): collector = admin.util.NestedObjects('default') collector.collect(ProxyTrackerUser.objects.all()) self.assertTrue(tracker_user in collector.edges.get(None, ())) self.assertTrue(base_user in collector.edges.get(None, ())) self.assertTrue(issue in collector.edges.get(tracker_user, ()))