From 13064ee547a431bee2f31a8b4aeb6ee779b19781 Mon Sep 17 00:00:00 2001 From: ort Date: Mon, 6 Apr 2020 09:21:04 +0900 Subject: [PATCH] admin: use BitHandler instead of bitor operator Fixes #61, #64, and #89 in BitFieldListFilter, with a more efficient implementation. --- bitfield/admin.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/bitfield/admin.py b/bitfield/admin.py index 104e76e..1caf48b 100644 --- a/bitfield/admin.py +++ b/bitfield/admin.py @@ -6,8 +6,7 @@ from django.contrib.admin import FieldListFilter from django.contrib.admin.options import IncorrectLookupParameters -from bitfield import Bit -from bitfield.compat import bitor +from bitfield import Bit, BitHandler class BitFieldListFilter(FieldListFilter): @@ -24,9 +23,14 @@ def __init__(self, field, request, params, model, model_admin, field_path): field, request, params, model, model_admin, field_path) def queryset(self, request, queryset): - filter = dict((p, bitor(F(p), v)) for p, v in six.iteritems(self.used_parameters)) + filter_kwargs = dict( + (p, BitHandler(v, ())) + for p, v in six.iteritems(self.used_parameters) + ) + if not filter_kwargs: + return queryset try: - return queryset.filter(**filter) + return queryset.filter(**filter_kwargs) except ValidationError as e: raise IncorrectLookupParameters(e)