Kaydet (Commit) 04415bf8 authored tarafından Juan Catalano's avatar Juan Catalano Kaydeden (comit) Julien Phalip

Fixed #21013 -- Ensure that ModelAdmin.get_queryset is considered for the admin history view.

üst e192739b
...@@ -144,6 +144,7 @@ answer newbie questions, and generally made Django that much better: ...@@ -144,6 +144,7 @@ answer newbie questions, and generally made Django that much better:
Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com> Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com>
Jeremy Carbaugh <jcarbaugh@gmail.com> Jeremy Carbaugh <jcarbaugh@gmail.com>
Graham Carlyle <graham.carlyle@maplecroft.net> Graham Carlyle <graham.carlyle@maplecroft.net>
Juan Catalano <catalanojuan@gmail.com>
Antonio Cavedoni <http://cavedoni.com/> Antonio Cavedoni <http://cavedoni.com/>
cedric@terramater.net cedric@terramater.net
Chris Chamberlin <dja@cdc.msbx.net> Chris Chamberlin <dja@cdc.msbx.net>
......
...@@ -1537,7 +1537,7 @@ class ModelAdmin(BaseModelAdmin): ...@@ -1537,7 +1537,7 @@ class ModelAdmin(BaseModelAdmin):
from django.contrib.admin.models import LogEntry from django.contrib.admin.models import LogEntry
# First check if the user can see this history. # First check if the user can see this history.
model = self.model model = self.model
obj = get_object_or_404(model, pk=unquote(object_id)) obj = get_object_or_404(self.get_queryset(request), pk=unquote(object_id))
if not self.has_change_permission(request, obj): if not self.has_change_permission(request, obj):
raise PermissionDenied raise PermissionDenied
......
...@@ -30,7 +30,7 @@ from .models import (Article, Chapter, Account, Media, Child, Parent, Picture, ...@@ -30,7 +30,7 @@ from .models import (Article, Chapter, Account, Media, Child, Parent, Picture,
AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod, AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod,
AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated, AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated,
RelatedPrepopulated, UndeletableObject, UnchangeableObject, UserMessenger, Simple, Choice, RelatedPrepopulated, UndeletableObject, UnchangeableObject, UserMessenger, Simple, Choice,
ShortMessage, Telegram) ShortMessage, Telegram, FilteredManager)
def callable_year(dt_value): def callable_year(dt_value):
...@@ -674,6 +674,12 @@ def callable_on_unknown(obj): ...@@ -674,6 +674,12 @@ def callable_on_unknown(obj):
class AttributeErrorRaisingAdmin(admin.ModelAdmin): class AttributeErrorRaisingAdmin(admin.ModelAdmin):
list_display = [callable_on_unknown, ] list_display = [callable_on_unknown, ]
class CustomManagerAdmin(admin.ModelAdmin):
def get_queryset(self, request):
return FilteredManager.objects
class MessageTestingAdmin(admin.ModelAdmin): class MessageTestingAdmin(admin.ModelAdmin):
actions = ["message_debug", "message_info", "message_success", actions = ["message_debug", "message_info", "message_success",
"message_warning", "message_error", "message_extra_tags"] "message_warning", "message_error", "message_extra_tags"]
...@@ -773,6 +779,7 @@ site.register(Question) ...@@ -773,6 +779,7 @@ site.register(Question)
site.register(Answer) site.register(Answer)
site.register(PrePopulatedPost, PrePopulatedPostAdmin) site.register(PrePopulatedPost, PrePopulatedPostAdmin)
site.register(ComplexSortedPerson, ComplexSortedPersonAdmin) site.register(ComplexSortedPerson, ComplexSortedPersonAdmin)
site.register(FilteredManager, CustomManagerAdmin)
site.register(PluggableSearchPerson, PluggableSearchPersonAdmin) site.register(PluggableSearchPerson, PluggableSearchPersonAdmin)
site.register(PrePopulatedPostLargeSlug, PrePopulatedPostLargeSlugAdmin) site.register(PrePopulatedPostLargeSlug, PrePopulatedPostLargeSlugAdmin)
site.register(AdminOrderedField, AdminOrderedFieldAdmin) site.register(AdminOrderedField, AdminOrderedFieldAdmin)
......
...@@ -693,3 +693,14 @@ class Simple(models.Model): ...@@ -693,3 +693,14 @@ class Simple(models.Model):
class Choice(models.Model): class Choice(models.Model):
choice = models.IntegerField(blank=True, null=True, choice = models.IntegerField(blank=True, null=True,
choices=((1, 'Yes'), (0, 'No'), (None, 'No opinion'))) choices=((1, 'Yes'), (0, 'No'), (None, 'No opinion')))
class _Manager(models.Manager):
def get_queryset(self):
return super(_Manager, self).get_queryset().filter(pk__gt=1)
class FilteredManager(models.Model):
def __str__(self):
return "PK=%d" % self.pk
pk_gt_1 = _Manager()
objects = models.Manager()
...@@ -48,7 +48,7 @@ from .models import (Article, BarAccount, CustomArticle, EmptyModel, FooAccount, ...@@ -48,7 +48,7 @@ from .models import (Article, BarAccount, CustomArticle, EmptyModel, FooAccount,
AdminOrderedModelMethod, AdminOrderedAdminMethod, AdminOrderedCallable, AdminOrderedModelMethod, AdminOrderedAdminMethod, AdminOrderedCallable,
Report, MainPrepopulated, RelatedPrepopulated, UnorderedObject, Report, MainPrepopulated, RelatedPrepopulated, UnorderedObject,
Simple, UndeletableObject, UnchangeableObject, Choice, ShortMessage, Simple, UndeletableObject, UnchangeableObject, Choice, ShortMessage,
Telegram, Pizza, Topping) Telegram, Pizza, Topping, FilteredManager)
from .admin import site, site2 from .admin import site, site2
...@@ -2656,6 +2656,12 @@ class AdminCustomQuerysetTest(TestCase): ...@@ -2656,6 +2656,12 @@ class AdminCustomQuerysetTest(TestCase):
def setUp(self): def setUp(self):
self.client.login(username='super', password='secret') self.client.login(username='super', password='secret')
self.pks = [EmptyModel.objects.create().id for i in range(3)] self.pks = [EmptyModel.objects.create().id for i in range(3)]
self.super_login = {
REDIRECT_FIELD_NAME: '/test_admin/admin/',
LOGIN_FORM_KEY: 1,
'username': 'super',
'password': 'secret',
}
def test_changelist_view(self): def test_changelist_view(self):
response = self.client.get('/test_admin/admin/admin_views/emptymodel/') response = self.client.get('/test_admin/admin/admin_views/emptymodel/')
...@@ -2873,6 +2879,20 @@ class AdminCustomQuerysetTest(TestCase): ...@@ -2873,6 +2879,20 @@ class AdminCustomQuerysetTest(TestCase):
html=True html=True
) )
def test_history_view_custom_qs(self):
"""
Ensure that custom querysets are considered for the admin history view.
Refs #21013.
"""
self.client.post('/test_admin/admin/', self.super_login)
FilteredManager.objects.create(pk=1)
FilteredManager.objects.create(pk=2)
response = self.client.get('/test_admin/admin/admin_views/filteredmanager/')
self.assertContains(response, "PK=1")
self.assertContains(response, "PK=2")
self.assertEqual(self.client.get('/test_admin/admin/admin_views/filteredmanager/1/history/').status_code, 200)
self.assertEqual(self.client.get('/test_admin/admin/admin_views/filteredmanager/2/history/').status_code, 200)
@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) @override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
class AdminInlineFileUploadTest(TestCase): class AdminInlineFileUploadTest(TestCase):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment