|
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.utils import unquote |
| 6 | +from django.contrib.admin.utils import unquote, quote |
7 | 7 | from django.contrib.auth import get_permission_codename
|
8 | 8 | from django.core.exceptions import PermissionDenied
|
9 | 9 | from django.shortcuts import get_object_or_404, render
|
@@ -286,37 +286,40 @@ def enforce_history_permissions(self):
|
286 | 286 | )
|
287 | 287 |
|
288 | 288 |
|
289 |
| -class SimpleHistoryShowDeletedFilter(admin.SimpleListFilter): |
| 289 | +class SimpleHistoryWithDeletedAdmin(SimpleHistoryAdmin): |
| 290 | + class SimpleHistoryShowDeletedFilter(admin.SimpleListFilter): |
290 | 291 | title = "Entries"
|
291 | 292 | parameter_name = "entries"
|
292 | 293 |
|
293 | 294 | def lookups(self, request, model_admin):
|
294 |
| - return ( |
295 |
| - ("deleted_only", "Only Deleted"), |
296 |
| - ) |
| 295 | + return ( |
| 296 | + ("deleted_only", "Only Deleted"), |
| 297 | + ) |
297 | 298 |
|
298 | 299 | def queryset(self, request, queryset):
|
299 |
| - if self.value(): |
300 |
| - return queryset.model.history.filter(history_type='-').distinct() |
301 |
| - return queryset |
302 |
| - |
303 |
| - |
304 |
| -class YourModelAdmin(SimpleHistoryAdmin): |
305 |
| - def get_changelist(self, request, **kwargs): |
306 |
| - def url_from_result_maker(history=False): |
307 |
| - def custom_url_for_result(self, result): |
308 |
| - pk = getattr(result, self.pk_attname) |
309 |
| - from django.urls import reverse |
310 |
| - from django.contrib.admin.utils import quote |
311 |
| - route_type = 'history' if history else 'change' |
312 |
| - route = f'{self.opts.app_label}_{self.opts.model_name}_{route_type}' |
313 |
| - return reverse(f'admin:{route}', |
314 |
| - args=(quote(pk),), |
315 |
| - current_app=self.model_admin.admin_site.name) |
316 |
| - return custom_url_for_result |
317 |
| - changelist = super().get_changelist(request, **kwargs) |
318 |
| - if request.GET.get('entries', None) == 'deleted_only': |
319 |
| - changelist.url_for_result = url_from_result_maker(history=True) |
320 |
| - else: |
321 |
| - changelist.url_for_result = url_from_result_maker(history=False) |
322 |
| - return changelist |
| 300 | + if self.value(): |
| 301 | + return queryset.model.history.filter(history_type='-').distinct() |
| 302 | + return queryset |
| 303 | + |
| 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 | + ] |
0 commit comments