class F(FilterSet): price = NumberFilter(lookup_type='lt') average_rating = NumberFilter(lookup_type='gt') class Meta: model = Book fields = ['price', 'average_rating']
def test_filtering_exclude(self): qs = mock.Mock(spec=['exclude']) f = NumberFilter(exclude=True) f.filter(qs, 1) qs.exclude.assert_called_once_with(None__exact=1) # Also test 0 as it once had a bug qs.reset_mock() f.filter(qs, 0) qs.exclude.assert_called_once_with(None__exact=0)
def test_filtering(self): qs = mock.Mock(spec=['filter']) f = NumberFilter() f.filter(qs, 1) qs.filter.assert_called_once_with(None__exact=1) # Also test 0 as it once had a bug qs.reset_mock() f.filter(qs, 0) qs.filter.assert_called_once_with(None__exact=0)
class PlayerScoreFilter(filters.SearchFilter): min_score = NumberFilter(field_name='score', lookup_expr='gte') max_score = NumberFilter(field_name='score', lookup_expr='lte') from_score_date = DateTimeFilter(field_name='score_date', lookup_expr='gte') to_scoreD_date = DateTimeFilter(field_name='scored_date', lookup_expr='lte') player_name = AllValuesFilter(field_name='player__name') game_name = AllValuesFilter(field_name='game__name') class Meta: model = PlayerScore fields = ('score', 'from_score_date', 'to_score_date', 'min_score', 'max_score', 'player_name', 'game_name')
class SessaoPlenariaFilterSet(SaplFilterSetMixin): year = NumberFilter(method='filter_year') month = NumberFilter(method='filter_month') class Meta(SaplFilterSetMixin.Meta): model = SessaoPlenaria def filter_year(self, queryset, name, value): qs = queryset.filter(data_inicio__year=value) return qs def filter_month(self, queryset, name, value): qs = queryset.filter(data_inicio__month=value) return qs
class ServiceAreaFilter(FilterSet): lat = NumberFilter( help_text="Latitude of a point to get intersected polygons") lng = NumberFilter( help_text="Longitude of a point to get intersected polygons") def filter_queryset(self, queryset): lat = self.form.cleaned_data.get('lat', None) lng = self.form.cleaned_data.get('lng', None) if lat and lng: point = Point(float(lat), float(lng)) queryset = queryset.filter(polygon__intersects=point) return queryset
class IndicatorFilter(filters.FilterSet): baseline = NumberFilter(method="get_baseline", label="Baseline") target = NumberFilter(method="get_target", label="Target") def get_target(self, queryset, name, value): return queryset.filter(target__v=value) def get_baseline(self, queryset, name, value): return queryset.filter(baseline__v=value) class Meta: model = Reportable fields = ('id', 'target', 'baseline', 'blueprint__title', 'blueprint__unit', 'indicator_reports')
class EventSearchFilter(django_filters.FilterSet): ownership = MultipleChoiceFilter(choices=[('admin','Created'), ('joined',' Joined')], widget=forms.CheckboxSelectMultiple ) location = ChoiceFilter(name='location',choices=[('Venue','Venue'), ('Online','Online')], widget=forms.Select(attrs={'class': 'selects'})) city = CharFilter(name="city", lookup_expr="icontains", widget=forms.TextInput(attrs={'placeholder': 'City'})) state = CharFilter(name="state", lookup_expr="icontains", widget=forms.TextInput(attrs={'placeholder': 'State'})) country = CharFilter(name="india", lookup_expr="icontains", widget=forms.TextInput(attrs={'placeholder': 'India'})) category = ChoiceFilter(name="category",choices=[('Adventure','Adventure'), ('Business & Tech','Business & Tech'), ('Entertainment','Entertainment'), ('Social','Social'), ('Sports','Sports'), ('Talks','Talks')], widget=forms.Select(attrs={'class': 'selects'})) gender = ChoiceFilter(name='gender',choices=[('Male','Male'), ('Female','Female'), ('Others','Others'), ('Any', 'Any')], widget=forms.Select(attrs={'class': 'selects'})) age_group = ChoiceFilter(name='age',choices=[('Under 18','Under 18'), ('18-30','18-30'), ('30-50','30-50'), ('Above 50','Above 50')], widget=forms.Select(), lookup_expr="icontains", label='Age Group') year = NumberFilter(label='Start Date', name='start_date',lookup_expr='year', widget=forms.NumberInput(attrs={'class': 'form_inps', 'placeholder': 'Year'}) ) month = NumberFilter(label='Start Date', name='start_date',lookup_expr='month', widget=forms.NumberInput(attrs={'class': 'form_inps', 'placeholder': 'Month'}) ) day = NumberFilter(label='Start Date', name='start_date',lookup_expr='day', widget=forms.NumberInput(attrs={'class': 'form_inps', 'placeholder': 'Day'}) ) class Meta: model = Event fields = ['ownership']
class F203Filter(FormFilter): f201 = NumberFilter() RHC = ChoiceFilter(widget=Select2Widget(), choices=RHC.objects.as_choices()) class Meta: model = F203 fields = [ 'id', 'f201', 'SNER', 'NNRT', 'NNRT1', 'NNST', 'RHC', 'CIR', ] def __init__(self, *args, **kwargs): super(F203Filter, self).__init__(*args, **kwargs) self.extend_filter('NNRT', State_Division_Choices) self.extend_filter('NNRT1', District_Choices) self.extend_filter('NNST', Township_or_town_Choices) self.extend_filter('CIR', Sub_code_No_Choices)
class TripSearchFilter(django_filters.FilterSet): dayslist = [(str(i),'0'+str(i)) for i in [i for i in range(1,10)]] + [(str(i),str(i)) for i in [i for i in range(10,32)]] monthslist = [(1,'Jan'), (2,'Feb'), (3,'Mar'), (4,'Apr'), (5,'May'), (6,'Jun'), (7,'Jul'), (8,'Aug'), (9,'Sep'), (10,'Oct'), (11,'Nov'), (12,'Dec')] yearslist = [(i, i) for i in range(2018,2050)] source = django_filters.CharFilter(label="Source:", lookup_expr='icontains', widget=forms.TextInput(attrs={})) destination = django_filters.CharFilter(label="Destination:", lookup_expr='icontains') company = ChoiceFilter(choices=[('Group','Group'), ('Solo','Solo')], widget=forms.Select() ) moto = ChoiceFilter(label='Travel Moto',choices=[('','Any'), ('Adventure','Adventure'), ('Exploring','Exploring'), ('Photography','Photography'), ('Sports Event','Sports Event'), ('Food & Cuisine','Food & Cuisine'), ('Fitness','Fitness'), ('Shopping','Shopping'), ('Travel Blogging','Travel Blogging'), ('Partying','Partying'), ('Backtracking','Backtracking')], widget=forms.Select() ) mode = ChoiceFilter(choices=[('Car','Car'), ('Motorbike','Motorbike'), ('Cycle','Cycle'), ('On-Foot','On-Foot'), ('Any', 'Any') ], widget=forms.Select() ) year = NumberFilter(label='Start Date', name='start_date',lookup_expr='year', widget=forms.NumberInput(attrs={'class': 'search_inputs', 'placeholder': 'Year'}) ) month = NumberFilter(label='Start Date', name='start_date',lookup_expr='month', widget=forms.NumberInput(attrs={'class': 'search_inputs', 'placeholder': 'Month'}) ) day = NumberFilter(label='Start Date', name='start_date',lookup_expr='day', widget=forms.NumberInput(attrs={'class': 'search_inputs', 'placeholder': 'Day'}) ) age_group = ChoiceFilter(choices=[('Under 18','Under 18'), ('18-30','18-30'), ('30-50','30-50'), ('Above 50','Above 50')], widget=forms.Select(), lookup_expr="icontains", label='Age Group' ) #year = ChoiceFilter(name='start_date',choices=yearslist, widget=forms.Select(attrs={'class': 'search_inputs'}) ) #start_date = django_filters.NumberFilter(name='start_date', lookup_expr='year') ownership = MultipleChoiceFilter(choices=[('admin','Created'), ('joined',' Joined')], widget=forms.CheckboxSelectMultiple ) location = ChoiceFilter(choices=[('male','Male'), ('female','Female'), ('others','Others'), ('any','Any')], widget=forms.Select()) gender = ChoiceFilter(choices=[('male','Male'), ('female','Female'), ('others','Others'), ('Any', 'Any')], widget=forms.Select(attrs={'class': 'selects'})) trip_id = django_filters.CharFilter(label="Trip id:", name="trip_id", lookup_expr='icontains', widget=forms.TextInput(attrs={})) class Meta: model = Trip fields = []
class QuestionFilter(FilterSet): # Added at 2022-03-23. Added for backward compatibility. # TODO: Remove it after some time if required module = NumberFilter(field_name="group__module", lookup_expr="exact") class Meta: model = Question fields = { "title": ["exact"], "answer_type": ["exact"], "group": ["exact"], "group__module": ["exact"], "is_required": ["exact"], }
class LocationFilter(django_filters.FilterSet): loc_type = NumberFilter(method='get_loc_type') cluster_objectives = CharFilter(method='get_cluster_objectives') title = CharFilter(method='get_title') class Meta: model = Location fields = ['loc_type', 'cluster_objectives', 'title'] def get_loc_type(self, queryset, name, value): return queryset.filter(gateway__admin_level=value) def get_cluster_objectives(self, queryset, name, value): return queryset.filter( gateway__country__workspaces__response_plans__clusters__cluster_objectives__in=value.split(',')) def get_title(self, queryset, name, value): return queryset.filter(title__icontains=value)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for instance_type in instance_type_choices: for score_type in score_types: field_name = str(instance_type[0]).replace( '-', '_') + '_' + str(score_type[0]) for lookup_expr in ['gte', 'lte']: self.filters[field_name + '__' + lookup_expr] = NumberFilter( field_name=field_name, label=str(instance_type[1]) + ' ' + str(score_type[1]) + ' ' + verbose_lookup_expr(lookup_expr), lookup_expr=lookup_expr) self.filters[field_name + '__isnull'] = BooleanFilter( field_name=field_name, label=str(instance_type[1]) + ' ' + str(score_type[1]) + ' ' + verbose_lookup_expr('isnull'), lookup_expr='isnull')
class DistribuidorFilterSet(FilterSet): tanqueVenta = NumberFilter(method='filter_field_gt', field_name='tanque__disponibilidad_venta') tanqueRecarga = NumberFilter(method='filter_field_gt', field_name='tanque__disponibilidad_recarga') tanqueRenta = NumberFilter(method='filter_field_gt', field_name='tanque__disponibilidad_renta') concentradorVenta = NumberFilter( method='filter_field_gt', field_name='concentrador__disponibilidad_venta') concentradorRenta = NumberFilter( method='filter_field_gt', field_name='concentrador__disponibilidad_renta') pagoConTarjeta = NumberFilter(method='filter_field_bool', field_name='pago_con_tarjeta') aDomicilio = NumberFilter(method='filter_field_bool', field_name='a_domicilio') incluirBajas = NumberFilter(method='filter_field_bool', field_name='dar_de_baja') abreSabado = NumberFilter(method='filter_field_bool', field_name='abre_sabado') abreDomingo = NumberFilter(method='filter_field_bool', field_name='abre_domingo') abierto24 = NumberFilter(method='filter_field_bool', field_name='abre_24h') gratis = NumberFilter(method='filter_field_bool', field_name='recarga_gratis') nombreComo = CharFilter(method='filter_char_containts', field_name='nombre_distribuidor__unaccent') def filter_field_gt(self, queryset, name, value): lookup = '__'.join([name, 'gt']) name_split = name.split('_') ofrece = '_'.join([name_split[0] + '_', 'ofrece', name_split[-1]]) return queryset.filter(**{ lookup: 0 }).filter(**{ ofrece: True }).distinct() def filter_field_bool(self, queryset, name, value): return queryset.filter(**{name: bool(value)}).distinct() def filter_char_containts(self, queryset, name, value): lookup = '__'.join([name, 'icontains']) return queryset.filter(**{lookup: value}).distinct() class Meta: model = Distribuidor fields = ('tanqueVenta', 'tanqueRecarga', 'tanqueRenta', 'concentradorVenta', 'concentradorRenta', 'pagoConTarjeta', 'aDomicilio', 'incluirBajas', 'nombreComo', 'abierto24', 'gratis', 'abreSabado', 'abreDomingo')
class ImpressoEnderecamentoContatoFilterSet(FilterSet): FEMININO = 'F' MASCULINO = 'M' AMBOS = '' SEXO_CHOICE = ((AMBOS, _('Ambos')), (FEMININO, _('Feminino')), (MASCULINO, _('Masculino'))) DEPOIS_PRONOME = 'DP' LINHA_NOME = 'LN' DEPOIS_NOME = 'DN' LOCAL_CARGO_CHOICE = ((DEPOIS_PRONOME, _('Depois do Pronome ' 'de tratamento')), (LINHA_NOME, _('Antes do Nome do Contato')), (DEPOIS_NOME, _('Entre o Nome do Contato ' 'e seu Endereço'))) FILHOS_CHOICE = [(None, _('Ambos'))] + YES_NO_CHOICES search = CharFilter(method='filter_search') sexo = ChoiceFilter(choices=SEXO_CHOICE) tem_filhos = ChoiceFilter(label=_('Com filhos?'), choices=FILHOS_CHOICE) idade = RangeFilter(label=_('Idade entre:'), widget=RangeWidgetNumber, method='filter_idade') impresso = ModelChoiceFilter( label=ImpressoEnderecamento._meta.verbose_name_plural, required=True, queryset=ImpressoEnderecamento.objects.all(), method='filter_impresso') grupo = ChoiceFilter(label=_('Contatos Agrupados'), required=False, method='filter_grupo') imprimir_pronome = ChoiceFilter(label=_('Imprimir Pronome?'), choices=YES_NO_CHOICES, required=True, initial=False, method='filter_imprimir_pronome') imprimir_cargo = ChoiceFilter(label=_('Imprimir Cargo?'), required=True, empty_label=None, choices=YES_NO_CHOICES, initial=False, method='filter_imprimir_cargo') fontsize = NumberFilter(label=_('Tamanho da Fonte'), initial='', max_value=100, min_value=0, max_digits=3, decimal_places=0, method='filter_fontsize') nome_maiusculo = ChoiceFilter(label=_('Nome Maiúsculo'), choices=YES_NO_CHOICES, initial=False, method='filter_nome_maiusculo') local_cargo = ChoiceFilter(label=_('Local para imprimir o Cargo'), choices=LOCAL_CARGO_CHOICE, initial=False, method='filter_local_cargo') def filter_impresso(self, queryset, field_name, value): return queryset def filter_fontsize(self, queryset, field_name, value): return queryset def filter_grupo(self, queryset, field_name, value): if value == '0': queryset = queryset.filter(grupodecontatos_set__isnull=True) elif value != '': queryset = queryset.filter(grupodecontatos_set=value) return queryset def filter_local_cargo(self, queryset, field_name, value): return queryset def filter_imprimir_pronome(self, queryset, field_name, value): return queryset def filter_imprimir_cargo(self, queryset, field_name, value): return queryset def filter_nome_maiusculo(self, queryset, field_name, value): return queryset def filter_idade(self, queryset, field_name, value): idi = int(value.start) if value.start is not None else 0 idf = int( value.stop) if value.stop is not None else date.today().year - 2 if idi > idf: a = idi idi = idf idf = a # lim inicial-dt.mais antiga li = date.today() - relativedelta(years=idf + 1) # lim final - dt. mais nova lf = date.today() - relativedelta(years=idi) return queryset.filter(data_nascimento__gt=li, data_nascimento__lte=lf) def filter_search(self, queryset, field_name, value): query = normalize(value) query = query.split(' ') if query: q = Q() for item in query: if not item: continue q = q & Q(search__icontains=item) if q: queryset = queryset.filter(q) return queryset def filter_data_nascimento(self, queryset, field_name, value): #_where = "date_part('year', age(timestamp '%s', data_nascimento)) != date_part('year', age(timestamp '%s', data_nascimento))" # return queryset.extra(where=_where, params=value) if not value[0] or not value[1]: return queryset now = datetime.datetime.strptime(value[0], "%d/%m/%Y").date() then = datetime.datetime.strptime(value[1], "%d/%m/%Y").date() if now > then: a = now now = then then = a # Build the list of month/day tuples. monthdays = [(now.month, now.day)] while now <= then: monthdays.append((now.month, now.day)) now += timedelta(days=1) # Tranform each into queryset keyword args. monthdays = (dict( zip(("data_nascimento__month", "data_nascimento__day"), t)) for t in monthdays) # Compose the djano.db.models.Q objects together for a single query. query = reduce(operator.or_, (Q(**d) for d in monthdays)) # Run the query. return queryset.extra( select={ 'month': 'extract( month from data_nascimento )', 'day': 'extract( day from data_nascimento )', }).order_by('month', 'day', 'nome').filter(query) data_nascimento = DataRangeFilter(widget=RangeWidgetOverride, method='filter_data_nascimento') class Meta: model = Contato fields = [ 'search', 'sexo', 'tem_filhos', 'data_nascimento', 'tipo_autoridade' ] """filter_overrides = { models.DateField: { 'filter_class': DataRangeFilter, 'extra': lambda f: { 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')), 'widget': RangeWidgetOverride } } }""" def __init__(self, data=None, queryset=None, prefix=None, **kwargs): workspace = kwargs.pop('workspace') super(ImpressoEnderecamentoContatoFilterSet, self).__init__(data=data, queryset=queryset, prefix=prefix, **kwargs) col1 = to_row([ ('search', 6), ('sexo', 3), ('tem_filhos', 3), ('data_nascimento', 6), ('idade', 6), ('tipo_autoridade', 6), ('grupo', 6), ]) col2 = to_row([ ('impresso', 12), ('fontsize', 4), ('nome_maiusculo', 4), ('imprimir_pronome', 4), ('imprimir_cargo', 5), ('local_cargo', 7), ]) row = to_row([ (Fieldset( _('Informações para Seleção de Contatos'), col1, to_row([(SubmitFilterPrint( 'filter', value=_('Filtrar'), css_class='btn-outline-primary pull-right', type='submit'), 12)])), 6), (Fieldset( _('Informações para Impressão'), col2, to_row([(SubmitFilterPrint('print', value=_('Imprimir'), css_class='btn-primary pull-right', type='submit'), 12)])), 6) ]) self.form.helper = FormHelper() self.form.helper.form_method = 'GET' self.form.helper.layout = Layout(row, ) self.form.fields['search'].label = _('Nome/Nome Social/Apelido') self.form.fields['data_nascimento'].label = '%s (%s)' % ( _('Aniversário'), _('Inicial - Final')) self.form.fields['tem_filhos'].choices.choices[0] = (None, _('Ambos')) self.form.fields['grupo'].choices = [ ('0', _('Apenas Contatos sem Grupo')), ] + [(g.pk, str(g)) for g in GrupoDeContatos.objects.filter(workspace=workspace)]
class F(FilterSet): price = NumberFilter(lookup_type=['lt', 'gt', 'exact']) class Meta: model = Book fields = ['price']
class F(FilterSet): price = NumberFilter(lookup_type='lt') class Meta: model = Book fields = ['price']
def test_default_field(self): f = NumberFilter() field = f.field self.assertIsInstance(field, forms.DecimalField)
class B(FilterSet): f = NumberFilter()
class F(A, B): f2 = NumberFilter() f5 = CharFilter()
class A(Base): f3 = NumberFilter()