diff --git a/billing/filters.py b/billing/filters.py index 06bf0aa..9fd8a6d 100644 --- a/billing/filters.py +++ b/billing/filters.py @@ -8,6 +8,7 @@ class PaymentFilter(django_filters.FilterSet): amount = django_filters.RangeFilter(field_name="amount") number_of_months = django_filters.RangeFilter(field_name="number_of_months") paid = django_filters.BooleanFilter(field_name="paid") + user = django_filters.CharFilter(method="filter_user_search") method = django_filters.ChoiceFilter( choices=Payment.PAYMENT_TYPES, lookup_expr="iexact" ) @@ -16,6 +17,14 @@ class PaymentFilter(django_filters.FilterSet): created_at = django_filters.DateFromToRangeFilter() is_expired = django_filters.BooleanFilter(method="filter_is_expired") + def filter_user_search(self, queryset, name, value): + return queryset.filter( + Q(user__first_name__icontains=value) + | Q(user__last_name__icontains=value) + | Q(user__id_card__icontains=value) + | Q(user__mobile__icontains=value) + ) + def filter_is_expired(self, queryset, name, value): """ Filter payments based on whether they are expired or not @@ -29,7 +38,14 @@ class PaymentFilter(django_filters.FilterSet): class Meta: model = Payment - fields = "__all__" + fields = [ + "amount", + "paid", + "method", + "user", + "created_at", + "is_expired", + ] class TopupFilter(django_filters.FilterSet): diff --git a/billing/serializers.py b/billing/serializers.py index b2d9eda..4b2d602 100644 --- a/billing/serializers.py +++ b/billing/serializers.py @@ -1,11 +1,23 @@ from rest_framework import serializers from .models import Payment, Topup -from devices.serializers import DeviceSerializer +from devices.serializers import AdminDeviceSerializer class PaymentSerializer(serializers.ModelSerializer): - devices = DeviceSerializer(many=True, read_only=True) + devices = AdminDeviceSerializer(many=True, read_only=True) is_expired = serializers.SerializerMethodField() + user = serializers.SerializerMethodField() + + def get_user(self, obj): + user = obj.user + if user: + return { + "id": user.id, + "name": user.first_name + " " + user.last_name, + "id_card": user.id_card, + "mobile": user.mobile, + } + return None def get_is_expired(self, obj): return obj.is_expired diff --git a/devices/serializers.py b/devices/serializers.py index c9f3631..a5dd133 100644 --- a/devices/serializers.py +++ b/devices/serializers.py @@ -58,6 +58,22 @@ class DeviceSerializer(serializers.ModelSerializer): fields = "__all__" +class AdminDeviceSerializer(serializers.ModelSerializer): + pending_payment_id = serializers.SerializerMethodField() + + def get_pending_payment_id(self, obj): + unpaid_payment = ( + Payment.objects.filter(devices=obj, paid=False) + .order_by("-created_at") + .first() + ) + return unpaid_payment.id if unpaid_payment else None + + class Meta: # type: ignore + model = Device + fields = "__all__" + + class ReadOnlyDeviceSerializer(serializers.ModelSerializer): user = CustomReadOnlyUserSerializer(read_only=True)