|
3 | 3 | from django.conf import settings
|
4 | 4 | from django.contrib import admin
|
5 | 5 | from django.contrib.admin import helpers
|
| 6 | +from django.contrib.admin.views.main import ChangeList |
6 | 7 | from django.contrib.admin.utils import quote, unquote
|
7 | 8 | from django.contrib.auth import get_permission_codename, get_user_model
|
8 | 9 | from django.core.exceptions import PermissionDenied
|
@@ -285,38 +286,47 @@ def enforce_history_permissions(self):
|
285 | 286 | )
|
286 | 287 |
|
287 | 288 |
|
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" |
292 | 313 |
|
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"),) |
295 | 316 |
|
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 |
300 | 321 |
|
| 322 | + |
| 323 | +class SimpleHistoryWithDeletedAdmin(SimpleHistoryAdmin): |
301 | 324 | 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 |
318 | 326 |
|
319 | 327 | 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] + [ |
321 | 331 | f for f in super().get_list_filter(request)
|
322 | 332 | ]
|
0 commit comments