Commit f195f1ed authored by Carl Meyer's avatar Carl Meyer
Browse files

Fixed #18083 -- Fixed cascade deletion with proxy model of concrete subclass....

Fixed #18083 -- Fixed cascade deletion with proxy model of concrete subclass. Thanks Simon Charette for report and patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17887 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 6f7aa51b
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -154,9 +154,10 @@ class Collector(object):

        model = new_objs[0].__class__

        # Recursively collect parent models, but not their related objects.
        # These will be found by meta.get_all_related_objects()
        for parent_model, ptr in model._meta.parents.iteritems():
        # Recursively collect concrete model's parent models, but not their
        # related objects. These will be found by meta.get_all_related_objects()
        concrete_model = model._meta.concrete_model
        for ptr in concrete_model._meta.parents.itervalues():
            if ptr:
                parent_objs = [getattr(obj, ptr.name) for obj in new_objs]
                self.collect(parent_objs, source=model,
+13 −0
Original line number Diff line number Diff line

from django.db import models


class ConcreteModel(models.Model):
    pass

class ConcreteModelSubclass(ConcreteModel):
    pass

class ConcreteModelSubclassProxy(ConcreteModelSubclass):
    class Meta:
        proxy = True
+25 −9
Original line number Diff line number Diff line
"""
XX. Proxy model inheritance

Proxy model inheritance across apps can result in syncdb not creating the table
for the proxied model (as described in #12286).  This test creates two dummy
apps and calls syncdb, then verifies that the table has been created.
"""

from __future__ import absolute_import

import os
@@ -14,12 +6,20 @@ import sys
from django.conf import settings
from django.core.management import call_command
from django.db.models.loading import cache, load_app
from django.test import TransactionTestCase
from django.test import TestCase, TransactionTestCase
from django.test.utils import override_settings

from .models import (ConcreteModel, ConcreteModelSubclass,
    ConcreteModelSubclassProxy)


@override_settings(INSTALLED_APPS=('app1', 'app2'))
class ProxyModelInheritanceTests(TransactionTestCase):
    """
    Proxy model inheritance across apps can result in syncdb not creating the table
    for the proxied model (as described in #12286).  This test creates two dummy
    apps and calls syncdb, then verifies that the table has been created.
    """

    def setUp(self):
        self.old_sys_path = sys.path[:]
@@ -41,3 +41,19 @@ class ProxyModelInheritanceTests(TransactionTestCase):
        from .app2.models import NiceModel
        self.assertEqual(NiceModel.objects.all().count(), 0)
        self.assertEqual(ProxyModel.objects.all().count(), 0)


class MultiTableInheritanceProxyTest(TestCase):

    def test_model_subclass_proxy(self):
        """
        Deleting an instance of a model proxying a multi-table inherited
        subclass should cascade delete down the whole inheritance chain (see
        #18083).

        """
        instance = ConcreteModelSubclassProxy.objects.create()
        instance.delete()
        self.assertEqual(0, ConcreteModelSubclassProxy.objects.count())
        self.assertEqual(0, ConcreteModelSubclass.objects.count())
        self.assertEqual(0, ConcreteModel.objects.count())