예제 #1
0
        class F(FilterSet):
            username = MethodFilter(action='filter_username')

            class Meta:
                model = User
                fields = ['username']

            def filter_username(self, queryset, value):
                return queryset.filter(username=value)
        class F(FilterSet):
            username = MethodFilter()

            class Meta:
                model = User
                fields = ['username']

            def filter_username(self, queryset, value):
                return queryset.filter(
                    username__contains='ke'
                )
예제 #3
0
class HttpLogFilter(django_filters.FilterSet):
    user = MethodFilter(action='user_filter')
    status_code = MethodFilter(action='status_code_filter')

    class Meta:
        model = HttpLog
        fields = ('user', 'status_code')

    @classmethod
    def user_filter(cls, queryset, username):
        return queryset.filter(user__username__contains=username)

    @classmethod
    def status_code_filter(cls, queryset, status_code):
        id_list = []
        for qs in queryset:
            if qs.response.has_key('status_code'):
                if qs.response['status_code'] == int(status_code):
                    id_list.append(qs.id)
        return queryset.filter(id__in=id_list)
예제 #4
0
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')
예제 #5
0
class SaplGenericRelationSearchFilterSet(FilterSet):
    q = MethodFilter()

    def filter_q(self, queryset, value):

        query = value.split(' ')
        if query:
            q = Q()
            for qtext in query:
                if not qtext:
                    continue
                q_fs = Q(nome__icontains=qtext)

                order_by = []

                for gr in generic_relations_for_model(self._meta.model):
                    sgr = gr[1]
                    for item in sgr:
                        if item.related_model != self._meta.model:

                            continue
                        flag_order_by = True
                        for field in item.fields_search:
                            if flag_order_by:
                                flag_order_by = False
                                order_by.append('%s__%s' % (
                                    item.related_query_name(),
                                    field[0])
                                )
                            # if len(field) == 3 and field[2](qtext) is not
                            # None:
                            q_fs = q_fs | Q(**{'%s__%s%s' % (
                                item.related_query_name(),
                                field[0],
                                field[1]): qtext if len(field) == 2
                                else field[2](qtext)})

                q = q & q_fs

            if q:
                queryset = queryset.filter(q).order_by(*order_by)

        return queryset
            class F(FilterSet):
                username = MethodFilter()

                class Meta:
                    model = User
                    fields = []
        class F(FilterSet):
            username = MethodFilter(action=filter_username)

            class Meta:
                model = User
                fields = ['username']
예제 #8
0
class ContatoAgrupadoPorProcessoFilterSet(FilterSet):

    filter_overrides = {
        models.DateField: {
            'filter_class': MethodFilter,
            'extra': lambda f: {
                'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
                'widget': RangeWidgetOverride
            }
        }
    }

    AGRUPADO_POR_NADA = 'sem_agrupamento'
    AGRUPADO_POR_TITULO = 'titulo'
    AGRUPADO_POR_IMPORTANCIA = 'importancia'
    AGRUPADO_POR_TOPICO = 'topicos__descricao'
    AGRUPADO_POR_ASSUNTO = 'assuntos__descricao'
    AGRUPADO_POR_STATUS = 'status__descricao'
    AGRUPADO_POR_CLASSIFICACAO = 'classificacoes__descricao'

    AGRUPAMENTO_CHOICE = (
        (AGRUPADO_POR_NADA, _('Sem Agrupamento')),
        (AGRUPADO_POR_TITULO, _('Por Título de Processos')),
        (AGRUPADO_POR_IMPORTANCIA, _('Por Importância')),
        (AGRUPADO_POR_TOPICO, _('Por Tópicos')),
        (AGRUPADO_POR_ASSUNTO, _('Por Assuntos')),
        (AGRUPADO_POR_STATUS, _('Por Status')),
        (AGRUPADO_POR_CLASSIFICACAO, _('Por Classificação')),
    )

    search = MethodFilter()

    agrupamento = MethodChoiceFilter(required=False,
                                     choices=AGRUPAMENTO_CHOICE)

    importancia = MethodMultipleChoiceFilter(required=False,
                                             choices=IMPORTANCIA_CHOICE)

    status = MethodModelMultipleChoiceFilter(
        required=False, queryset=StatusProcesso.objects.all())

    def filter_agrupamento(self, queryset, value):
        return queryset

    def filter_importancia(self, queryset, value):
        if not value:
            return queryset

        q = None
        for i in value:
            q = q | Q(importancia=i) if q else Q(importancia=i)
        return queryset.filter(q)

    def filter_status(self, queryset, value):
        if not value:
            return queryset

        q = None
        for sta in value:
            q = q | Q(status=sta) if q else Q(status=sta)
        return queryset.filter(q)

    def filter_data(self, queryset, value):

        if not value[0] or not value[1]:
            return queryset

        inicial = datetime.datetime.strptime(value[0], "%d/%m/%Y").date()
        final = datetime.datetime.strptime(value[1], "%d/%m/%Y").date()
        if inicial > final:
            inicial, final = final, inicial

        range_select = Q(data__range=[inicial, final])

        # Run the query.
        return queryset.filter(range_select)

    def filter_search(self, queryset, 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

    class Meta:
        model = Processo
        fields = [
            'search',
            'data',
            'topicos',
            'importancia',
            'classificacoes',
            'assuntos',
            'status',
        ]

    def __init__(self,
                 data=None,
                 queryset=None,
                 prefix=None,
                 strict=None,
                 **kwargs):

        workspace = kwargs.pop('workspace')

        super(ContatoAgrupadoPorProcessoFilterSet,
              self).__init__(data=data,
                             queryset=queryset,
                             prefix=prefix,
                             strict=strict,
                             **kwargs)

        c1_row1 = to_row([
            ('search', 7),
            ('data', 5),
            ('importancia', 4),
            ('status', 4),
            ('classificacoes', 4),
            ('topicos', 6),
            ('assuntos', 6),
        ])

        col1 = Fieldset(
            _('Informações para Seleção de Processos'), c1_row1,
            to_row([(SubmitFilterPrint('filter',
                                       value=_('Filtrar'),
                                       css_class='btn-default pull-right',
                                       type='submit'), 12)]))

        col2 = Fieldset(
            _('Inf p/ Impressão'), 'agrupamento',
            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['search'].label = _('Filtrar Títulos de Processos')

        self.form.fields['topicos'].widget = forms.SelectMultiple(
            attrs={'size': '7'})
        self.form.fields['topicos'].queryset = TopicoProcesso.objects.all()

        self.form.fields['assuntos'].widget = forms.SelectMultiple(
            attrs={'size': '7'})
        self.form.fields['assuntos'].queryset = AssuntoProcesso.objects.filter(
            workspace=workspace)

        self.form.fields['importancia'].widget = forms.CheckboxSelectMultiple()
        # self.form.fields['importancia'].inline_class = True

        self.form.fields[
            'classificacoes'].widget = forms.CheckboxSelectMultiple()

        self.form.fields['status'].widget = forms.CheckboxSelectMultiple()
        # self.form.fields['status'].inline_class = True
        self.form.fields['status'].choices = list(
            self.form.fields['status'].choices)
        del self.form.fields['status'].choices[0]

        self.form.fields['agrupamento'].label = _('Agrupar Contatos')
        self.form.fields['agrupamento'].widget = forms.RadioSelect()
예제 #9
0
class ImpressoEnderecamentoContatoFilterSet(FilterSet):

    filter_overrides = {
        models.DateField: {
            'filter_class': MethodFilter,
            'extra': lambda f: {
                'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
                'widget': RangeWidgetOverride
            }
        }
    }

    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 = MethodFilter()
    sexo = ChoiceFilter(choices=SEXO_CHOICE)
    tem_filhos = ChoiceFilter(choices=FILHOS_CHOICE)
    idade = MethodRangeFilter(label=_('Idade entre:'),
                              widget=RangeWidgetNumber)

    impresso = ModelChoiceFilter(required=False,
                                 queryset=ImpressoEnderecamento.objects.all(),
                                 action=filter_impresso)

    grupo = MethodModelChoiceFilter(required=False,
                                    queryset=GrupoDeContatos.objects.all())

    imprimir_pronome = MethodChoiceFilter(choices=YES_NO_CHOICES,
                                          initial=False)
    imprimir_cargo = MethodChoiceFilter(choices=YES_NO_CHOICES, initial=False)

    fontsize = MethodNumberFilter(
        label=_('Tamanho da Fonte'),
        initial='',
        max_value=100,
        min_value=0,
        max_digits=3,
        decimal_places=0,
    )

    nome_maiusculo = MethodChoiceFilter(label=_('Nome Maiúsculo'),
                                        choices=YES_NO_CHOICES,
                                        initial=False)

    local_cargo = MethodChoiceFilter(label=_('Local para imprimir o Cargo'),
                                     choices=LOCAL_CARGO_CHOICE,
                                     initial=False)

    def filter_fontsize(self, queryset, value):
        return queryset

    def filter_grupo(self, queryset, value):
        queryset = queryset.filter(grupodecontatos_set=value)
        return queryset

    def filter_local_cargo(self, queryset, value):
        return queryset

    def filter_imprimir_pronome(self, queryset, value):
        return queryset

    def filter_imprimir_cargo(self, queryset, value):
        return queryset

    def filter_nome_maiusculo(self, queryset, value):
        return queryset

    def filter_idade(self, queryset, 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, 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, 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)

    class Meta:
        model = Contato
        fields = [
            'search', 'sexo', 'tem_filhos', 'data_nascimento',
            'tipo_autoridade'
        ]

    def __init__(self,
                 data=None,
                 queryset=None,
                 prefix=None,
                 strict=None,
                 **kwargs):

        workspace = kwargs.pop('workspace')

        super(ImpressoEnderecamentoContatoFilterSet,
              self).__init__(data=data,
                             queryset=queryset,
                             prefix=prefix,
                             strict=strict,
                             **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-default 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'].label = _('Com filhos?')
        self.form.fields['tem_filhos'].choices[0] = (None, _('Ambos'))

        self.form.fields['imprimir_pronome'].widget = forms.RadioSelect()
        self.form.fields['imprimir_pronome'].inline_class = True

        self.form.fields['imprimir_cargo'].widget = forms.RadioSelect()
        self.form.fields['imprimir_cargo'].inline_class = True

        self.form.fields['nome_maiusculo'].widget = forms.RadioSelect()
        self.form.fields['nome_maiusculo'].inline_class = True

        self.form.fields['grupo'].queryset = GrupoDeContatos.objects.filter(
            workspace=workspace)
예제 #10
0
class ContatoAgrupadoPorGrupoFilterSet(FilterSet):
    search = MethodFilter()

    municipio = MethodModelChoiceFilter(required=False,
                                        queryset=Municipio.objects.all())

    grupo = MethodModelMultipleChoiceFilter(
        required=False, queryset=GrupoDeContatos.objects.all())

    ativo = BooleanFilter()

    # contato_ativo = MethodChoiceFilter(
    #     choices=NONE_YES_NO_CHOICES,
    #     initial=None)

    def filter_municipio(self, queryset, value):
        queryset = queryset.filter(endereco_set__municipio=value)
        return queryset

    def filter_grupo(self, queryset, value):
        if value:
            queryset = queryset.filter(grupodecontatos_set__in=value)

        return queryset.order_by('grupodecontatos_set__nome', 'nome')

    def filter_ativo(self, queryset, value):
        if value is not None:
            queryset = queryset.filter(ativo=value)

        return queryset

    # def filter_contato_ativo(self, queryset, value):
    #     if value is not None:
    #         queryset = queryset.filter(ativo=value)
    #
    #     return queryset

    class Meta:
        model = Contato

    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),
            ('ativo', 7),
        ])

        col1 = Fieldset(
            _('Informações para Seleção de Contados'), c1_row1,
            to_row([(SubmitFilterPrint('filter',
                                       value=_('Filtrar'),
                                       css_class='btn-default 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()
예제 #11
0
class AutoresPossiveisFilterSet(FilterSet):
    data_relativa = DateFilter(method='filter_data_relativa')
    tipo = MethodFilter()

    class Meta:
        model = Autor
        fields = ['data_relativa', 'tipo', ]

    def filter_data_relativa(self, queryset, name, value):
        return queryset

    def filter_tipo(self, queryset, value):
        try:
            tipo = TipoAutor.objects.get(pk=value)
        except:
            raise serializers.ValidationError(_('Tipo de Autor inexistente.'))

        qs = queryset.filter(tipo=tipo)

        return qs

    @property
    def qs(self):
        qs = super().qs

        data_relativa = self.form.cleaned_data['data_relativa'] \
            if 'data_relativa' in self.form.cleaned_data else None

        tipo = self.form.cleaned_data['tipo'] \
            if 'tipo' in self.form.cleaned_data else None

        if not tipo and not data_relativa:
            return qs

        if tipo:
            # não precisa de try except, já foi validado em filter_tipo
            tipo = TipoAutor.objects.get(pk=tipo)
            if not tipo.content_type:
                return qs

        filter_for_model = 'filter_%s' % tipo.content_type.model

        if not hasattr(self, filter_for_model):
            return qs

        if not data_relativa:
            data_relativa = timezone.now()

        return getattr(self, filter_for_model)(qs, data_relativa).distinct()

    def filter_parlamentar(self, queryset, data_relativa):
        # não leva em conta afastamentos
        legislatura_relativa = Legislatura.objects.filter(
            data_inicio__lte=data_relativa,
            data_fim__gte=data_relativa).first()

        q = Q(
            parlamentar_set__mandato__data_inicio_mandato__lte=data_relativa,
            parlamentar_set__mandato__data_fim_mandato__isnull=True) | Q(
            parlamentar_set__mandato__data_inicio_mandato__lte=data_relativa,
            parlamentar_set__mandato__data_fim_mandato__gte=data_relativa)

        if legislatura_relativa.atual():
            q = q & Q(parlamentar_set__ativo=True)

        return queryset.filter(q)

    def filter_comissao(self, queryset, data_relativa):
        return queryset.filter(
            Q(comissao_set__data_extincao__isnull=True,
              comissao_set__data_fim_comissao__isnull=True) |
            Q(comissao_set__data_extincao__gte=data_relativa,
              comissao_set__data_fim_comissao__isnull=True) |
            Q(comissao_set__data_extincao__gte=data_relativa,
              comissao_set__data_fim_comissao__isnull=True) |
            Q(comissao_set__data_extincao__isnull=True,
              comissao_set__data_fim_comissao__gte=data_relativa) |
            Q(comissao_set__data_extincao__gte=data_relativa,
              comissao_set__data_fim_comissao__gte=data_relativa),
            comissao_set__data_criacao__lte=data_relativa)

    def filter_frente(self, queryset, data_relativa):
        return queryset.filter(
            Q(frente_set__data_extincao__isnull=True) |
            Q(frente_set__data_extincao__gte=data_relativa),
            frente_set__data_criacao__lte=data_relativa)

    def filter_bancada(self, queryset, data_relativa):
        return queryset.filter(
            Q(bancada_set__data_extincao__isnull=True) |
            Q(bancada_set__data_extincao__gte=data_relativa),
            bancada_set__data_criacao__lte=data_relativa)

    def filter_bloco(self, queryset, data_relativa):
        return queryset.filter(
            Q(bloco_set__data_extincao__isnull=True) |
            Q(bloco_set__data_extincao__gte=data_relativa),
            bloco_set__data_criacao__lte=data_relativa)

    def filter_orgao(self, queryset, data_relativa):
        # na implementação, não havia regras a implementar para orgao
        return queryset