from django.contrib import admin from django.utils.translation import ugettext_lazy as _ class ValueRangeFilter(admin.FieldListFilter): def __init__(self, field, *args, **kwargs): self.lookup_kwarg = '%s__range' % kwargs['field_path'] self.lookup_choices = getattr(field, 'lookup_range', ( # default range options (None, _('All')), ([0, 100], '0-100'), ([100, 300], '100-300'), ([300, 1000], '300-1000'), ([1000, 10000], '1000-10000'), ([10000, None], '10000+'), )) super(ValueRangeFilter, self).__init__(field, *args, **kwargs) def expected_parameters(self): return [self.lookup_kwarg] def get_value_range(self): if not self.used_parameters.get(self.lookup_kwarg): return None return [int(n.strip("' ")) if n.strip("' ") != 'None' else None for n in self.used_parameters[self.lookup_kwarg].strip( '[]').split(',')] def choices(self, cl): for lookup, title in self.lookup_choices: yield { 'selected': self.get_value_range() == lookup, 'query_string': cl.get_query_string({ self.lookup_kwarg: lookup, }, []), 'display': title, } def queryset(self, request, queryset): if not self.used_parameters: return queryset values_range = self.get_value_range() if not values_range: return queryset min_val, max_val = values_range if min_val and max_val: query = {'%s__range' % self.field_path: (min_val, max_val)} elif min_val: query = {'%s__gt' % self.field_path: min_val} elif max_val: query = {'%s__lt' % self.field_path: max_val} else: query = {} return queryset.filter(**query)