diff options
| author | Markus Holtermann <info@markusholtermann.eu> | 2015-06-18 21:57:08 +0200 |
|---|---|---|
| committer | Markus Holtermann <info@markusholtermann.eu> | 2015-06-19 19:15:01 +0200 |
| commit | f64a3de2d4b623087c70405523a08a4e6043d102 (patch) | |
| tree | 6b36c112fc765e983c086c1bcda311966ed35a6e | |
| parent | aa00f482801c78d0688ec347160177fd05e5d4c6 (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.py | 3 | ||||
| -rw-r--r-- | docs/releases/1.8.3.txt | 3 | ||||
| -rw-r--r-- | tests/generic_inline_admin/models.py | 2 | ||||
| -rw-r--r-- | tests/generic_inline_admin/tests.py | 15 |
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): |
