update
This commit is contained in:
1
core/apps/api/views/order/__init__.py
Normal file
1
core/apps/api/views/order/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .order import *
|
||||
88
core/apps/api/views/order/order.py
Normal file
88
core/apps/api/views/order/order.py
Normal 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)
|
||||
Reference in New Issue
Block a user