This commit is contained in:
A'zamov Samandar
2025-12-06 21:50:28 +05:00
parent 3aa20fdaa1
commit f5766aa319
140 changed files with 2376 additions and 1582 deletions

View File

@@ -0,0 +1 @@
from .order import *

View File

@@ -0,0 +1,88 @@
# type: ignore
from rest_framework.viewsets import ModelViewSet
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import action
from rest_framework.response import Response
from drf_spectacular.utils import extend_schema, extend_schema_view
from django_core.mixins import BaseViewSetMixin
from core.apps.api.models import OrderModel
from core.apps.api.serializers.order import (
OrderListSerializer,
OrderDetailSerializer,
OrderCreateSerializer,
OrderUpdateSerializer,
)
@extend_schema_view(
list=extend_schema(
summary="List all orders", description="Get list of all orders for the current user", tags=["Orders"]
),
retrieve=extend_schema(
summary="Get order details", description="Get detailed information about a specific order", tags=["Orders"]
),
create=extend_schema(summary="Create order", description="Create a new order with items", tags=["Orders"]),
update=extend_schema(summary="Update order", description="Update order status or address", tags=["Orders"]),
partial_update=extend_schema(
summary="Partially update order", description="Partially update order information", tags=["Orders"]
),
destroy=extend_schema(summary="Cancel order", description="Cancel/delete an order", tags=["Orders"]),
)
class OrderViewSet(BaseViewSetMixin, ModelViewSet):
"""
ViewSet for managing orders.
Users can only see and manage their own orders.
"""
permission_classes = [IsAuthenticated]
def get_queryset(self):
queryset = (
OrderModel.objects.select_related("user", "address")
.prefetch_related("items__ad")
.filter(user=self.request.user)
.order_by("-created_at")
)
# Filter by status
status_filter = self.request.query_params.get("status")
if status_filter:
queryset = queryset.filter(status=status_filter)
return queryset
def get_serializer_class(self):
if self.action == "create":
return OrderCreateSerializer
elif self.action in ["update", "partial_update"]:
return OrderUpdateSerializer
elif self.action == "retrieve":
return OrderDetailSerializer
return OrderListSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
def perform_destroy(self, instance):
# Only allow cancellation of pending orders
if instance.status not in ["pending", "processing"]:
raise PermissionError("Can only cancel pending or processing orders")
instance.delete()
@extend_schema(summary="Get order statistics", description="Get statistics about user's orders", tags=["Orders"])
@action(detail=False, methods=["get"])
def statistics(self, request):
"""Get order statistics for current user"""
queryset = self.get_queryset()
stats = {
"total_orders": queryset.count(),
"pending": queryset.filter(status="pending").count(),
"processing": queryset.filter(status="processing").count(),
"completed": queryset.filter(status="completed").count(),
"cancelled": queryset.filter(status="cancelled").count(),
"total_spent": sum(order.total_amount for order in queryset),
}
return Response(stats)