from django_filters import FilterSet, CharFilter, NumberFilter, OrderingFilter, ModelChoiceFilter, ModelMultipleChoiceFilter from django.utils.translation import ugettext_lazy as _ from .models import Cidade, Cliente, Pessoa, Endereco, Telefone, TelefoneCliente class PessoaFiltro(FilterSet): nome = CharFilter( label=_('Nome'), lookup_expr='icontains', field_name='nome') cpf = CharFilter(label=_('CPF'), lookup_expr='icontains', field_name='cpf') endereco = CharFilter(label=_('Endereco'), method='filter_endereco') cidade = NumberFilter(label=_('Cidade'), method='filter_cidade') telefone = CharFilter(label=_('Telefone'), method='filter_telefone') ordering = OrderingFilter( label=_('Ordem'), fields=( ('nome', 'nome'), ('cidade', 'cidade'), ), field_labels={ 'nome': _('Nome'), '-nome': _('Nome (Decrescente)'), # 'cidade': _('Cidade'), # '-cidade': _('Cidade (Decrescente)'), } ) class Meta: model = Pessoa fields = { 'data_nascimento': ['lte', 'gte'], 'criado': ['lte', 'gte'], 'modificado': ['lte', 'gte'], 'situacao': ['exact'], } def filter_endereco(self, queryset, field, value): if value: queryset = queryset.filter(enderecos__endereco__icontains=value) return queryset def filter_cidade(self, queryset, field, value): if value: queryset = queryset.filter(pk__in=Endereco.objects.filter( cidade=value).values_list('pessoa_id', flat=True)) return queryset def filter_telefone(self, queryset, field, value): if value: queryset = queryset.filter(pk__in=Telefone.objects.filter( numero__icontains=value).values_list('pessoa_id', flat=True)) return queryset class ClienteFiltro(FilterSet): razao_social = CharFilter( label=_('Razão Social'), lookup_expr='icontains', field_name='razao_social') cnpj = CharFilter( label=_('CNPJ'), lookup_expr='icontains', field_name='cnpj') ie = CharFilter( label=_('IE'), lookup_expr='icontains', field_name='ie') im = CharFilter( label=_('IM'), lookup_expr='icontains', field_name='im') endereco = CharFilter( label=_('Endereço'), lookup_expr='icontains', field_name='endereco') cidade = ModelMultipleChoiceFilter( label=_('Cidade'), queryset=Cidade.objects.all()) responsaveis = ModelMultipleChoiceFilter( label=_('Responsáveis'), queryset=Pessoa.objects.all()) socios = ModelMultipleChoiceFilter( label=_('Sócios'), queryset=Pessoa.objects.all()) telefone = CharFilter(label=_('Telefone'), method='filter_telefone') ordering = OrderingFilter( label=_('Ordem'), fields=( ('razao_social', 'razao_social'), ), field_labels={ 'razao_social': _(u'Razão Social'), '-razao_social': _(u'Razão Social (Decrescente)'), } ) class Meta: model = Cliente fields = { 'data_adesao': ['lte', 'gte'], 'criado': ['lte', 'gte'], 'modificado': ['lte', 'gte'], 'situacao': ['exact'], 'ativo': ['exact'], } def filter_telefone(self, queryset, field, value): if value: queryset = queryset.filter(pk__in=TelefoneCliente.objects.filter( numero__icontains=value).values_list('cliente_id', flat=True)) return queryset