Skip to content

Commit 95cebf5

Browse files
duebbertmjsir911
authored andcommitted
Fix for django 4.0.4
I think the ChangeList.apply_select_related() method might have changed.
1 parent 8819429 commit 95cebf5

File tree

1 file changed

+40
-30
lines changed

1 file changed

+40
-30
lines changed

simple_history/admin.py

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.contrib import admin
55
from django.contrib.admin import helpers
66
from django.contrib.admin.utils import unquote, quote
7+
from django.contrib.admin.views.main import ChangeList
78
from django.contrib.auth import get_permission_codename
89
from django.core.exceptions import PermissionDenied
910
from django.shortcuts import get_object_or_404, render
@@ -286,40 +287,49 @@ def enforce_history_permissions(self):
286287
)
287288

288289

289-
class SimpleHistoryWithDeletedAdmin(SimpleHistoryAdmin):
290-
class SimpleHistoryShowDeletedFilter(admin.SimpleListFilter):
290+
class SimpleHistoryChangeList(ChangeList):
291+
def apply_select_related(self, qs):
292+
# Our qs is different if we use the history, so the normal select_related
293+
# won't work and results in an empty QuerySet result.
294+
history = self.params.get("entries", None) == "deleted_only"
295+
if history:
296+
return qs
297+
return super().apply_select_related(qs)
298+
299+
def url_for_result(self, result) -> str:
300+
history = self.params.get("entries", None) == "deleted_only"
301+
route_type = "history" if history else "change"
302+
route = f"{self.opts.app_label}_{self.opts.model_name}_{route_type}"
303+
pk = getattr(result, self.pk_attname)
304+
return reverse(
305+
f"admin:{route}",
306+
args=(quote(pk),),
307+
current_app=self.model_admin.admin_site.name,
308+
)
309+
310+
311+
class SimpleHistoryShowDeletedFilter(admin.SimpleListFilter):
291312
title = "Entries"
292313
parameter_name = "entries"
293314

294315
def lookups(self, request, model_admin):
295-
return (
296-
("deleted_only", "Only Deleted"),
297-
)
316+
return (
317+
("deleted_only", "Only Deleted"),
318+
)
298319

299320
def queryset(self, request, queryset):
300-
if self.value():
301-
return queryset.model.history.filter(history_type='-').distinct()
302-
return queryset
321+
if self.value():
322+
return queryset.model.history.filter(history_type='-').distinct()
323+
return queryset
303324

304-
def get_changelist(self, request, **kwargs):
305-
def url_from_result_maker(history=False):
306-
def custom_url_for_result(self, result):
307-
pk = getattr(result, self.pk_attname)
308-
route_type = 'history' if history else 'change'
309-
route = f'{self.opts.app_label}_{self.opts.model_name}_{route_type}'
310-
return reverse(f'admin:{route}',
311-
args=(quote(pk),),
312-
current_app=self.model_admin.admin_site.name)
313-
return custom_url_for_result
314-
315-
changelist = super().get_changelist(request, **kwargs)
316-
if request.GET.get('entries', None) == 'deleted_only':
317-
changelist.url_for_result = url_from_result_maker(history=True)
318-
else:
319-
changelist.url_for_result = url_from_result_maker(history=False)
320-
return changelist
321-
322-
def get_list_filter(self, request):
323-
return [self.SimpleHistoryShowDeletedFilter] + [
324-
f for f in super().get_list_filter(request)
325-
]
325+
326+
class SimpleHistoryWithDeletedAdmin(SimpleHistoryAdmin):
327+
def get_changelist(self, request, **kwargs):
328+
return SimpleHistoryChangeList
329+
330+
def get_list_filter(self, request):
331+
# Doing it here will add it to every inherited class. Alternatively,
332+
# add SimpleHistoryShowDeletedFilter to the list_filter and remove the below.
333+
return [SimpleHistoryShowDeletedFilter] + [
334+
f for f in super().get_list_filter(request)
335+
]

0 commit comments

Comments
 (0)