From aa830009de940e31711b4858501becd7f34a1972 Mon Sep 17 00:00:00 2001
From: Tim Graham <timograham@gmail.com>
Date: Thu, 1 Aug 2013 14:09:47 -0400
Subject: [PATCH] Fixed #17519 -- Fixed missing SQL constraints to proxy
 models.

Thanks thibaultj for the report, jenh for the patch,
and charettes for the tests.
---
 django/db/backends/creation.py |  2 +-
 tests/backends/models.py       |  7 ++++++
 tests/backends/tests.py        | 39 +++++++++++++++++++++++++---------
 3 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/django/db/backends/creation.py b/django/db/backends/creation.py
index 50e45c0e75..4d646b05dd 100644
--- a/django/db/backends/creation.py
+++ b/django/db/backends/creation.py
@@ -146,7 +146,7 @@ class BaseDatabaseCreation(object):
         Returns any ALTER TABLE statements to add constraints after the fact.
         """
         opts = model._meta
-        if not opts.managed or opts.proxy or opts.swapped:
+        if not opts.managed or opts.swapped:
             return []
         qn = self.connection.ops.quote_name
         final_output = []
diff --git a/tests/backends/models.py b/tests/backends/models.py
index 4f03ddeacc..1508af4354 100644
--- a/tests/backends/models.py
+++ b/tests/backends/models.py
@@ -68,11 +68,18 @@ class Reporter(models.Model):
         return "%s %s" % (self.first_name, self.last_name)
 
 
+class ReporterProxy(Reporter):
+    class Meta:
+        proxy = True
+
+
 @python_2_unicode_compatible
 class Article(models.Model):
     headline = models.CharField(max_length=100)
     pub_date = models.DateField()
     reporter = models.ForeignKey(Reporter)
+    reporter_proxy = models.ForeignKey(ReporterProxy, null=True,
+                                       related_name='reporter_proxy')
 
     def __str__(self):
         return self.headline
diff --git a/tests/backends/tests.py b/tests/backends/tests.py
index 2ad2e1d6d5..d6e3f5c78e 100644
--- a/tests/backends/tests.py
+++ b/tests/backends/tests.py
@@ -614,12 +614,19 @@ class FkConstraintsTests(TransactionTestCase):
         Try to create a model instance that violates a FK constraint. If it
         fails it should fail with IntegrityError.
         """
-        a = models.Article(headline="This is a test", pub_date=datetime.datetime(2005, 7, 27), reporter_id=30)
+        a1 = models.Article(headline="This is a test", pub_date=datetime.datetime(2005, 7, 27), reporter_id=30)
         try:
-            a.save()
+            a1.save()
         except IntegrityError:
-            return
-        self.skipTest("This backend does not support integrity checks.")
+            pass
+        else:
+            self.skipTest("This backend does not support integrity checks.")
+        # Now that we know this backend supports integrity checks we make sure
+        # constraints are also enforced for proxy models. Refs #17519
+        a2 = models.Article(headline='This is another test', reporter=self.r,
+                            pub_date=datetime.datetime(2012, 8, 3),
+                            reporter_proxy_id=30)
+        self.assertRaises(IntegrityError, a2.save)
 
     def test_integrity_checks_on_update(self):
         """
@@ -628,14 +635,26 @@ class FkConstraintsTests(TransactionTestCase):
         """
         # Create an Article.
         models.Article.objects.create(headline="Test article", pub_date=datetime.datetime(2010, 9, 4), reporter=self.r)
-        # Retrive it from the DB
-        a = models.Article.objects.get(headline="Test article")
-        a.reporter_id = 30
+        # Retrieve it from the DB
+        a1 = models.Article.objects.get(headline="Test article")
+        a1.reporter_id = 30
         try:
-            a.save()
+            a1.save()
         except IntegrityError:
-            return
-        self.skipTest("This backend does not support integrity checks.")
+            pass
+        else:
+            self.skipTest("This backend does not support integrity checks.")
+        # Now that we know this backend supports integrity checks we make sure
+        # constraints are also enforced for proxy models. Refs #17519
+        # Create another article
+        r_proxy = models.ReporterProxy.objects.get(pk=self.r.pk)
+        models.Article.objects.create(headline='Another article',
+                                      pub_date=datetime.datetime(1988, 5, 15),
+                                      reporter=self.r, reporter_proxy=r_proxy)
+        # Retreive the second article from the DB
+        a2 = models.Article.objects.get(headline='Another article')
+        a2.reporter_proxy_id = 30
+        self.assertRaises(IntegrityError, a2.save)
 
     def test_disable_constraint_checks_manually(self):
         """