diff --git a/src/auditlog/filters.py b/src/auditlog/filters.py index c5b651a..b8338ad 100644 --- a/src/auditlog/filters.py +++ b/src/auditlog/filters.py @@ -1,4 +1,9 @@ from django.contrib.admin import SimpleListFilter +from django.contrib.contenttypes.models import ContentType +from django.db.models import Value +from django.db.models.functions import Concat + +from auditlog.registry import auditlog class ResourceTypeFilter(SimpleListFilter): @@ -6,9 +11,17 @@ class ResourceTypeFilter(SimpleListFilter): parameter_name = 'resource_type' def lookups(self, request, model_admin): - qs = model_admin.get_queryset(request) - types = qs.values_list('content_type_id', 'content_type__model') - return list(types.order_by('content_type__model').distinct()) + tracked_model_names = [ + '{}.{}'.format(m._meta.app_label, m._meta.model_name) + for m in auditlog.list() + ] + model_name_concat = Concat('app_label', Value('.'), 'model') + content_types = ContentType.objects.annotate( + model_name=model_name_concat, + ).filter( + model_name__in=tracked_model_names, + ) + return content_types.order_by('model_name').values_list('id', 'model_name') def queryset(self, request, queryset): if self.value() is None: diff --git a/src/auditlog/registry.py b/src/auditlog/registry.py index 124fd3c..4e5cb02 100644 --- a/src/auditlog/registry.py +++ b/src/auditlog/registry.py @@ -114,6 +114,10 @@ class AuditlogModelRegistry(object): 'mapping_fields': self._registry[model]['mapping_fields'], } + def list(self): + """Get a list of all registered models.""" + return list(self._registry.keys()) + class AuditLogModelRegistry(AuditlogModelRegistry): def __init__(self, *args, **kwargs):