summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Holtermann <info@markusholtermann.eu>2015-06-18 21:57:08 +0200
committerMarkus Holtermann <info@markusholtermann.eu>2015-06-19 19:15:01 +0200
commitf64a3de2d4b623087c70405523a08a4e6043d102 (patch)
tree6b36c112fc765e983c086c1bcda311966ed35a6e
parentaa00f482801c78d0688ec347160177fd05e5d4c6 (diff)
[1.8.x] Fixed #24940 -- Made model managers hashable
Thanks Federico Jaramillo Martínez for the report and Tim Graham for the test and review. Backport of d3d66d47222dd8765a20a15fdc754c0ed7635404 from master
-rw-r--r--django/db/models/manager.py3
-rw-r--r--docs/releases/1.8.3.txt3
-rw-r--r--tests/generic_inline_admin/models.py2
-rw-r--r--tests/generic_inline_admin/tests.py15
4 files changed, 21 insertions, 2 deletions
diff --git a/django/db/models/manager.py b/django/db/models/manager.py
index e194e28feb..ae6ed257ee 100644
--- a/django/db/models/manager.py
+++ b/django/db/models/manager.py
@@ -236,6 +236,9 @@ class BaseManager(object):
def __ne__(self, other):
return not (self == other)
+ def __hash__(self):
+ return id(self)
+
class Manager(BaseManager.from_queryset(QuerySet)):
pass
diff --git a/docs/releases/1.8.3.txt b/docs/releases/1.8.3.txt
index ee525c9275..90008e184e 100644
--- a/docs/releases/1.8.3.txt
+++ b/docs/releases/1.8.3.txt
@@ -74,3 +74,6 @@ Bugfixes
* Fixed crash when uploading images with MIME types that Pillow doesn't detect,
such as bitmap, in ``forms.ImageField`` (:ticket:`24948`).
+
+* Fixed a regression when deleting a model through the admin that has a
+ ``GenericRelation`` with a ``related_query_name`` (:ticket:`24940`).
diff --git a/tests/generic_inline_admin/models.py b/tests/generic_inline_admin/models.py
index d15f2b9f17..491536be58 100644
--- a/tests/generic_inline_admin/models.py
+++ b/tests/generic_inline_admin/models.py
@@ -48,7 +48,7 @@ class PhoneNumber(models.Model):
class Contact(models.Model):
name = models.CharField(max_length=50)
- phone_numbers = GenericRelation(PhoneNumber)
+ phone_numbers = GenericRelation(PhoneNumber, related_query_name='phone_numbers')
#
diff --git a/tests/generic_inline_admin/tests.py b/tests/generic_inline_admin/tests.py
index 4f94599f9d..fb85a7e33e 100644
--- a/tests/generic_inline_admin/tests.py
+++ b/tests/generic_inline_admin/tests.py
@@ -8,6 +8,8 @@ from django.contrib.admin.sites import AdminSite
from django.contrib.auth.models import User
from django.contrib.contenttypes.admin import GenericTabularInline
from django.contrib.contenttypes.forms import generic_inlineformset_factory
+from django.contrib.contenttypes.models import ContentType
+from django.core.urlresolvers import reverse
from django.forms.formsets import DEFAULT_MAX_NUM
from django.forms.models import ModelForm
from django.test import (
@@ -16,7 +18,7 @@ from django.test import (
from django.utils.deprecation import RemovedInDjango19Warning
from .admin import MediaInline, MediaPermanentInline, site as admin_site
-from .models import Category, Episode, EpisodePermanent, Media
+from .models import Category, Episode, EpisodePermanent, Media, PhoneNumber
# Set DEBUG to True to ensure {% include %} will raise exceptions.
@@ -301,6 +303,17 @@ class GenericInlineAdminWithUniqueTogetherTest(TestCase):
response = self.client.post('/generic_inline_admin/admin/generic_inline_admin/contact/add/', post_data)
self.assertEqual(response.status_code, 302) # redirect somewhere
+ def test_delete(self):
+ from .models import Contact
+ c = Contact.objects.create(name='foo')
+ PhoneNumber.objects.create(
+ object_id=c.id,
+ content_type=ContentType.objects.get_for_model(Contact),
+ phone_number="555-555-5555",
+ )
+ response = self.client.post(reverse('admin:generic_inline_admin_contact_delete', args=[c.pk]))
+ self.assertContains(response, 'Are you sure you want to delete')
+
@override_settings(ROOT_URLCONF="generic_inline_admin.urls")
class NoInlineDeletionTest(TestCase):