feat(profile): add activity sorting and payment filters

This commit is contained in:
2026-10-02 13:00:53 +03:30
parent ba829055a5
commit 682ef76396
2 changed files with 47 additions and 10 deletions

View File

@@ -7,8 +7,9 @@ from django.conf import settings
from django.shortcuts import redirect, get_object_or_404
from django.utils import timezone
from django.db.models import Count, Q
from django.db.models.functions import Coalesce
from django.db import transaction
from typing import List
from typing import List, Literal
from ninja import Query, Router
from ninja.errors import HttpError
@@ -89,7 +90,13 @@ def _user_payment_payload(request, payment, status_names):
@payments_router.get("/me/paginated", response=PaginatedUserPaymentsSchema, auth=jwt_auth)
def my_payments_paginated(request, page: int = Query(1, ge=1)):
def my_payments_paginated(
request,
page: int = Query(1, ge=1),
status: Literal["all", "initiated", "pending", "paid", "failed", "canceled"] = Query("all"),
sort_by: Literal["time", "amount"] = Query("time"),
sort_order: Literal["asc", "desc"] = Query("desc"),
):
page_size = 10
status_names = {
Payment.OrderStatusChoices.INIT: "initiated",
@@ -98,7 +105,22 @@ def my_payments_paginated(request, page: int = Query(1, ge=1)):
Payment.OrderStatusChoices.FAILED: "failed",
Payment.OrderStatusChoices.CANCELED: "canceled",
}
queryset = Payment.objects.filter(user=request.auth).select_related("event").order_by("-created_at", "-id")
queryset = Payment.objects.filter(user=request.auth).select_related("event")
status_values = {
"initiated": Payment.OrderStatusChoices.INIT,
"pending": Payment.OrderStatusChoices.PENDING,
"paid": Payment.OrderStatusChoices.PAID,
"failed": Payment.OrderStatusChoices.FAILED,
"canceled": Payment.OrderStatusChoices.CANCELED,
}
if status != "all":
queryset = queryset.filter(status=status_values[status])
sort_field = "amount" if sort_by == "amount" else "_payment_time"
sort_prefix = "" if sort_order == "asc" else "-"
queryset = queryset.annotate(_payment_time=Coalesce("verified_at", "created_at")).order_by(
f"{sort_prefix}{sort_field}", "-id"
)
count = queryset.count()
total_pages = max(1, (count + page_size - 1) // page_size)
start = (page - 1) * page_size