def test_callable_queryset(self): request = mock.NonCallableMock(spec=[]) qs = mock.NonCallableMock(spec=[]) qs_callable = mock.Mock(return_value=qs) f = ModelChoiceFilter(queryset=qs_callable) f.parent = mock.Mock(request=request) field = f.field qs_callable.assert_called_with(request) self.assertEqual(field.queryset, qs)
class ProjectFilter(django_filters.FilterSet): category = ModelChoiceFilter(queryset=Service.objects.all(), label="Category:") class Meta: model = Project fields = ['category']
class PropertyModelChoiceFilterSet(PropertyFilterSet): # No Property filter since working directly with Foreign Keys related = ModelChoiceFilter(queryset=models.ModelChoiceFilterRelatedModel.objects.all()) class Meta: model = models.ModelChoiceFilterModel fields = ['related']
class AutorChoiceFilterSet(SaplGenericRelationSearchFilterSet): q = MethodFilter() tipo = ModelChoiceFilter(queryset=TipoAutor.objects.all()) class Meta: model = Autor fields = ['q', 'tipo', 'nome', ] def filter_q(self, queryset, value): return SaplGenericRelationSearchFilterSet.filter_q( self, queryset, value).distinct('nome').order_by('nome')
class TaskFilter(FilterSet): label = ModelChoiceFilter(queryset=Label.objects.all(), field_name='labels', label='Метка') is_author = BooleanFilter(field_name='author', widget=forms.CheckboxInput, label='Только свои задачи', method='filter_author_tasks') def filter_author_tasks(self, queryset, name, value): if value: return queryset.filter(author=self.request.user) return queryset class Meta: model = Task fields = ['status', 'executor']
class InstitutionFilter(FilterSet): voivodeship = VoivodeshipFilter(widget=autocomplete.ModelSelect2( url='teryt:voivodeship-autocomplete')) county = CountyFilter(widget=autocomplete.ModelSelect2( url='teryt:county-autocomplete', forward=['voivodeship'])) community = CommunityFilter(widget=autocomplete.ModelSelect2( url='teryt:community-autocomplete', forward=['county'])) monitoring = ModelChoiceFilter( label=_("Monitoring"), required=False, queryset=Monitoring.objects.all(), widget=autocomplete.ModelSelect2(url='monitorings:autocomplete'), ) def __init__(self, *args, **kwargs): self.monitoring = kwargs.pop('monitoring', None) super(InstitutionFilter, self).__init__(*args, **kwargs) if self.monitoring: qs = Monitoring.objects.exclude(pk=self.monitoring.pk).all() self.filters['monitoring'].field.queryset = qs class Meta: model = Institution fields = ['monitoring']
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 ContatoAgrupadoPorGrupoFilterSet(FilterSet): municipio = ModelChoiceFilter(required=False, label=Municipio._meta.verbose_name, queryset=Municipio.objects.all(), method='filter_municipio') grupo = ModelMultipleChoiceFilter( required=False, label=GrupoDeContatos._meta.verbose_name_plural, queryset=GrupoDeContatos.objects.all(), method='filter_grupo') def filter_municipio(self, queryset, field_name, value): queryset = queryset.filter(endereco_set__municipio=value) return queryset def filter_grupo(self, queryset, field_name, value): queryset = queryset.filter(grupodecontatos_set__in=value) return queryset.order_by('grupodecontatos_set__nome', 'nome') class Meta: model = Contato fields = ('municipio', 'grupo') def __init__(self, data=None, queryset=None, prefix=None, strict=None, **kwargs): workspace = kwargs.pop('workspace') super(ContatoAgrupadoPorGrupoFilterSet, self).__init__(data=data, queryset=queryset, prefix=prefix, strict=strict, **kwargs) c1_row1 = to_row([ ('municipio', 7), ('grupo', 7), ]) col1 = Fieldset( _('Informações para Seleção de Contados'), c1_row1, to_row([ (SubmitFilterPrint('filter', value=_('Filtrar'), css_class='btn-outline-primary pull-right', type='submit'), 12) ])) col2 = Fieldset( _('Inf p/ Impressão'), SubmitFilterPrint('print', value=_('Imprimir'), css_class='btn-primary pull-right', type='submit')) rows = to_row([ (col1, 9), (col2, 3), ]) self.form.helper = FormHelper() self.form.helper.form_method = 'GET' self.form.helper.layout = Layout(rows, ) self.form.fields['grupo'].queryset = GrupoDeContatos.objects.filter( workspace=workspace) self.form.fields['municipio'].queryset = Municipio.objects.all()
def test_default_field_with_queryset(self): qs = mock.NonCallableMock(spec=[]) f = ModelChoiceFilter(queryset=qs) field = f.field self.assertIsInstance(field, forms.ModelChoiceField) self.assertEqual(field.queryset, qs)
def test_default_field_without_queryset(self): f = ModelChoiceFilter() with self.assertRaises(TypeError): f.field
def test_empty_choices(self): f = ModelChoiceFilter(queryset=User.objects.all(), null_value='null', null_label='NULL') self.assertEqual(list(f.field.choices), [ ('', 'EMPTY'), ('null', 'NULL'), ])