From cb15aed94be37bb8ba84ae19644cb9a9f90e30ee Mon Sep 17 00:00:00 2001 From: i701 Date: Sat, 28 Jun 2025 23:23:04 +0500 Subject: [PATCH] =?UTF-8?q?WIP=20(Payments)=20Add=20PaymentFilter=20for=20?= =?UTF-8?q?filtering=20payment=20records=20=F0=9F=9A=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- billing/filters.py | 18 ++++++++++++++++++ billing/views.py | 5 +++++ 2 files changed, 23 insertions(+) create mode 100644 billing/filters.py diff --git a/billing/filters.py b/billing/filters.py new file mode 100644 index 0000000..858e6c4 --- /dev/null +++ b/billing/filters.py @@ -0,0 +1,18 @@ +import django_filters +from .models import Payment + + +class PaymentFilter(django_filters.FilterSet): + amount = django_filters.NumericRangeFilter(field_name="amount") + number_of_months = django_filters.NumericRangeFilter(field_name="number_of_months") + paid = django_filters.BooleanFilter(field_name="paid") + method = django_filters.ChoiceFilter( + choices=Payment.PAYMENT_TYPES, lookup_expr="iexact" + ) + mib_reference = django_filters.CharFilter(lookup_expr="icontains") + paid_at = django_filters.DateFromToRangeFilter() + created_at = django_filters.DateFromToRangeFilter() + + class Meta: + model = Payment + fields = "__all__" diff --git a/billing/views.py b/billing/views.py index ce187d7..584925c 100644 --- a/billing/views.py +++ b/billing/views.py @@ -6,6 +6,7 @@ from datetime import timedelta import requests from django.utils import timezone from django.utils.timezone import localtime +from django_filters.rest_framework import DjangoFilterBackend from rest_framework import generics, status from rest_framework.response import Response @@ -16,6 +17,7 @@ import logging from .models import Device, Payment from .serializers import PaymentSerializer, UpdatePaymentSerializer +from .filters import PaymentFilter env.read_env(os.path.join(BASE_DIR, ".env")) @@ -31,6 +33,9 @@ class InsufficientFundsError(Exception): class ListCreatePaymentView(StaffEditorPermissionMixin, generics.ListCreateAPIView): serializer_class = PaymentSerializer queryset = Payment.objects.all().select_related("user") + filter_backends = [DjangoFilterBackend] + filterset_fields = "__all__" + filterset_class = PaymentFilter def get_queryset(self): queryset = super().get_queryset()