From bf8ba7a0be99d74d278dc1fe25698a024427d06b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alieh=20Ryma=C5=A1e=C5=ADski?= Date: Wed, 22 Apr 2020 17:42:53 +0300 Subject: [PATCH] Add admin filter by timestamp It's backed by django-admin-rangefilter if able. --- setup.py | 1 + src/auditlog/admin.py | 4 ++-- src/auditlog/filters.py | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 97f4912..b661189 100644 --- a/setup.py +++ b/setup.py @@ -11,6 +11,7 @@ setup( maintainer='Alieh Rymašeŭski', description='Audit log app for Django', install_requires=[ + 'django-admin-rangefilter>=0.5.0', 'django-jsonfield>=1.0.0', 'python-dateutil>=2.6.0', ], diff --git a/src/auditlog/admin.py b/src/auditlog/admin.py index 656249a..523708e 100644 --- a/src/auditlog/admin.py +++ b/src/auditlog/admin.py @@ -6,7 +6,7 @@ from django.utils.functional import cached_property from .models import LogEntry from .mixins import LogEntryAdminMixin -from .filters import ResourceTypeFilter, FieldFilter +from .filters import ResourceTypeFilter, FieldFilter, get_timestamp_filter class TimeLimitedPaginator(Paginator): @@ -30,7 +30,7 @@ class TimeLimitedPaginator(Paginator): class LogEntryAdmin(admin.ModelAdmin, LogEntryAdminMixin): list_display = ['created', 'resource_url', 'action', 'msg_short', 'user_url'] search_fields = ['timestamp', 'object_repr', 'changes', 'actor__first_name', 'actor__last_name'] - list_filter = ['action', ResourceTypeFilter, FieldFilter] + list_filter = ['action', ResourceTypeFilter, FieldFilter, ('timestamp', get_timestamp_filter())] readonly_fields = ['created', 'resource_url', 'action', 'user_url', 'msg'] fieldsets = [ (None, {'fields': ['created', 'user_url', 'resource_url']}), diff --git a/src/auditlog/filters.py b/src/auditlog/filters.py index 688b41f..16c80dc 100644 --- a/src/auditlog/filters.py +++ b/src/auditlog/filters.py @@ -1,4 +1,6 @@ +from django.apps import apps from django.contrib.admin import SimpleListFilter +from django.contrib.admin.filters import DateFieldListFilter from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.fields import JSONField from django.db import connection @@ -64,3 +66,15 @@ class FieldFilter(SimpleListFilter): queryset.annotate(changes_json=Cast("changes", JSONField())) .filter(**{'changes_json__{}__isnull'.format(self.value()): False}) ) + + +def get_timestamp_filter(): + """Returns rangefilter filter class if able or a simple list filter as a fallback.""" + if apps.is_installed("rangefilter"): + try: + from rangefilter.filter import DateTimeRangeFilter + return DateTimeRangeFilter + except ImportError: + pass + + return DateFieldListFilter