Skip to content

Commit 7bb7b4f

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

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, get_user_model
89
from django.core.exceptions import PermissionDenied
@@ -285,38 +286,47 @@ def enforce_history_permissions(self):
285286
)
286287

287288

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

293-
def lookups(self, request, model_admin):
294-
return (("deleted_only", "Only Deleted"),)
314+
def lookups(self, request, model_admin):
315+
return (("deleted_only", "Only Deleted"),)
295316

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

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

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

0 commit comments

Comments
 (0)