Skip to content

Commit e5fc8d1

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

File tree

1 file changed

+37
-27
lines changed

1 file changed

+37
-27
lines changed

simple_history/admin.py

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django.conf import settings
44
from django.contrib import admin
55
from django.contrib.admin import helpers
6+
from django.contrib.admin.views.main import ChangeList
67
from django.contrib.admin.utils import quote, unquote
78
from django.contrib.auth import get_permission_codename
89
from django.core.exceptions import PermissionDenied
@@ -286,38 +287,47 @@ def enforce_history_permissions(self):
286287
)
287288

288289

289-
class SimpleHistoryWithDeletedAdmin(SimpleHistoryAdmin):
290-
class SimpleHistoryShowDeletedFilter(admin.SimpleListFilter):
291-
title = "Entries"
292-
parameter_name = "entries"
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):
312+
title = "Entries"
313+
parameter_name = "entries"
293314

294-
def lookups(self, request, model_admin):
295-
return (("deleted_only", "Only Deleted"),)
315+
def lookups(self, request, model_admin):
316+
return (("deleted_only", "Only Deleted"),)
296317

297-
def queryset(self, request, queryset):
298-
if self.value():
299-
return queryset.model.history.filter(history_type="-").distinct()
300-
return queryset
318+
def queryset(self, request, queryset):
319+
if self.value():
320+
return queryset.model.history.filter(history_type="-").distinct()
321+
return queryset
301322

323+
324+
class SimpleHistoryWithDeletedAdmin(SimpleHistoryAdmin):
302325
def get_changelist(self, request, **kwargs):
303-
def url_from_result_maker(history=False):
304-
def custom_url_for_result(self, result):
305-
pk = getattr(result, self.pk_attname)
306-
route_type = 'history' if history else 'change'
307-
route = f'{self.opts.app_label}_{self.opts.model_name}_{route_type}'
308-
return reverse(f'admin:{route}',
309-
args=(quote(pk),),
310-
current_app=self.model_admin.admin_site.name)
311-
return custom_url_for_result
312-
313-
changelist = super().get_changelist(request, **kwargs)
314-
if request.GET.get('entries', None) == 'deleted_only':
315-
changelist.url_for_result = url_from_result_maker(history=True)
316-
else:
317-
changelist.url_for_result = url_from_result_maker(history=False)
318-
return changelist
326+
return SimpleHistoryChangeList
319327

320328
def get_list_filter(self, request):
321-
return [self.SimpleHistoryShowDeletedFilter] + [
329+
# Doing it here will add it to every inherited class. Alternatively,
330+
# add SimpleHistoryShowDeletedFilter to the list_filter and remove the below.
331+
return [SimpleHistoryShowDeletedFilter] + [
322332
f for f in super().get_list_filter(request)
323333
]

0 commit comments

Comments
 (0)