feat: add more filters to transactions filter

This commit is contained in:
Herculino Trotta
2024-10-26 19:14:46 -03:00
parent dc92313c87
commit 87bd76c2b0
+61 -3
View File
@@ -1,16 +1,18 @@
import django_filters import django_filters
from crispy_bootstrap5.bootstrap5 import Switch
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field from crispy_forms.layout import Layout, Field, Row, Column
from django import forms from django import forms
from django.db.models import Q from django.db.models import Q
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django_filters import Filter
from apps.accounts.models import Account from apps.accounts.models import Account
from apps.transactions.models import Transaction from apps.transactions.models import Transaction
from apps.transactions.models import TransactionCategory from apps.transactions.models import TransactionCategory
from apps.transactions.models import TransactionTag from apps.transactions.models import TransactionTag
from apps.common.widgets.tom_select import TomSelect, TomSelectMultiple from apps.common.widgets.tom_select import TomSelectMultiple
from apps.common.fields.month_year import MonthYearFormField
from apps.common.widgets.decimal import ArbitraryDecimalDisplayNumberInput
SITUACAO_CHOICES = ( SITUACAO_CHOICES = (
("1", _("Paid")), ("1", _("Paid")),
@@ -25,6 +27,10 @@ def content_filter(queryset, name, value):
return queryset return queryset
class MonthYearFilter(Filter):
field_class = MonthYearFormField
class TransactionsFilter(django_filters.FilterSet): class TransactionsFilter(django_filters.FilterSet):
description = django_filters.CharFilter( description = django_filters.CharFilter(
label=_("Content"), label=_("Content"),
@@ -60,6 +66,38 @@ class TransactionsFilter(django_filters.FilterSet):
choices=SITUACAO_CHOICES, choices=SITUACAO_CHOICES,
field_name="is_paid", field_name="is_paid",
) )
date_start = django_filters.DateFilter(
field_name="date",
lookup_expr="gte",
widget=forms.DateInput(attrs={"type": "date"}, format="%Y-%m-%d"),
label=_("Date from"),
)
date_end = django_filters.DateFilter(
field_name="date",
lookup_expr="lte",
widget=forms.DateInput(attrs={"type": "date"}, format="%Y-%m-%d"),
label=_("Until"),
)
reference_date_start = MonthYearFilter(
field_name="reference_date",
lookup_expr="gte",
label=_("Reference date from"),
)
reference_date_end = MonthYearFilter(
field_name="reference_date",
lookup_expr="lte",
label=_("Until"),
)
from_amount = django_filters.NumberFilter(
field_name="amount",
lookup_expr="gte",
label=_("Amount min"),
)
to_amount = django_filters.NumberFilter(
field_name="amount",
lookup_expr="lte",
label=_("Amount max"),
)
class Meta: class Meta:
model = Transaction model = Transaction
@@ -70,6 +108,12 @@ class TransactionsFilter(django_filters.FilterSet):
"is_paid", "is_paid",
"category", "category",
"tags", "tags",
"date_start",
"date_end",
"reference_date_start",
"reference_date_end",
"from_amount",
"to_amount",
] ]
def __init__(self, data=None, *args, **kwargs): def __init__(self, data=None, *args, **kwargs):
@@ -101,7 +145,21 @@ class TransactionsFilter(django_filters.FilterSet):
template="transactions/widgets/transaction_type_filter_buttons.html", template="transactions/widgets/transaction_type_filter_buttons.html",
), ),
Field("description"), Field("description"),
Row(Column("date_start"), Column("date_end")),
Row(
Column("reference_date_start", css_class="form-group col-md-6 mb-0"),
Column("reference_date_end", css_class="form-group col-md-6 mb-0"),
css_class="form-row",
),
Row(
Column("from_amount", css_class="form-group col-md-6 mb-0"),
Column("to_amount", css_class="form-group col-md-6 mb-0"),
css_class="form-row",
),
Field("account", size=1), Field("account", size=1),
Field("category", size=1), Field("category", size=1),
Field("tags", size=1), Field("tags", size=1),
) )
self.form.fields["to_amount"].widget = ArbitraryDecimalDisplayNumberInput()
self.form.fields["from_amount"].widget = ArbitraryDecimalDisplayNumberInput()