From 49585e31864fcbd577fe373523e51a26b8a7a81a Mon Sep 17 00:00:00 2001 From: Leandro Roberto Date: Thu, 2 Sep 2021 18:19:49 -0300 Subject: [PATCH] =?UTF-8?q?isola=20filtro=20mixin=20para=20adi=C3=A7=C3=A3?= =?UTF-8?q?o=20de=20lookups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/api/core/__init__.py | 6 +++-- sapl/api/core/filters.py | 56 +++++++++++++++++++++++++++++++++++++++ sapl/api/forms.py | 49 +++------------------------------- 3 files changed, 63 insertions(+), 48 deletions(-) create mode 100644 sapl/api/core/filters.py diff --git a/sapl/api/core/__init__.py b/sapl/api/core/__init__.py index b4785aa40..767deadcb 100644 --- a/sapl/api/core/__init__.py +++ b/sapl/api/core/__init__.py @@ -20,7 +20,7 @@ from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet -from sapl.api.forms import SaplFilterSetMixin +from sapl.api.core.filters import SaplFilterSetMixin from sapl.api.permissions import SaplModelPermissions from sapl.api.serializers import ChoiceSerializer, ParlamentarSerializer,\ ParlamentarEditSerializer, ParlamentarResumeSerializer @@ -56,6 +56,7 @@ class SaplApiViewSetConstrutor(): # Carrega todas as classes de sapl.api.serializers que possuam # "Serializer" como Sufixo. serializers_classes = inspect.getmembers(serializers) + serializers_classes = {i[0]: i[1] for i in filter( lambda x: x[0].endswith('Serializer'), serializers_classes @@ -82,7 +83,8 @@ class SaplApiViewSetConstrutor(): serializer_name, rest_serializers.ModelSerializer) # Caso Exista, pega a classe sapl.api.forms.{model}FilterSet - # ou utiliza a base definida em sapl.forms.SaplFilterSetMixin + # ou utiliza a base definida em + # sapl.api.core.filters.SaplFilterSetMixin filter_name = f'{object_name}FilterSet' _filterset_class = filters_classes.get( filter_name, SaplFilterSetMixin) diff --git a/sapl/api/core/filters.py b/sapl/api/core/filters.py new file mode 100644 index 000000000..21493f72c --- /dev/null +++ b/sapl/api/core/filters.py @@ -0,0 +1,56 @@ +from django.db.models.fields import CharField +from django.db.models.fields.files import FileField +from django.template.defaultfilters import capfirst +import django_filters +from django_filters.filters import CharFilter +from django_filters.rest_framework.filterset import FilterSet +from django_filters.utils import resolve_field + + +class SaplFilterSetMixin(FilterSet): + + o = CharFilter(method='filter_o') + + class Meta: + fields = '__all__' + filter_overrides = { + CharField: { + 'filter_class': django_filters.CharFilter, + 'extra': lambda f: { + 'lookup_expr': ['exact', 'icontains'] + } + }, + FileField: { + 'filter_class': django_filters.CharFilter, + 'extra': lambda f: { + 'lookup_expr': 'exact', + }, + }, + } + + def filter_o(self, queryset, name, value): + try: + return queryset.order_by( + *map(str.strip, value.split(','))) + except: + return queryset + + @classmethod + def filter_for_field(cls, f, name, lookup_expr='exact'): + # Redefine método estático para ignorar filtro para + # fields que não possuam lookup_expr informado + + f, lookup_type = resolve_field(f, lookup_expr) + + default = { + 'field_name': name, + 'label': capfirst(f.verbose_name), + 'lookup_expr': lookup_expr + } + + filter_class, params = cls.filter_for_lookup( + f, lookup_type) + default.update(params) + if filter_class is not None: + return filter_class(**default) + return None diff --git a/sapl/api/forms.py b/sapl/api/forms.py index 7cb249ff3..475d3ca26 100644 --- a/sapl/api/forms.py +++ b/sapl/api/forms.py @@ -1,52 +1,9 @@ -from django.db.models.fields.files import FileField -from django.template.defaultfilters import capfirst -import django_filters -from django_filters.filters import CharFilter, NumberFilter -from django_filters.rest_framework.filterset import FilterSet -from django_filters.utils import resolve_field -from sapl.sessao.models import SessaoPlenaria - - -class SaplFilterSetMixin(FilterSet): - - o = CharFilter(method='filter_o') - class Meta: - fields = '__all__' - filter_overrides = { - FileField: { - 'filter_class': django_filters.CharFilter, - 'extra': lambda f: { - 'lookup_expr': 'exact', - }, - }, - } - def filter_o(self, queryset, name, value): - try: - return queryset.order_by( - *map(str.strip, value.split(','))) - except: - return queryset +from django_filters.filters import NumberFilter - @classmethod - def filter_for_field(cls, f, name, lookup_expr='exact'): - # Redefine método estático para ignorar filtro para - # fields que não possuam lookup_expr informado - f, lookup_type = resolve_field(f, lookup_expr) - - default = { - 'field_name': name, - 'label': capfirst(f.verbose_name), - 'lookup_expr': lookup_expr - } - - filter_class, params = cls.filter_for_lookup( - f, lookup_type) - default.update(params) - if filter_class is not None: - return filter_class(**default) - return None +from sapl.api.core.filters import SaplFilterSetMixin +from sapl.sessao.models import SessaoPlenaria class SessaoPlenariaFilterSet(SaplFilterSetMixin):