Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

FIX #18491 #774

Closed
wants to merge 4 commits into from

2 participants

@stefan8

#18491 When deleting a proxy model, the admin does not show warning about cascade delete for object with foreign key on the proxied model

stefan8 added some commits
@stefan8 stefan8 #18491 When deleting a proxy model, the admin does not show warning a…
…bout cascade delete for object with foreign key on the proxied model
7cca80e
@stefan8 stefan8 Safe solution. 39a924e
django/contrib/admin/util.py
@@ -2,6 +2,7 @@
import datetime
import decimal
+import copy
@HonzaKral Collaborator

please remove

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@HonzaKral
Collaborator

I committed this manually to squash the commits, Thanks!

@HonzaKral HonzaKral closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Feb 23, 2013
  1. @stefan8

    #18491 When deleting a proxy model, the admin does not show warning a…

    stefan8 authored
    …bout cascade delete for object with foreign key on the proxied model
  2. @stefan8

    Safe solution.

    stefan8 authored
  3. @stefan8

    import cleanup

    stefan8 authored
  4. @stefan8

    short comment

    stefan8 authored
This page is out of date. Refresh to see the latest.
View
3  django/contrib/admin/util.py
@@ -154,6 +154,9 @@ def collect(self, objs, source_attr=None, **kwargs):
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)
View
24 tests/modeltests/proxy_models/fixtures/myhorses.json
@@ -0,0 +1,24 @@
+[
+ {
+ "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
+ }
+ }
+]
View
28 tests/modeltests/proxy_models/tests.py
@@ -2,6 +2,7 @@
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
@@ -14,7 +15,7 @@
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):
@@ -360,3 +361,28 @@ def test_proxy_load_from_fixture(self):
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, ()))
Something went wrong with that request. Please try again.