From 9d3b1e54dc71caa8c43b07a402638f42648d13b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Mon, 3 Aug 2026 09:39:31 -0300 Subject: [PATCH] Adiciona filtros por range de datas. Gertiq #258412 --- requirements/requirements.txt | 1 + sigi/apps/convenios/admin.py | 8 ++-- sigi/apps/eventos/admin.py | 4 +- sigi/apps/servicos/admin.py | 4 +- sigi/apps/utils/filters.py | 74 ----------------------------------- sigi/settings.py | 1 + 6 files changed, 11 insertions(+), 81 deletions(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index c0a584b..3aa6974 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,5 +1,6 @@ Django==6.0.4 django-admin-autocomplete-filter==0.7.1 +django-admin-rangefilter==0.14.0 django-auth-ldap==5.3.0 django-debug-toolbar==6.3.0 django-environ==0.13.0 diff --git a/sigi/apps/convenios/admin.py b/sigi/apps/convenios/admin.py index 518706a..803670a 100644 --- a/sigi/apps/convenios/admin.py +++ b/sigi/apps/convenios/admin.py @@ -4,9 +4,11 @@ from django.utils import timezone from django.utils.translation import gettext as _ from django.utils.safestring import mark_safe from django_weasyprint.views import WeasyTemplateResponse +from djbs import djbs_constants from import_export import resources from import_export.admin import ExportActionMixin from import_export.fields import Field +from rangefilter.filters import DateRangeFilterBuilder from tinymce.models import HTMLField from tinymce.widgets import AdminTinyMCE from sigi.apps.convenios.models import ( @@ -21,7 +23,6 @@ from sigi.apps.convenios.models import ( from sigi.apps.utils.mixins import AsciifyQParameter from sigi.apps.casas.admin import GerentesInterlegisFilter from sigi.apps.utils.mixins import ReturnMixin -from sigi.apps.utils.filters import DateRangeFilter class ConvenioExportResourse(resources.ModelResource): @@ -139,6 +140,7 @@ class ProjetoAdmin(admin.ModelAdmin): class ConvenioAdmin( AsciifyQParameter, ReturnMixin, ExportActionMixin, admin.ModelAdmin ): + # filter_style = djbs_constants.FILTER_STYLE_FORM fieldsets = ( ( None, @@ -225,8 +227,8 @@ class ConvenioAdmin( "casa_legislativa", ) list_filter = ( - ("data_retorno_assinatura", DateRangeFilter), - ("data_termino_vigencia", DateRangeFilter), + ("data_retorno_assinatura", DateRangeFilterBuilder()), + ("data_termino_vigencia", DateRangeFilterBuilder()), ConvenioVigenteFilter, ("casa_legislativa__gerentes_interlegis", GerentesInterlegisFilter), "projeto", diff --git a/sigi/apps/eventos/admin.py b/sigi/apps/eventos/admin.py index 456e772..e0d8346 100644 --- a/sigi/apps/eventos/admin.py +++ b/sigi/apps/eventos/admin.py @@ -30,6 +30,7 @@ from django_weasyprint.views import WeasyTemplateResponse from import_export import resources from import_export.admin import ExportActionMixin from import_export.fields import Field +from rangefilter.filters import DateRangeFilterBuilder from tinymce.models import HTMLField from tinymce.widgets import AdminTinyMCE from weasyprint import HTML @@ -59,7 +60,6 @@ from sigi.apps.eventos.views import ( ) from sigi.apps.eventos.saberes import SaberesSyncException from sigi.apps.utils import abreviatura -from sigi.apps.utils.filters import DateRangeFilter from sigi.apps.utils.mixins import AsciifyQParameter from sigi.apps.utils.resources import ValueModelResource @@ -998,7 +998,7 @@ class EventoAdmin(AsciifyQParameter, ExportActionMixin, admin.ModelAdmin): "tipo_evento__categoria", "casa_anfitria__municipio__uf", "casa_anfitria__municipio__uf__regiao", - ("data_inicio", DateRangeFilter), + ("data_inicio", DateRangeFilterBuilder()), "virtual", "solicitante", ("moodle_courseid", admin.EmptyFieldListFilter), diff --git a/sigi/apps/servicos/admin.py b/sigi/apps/servicos/admin.py index f185959..98136f5 100644 --- a/sigi/apps/servicos/admin.py +++ b/sigi/apps/servicos/admin.py @@ -8,6 +8,7 @@ from django.utils.translation import gettext as _ from import_export import resources from import_export.fields import Field from import_export.admin import ExportActionMixin +from rangefilter.filters import DateRangeFilterBuilder from sigi.apps.casas.admin import GerentesInterlegisFilter from sigi.apps.servicos.models import Servico, LogServico, TipoServico from sigi.apps.servicos.filters import ( @@ -18,7 +19,6 @@ from sigi.apps.convenios.filters import ( TipoProjetoFilter, ExcluirTipoProjetoFilter, ) -from sigi.apps.utils.filters import DateRangeFilter from sigi.apps.utils.mixins import ReturnMixin from sigi.apps.utils.resources import ValueModelResource @@ -112,7 +112,7 @@ class ServicoAdmin(ReturnMixin, ExportActionMixin, admin.ModelAdmin): list_filter = ( "tipo_servico", "hospedagem_interlegis", - ("data_ativacao", DateRangeFilter), + ("data_ativacao", DateRangeFilterBuilder()), ("data_desativacao", ServicoAtivoFilter), "resultado_verificacao", DataUtimoUsoFilter, diff --git a/sigi/apps/utils/filters.py b/sigi/apps/utils/filters.py index f54df4c..6ff5ea8 100644 --- a/sigi/apps/utils/filters.py +++ b/sigi/apps/utils/filters.py @@ -168,77 +168,3 @@ class RangeFilter(admin.FieldListFilter): raise IncorrectLookupParameters(e) return queryset - - -class DateRangeFilter(admin.FieldListFilter): - template = "admin/date_range_filter.html" - - def __init__(self, field, request, params, model, model_admin, field_path): - self.model = model - self.model_admin = model_admin - self.lookup_kwargs = [f"{field_path}__gte", f"{field_path}__lte"] - form_data = {} - for p in self.expected_parameters(): - if p in params: - value = params.pop(p)[-1] - form_data[p] = prepare_lookup_value( - p, value, self.list_separator - ) - super().__init__(field, request, params, model, model_admin, field_path) - form = self.get_date_form(form_data) - if form.is_valid(): - self.used_parameters = { - key: [value] - for key, value in form.cleaned_data.items() - if value is not None - } - else: - self.used_parameters = {} - - def has_output(self): - return self.model.objects.exists() - - def expected_parameters(self): - return self.lookup_kwargs - - def choices(self, changelist): - form_params = { - key: value[-1] for key, value in self.used_parameters.items() - } - return [ - { - "query_string": changelist.get_query_string( - remove=self.lookup_kwargs - ), - "form": self.get_date_form(form_params, changelist), - } - ] - - def get_date_form(self, context={}, changelist=None): - date_fields = { - name: forms.DateField( - required=False, - label=(_("De") if "__gte" in name else _("Até")), - widget=forms.DateInput( - attrs={ - "class": "datepicker admin_filter", - "placeholder": ( - _("De") if "__gte" in name else _("Até") - ), - "data-clear": ( - changelist.get_query_string( - remove=[ - name, - ] - ) - if changelist - else "" - ), - } - ), - ) - for name in self.lookup_kwargs - } - DateForm = type("DateForm", (forms.Form,), date_fields) - - return DateForm(context) diff --git a/sigi/settings.py b/sigi/settings.py index a7a5b49..5fc25ef 100644 --- a/sigi/settings.py +++ b/sigi/settings.py @@ -56,6 +56,7 @@ INSTALLED_APPS = [ "django.contrib.staticfiles", "django.contrib.sites", "django_extensions", + "rangefilter", "job_controller", "django_filters", "localflavor",