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,149 @@
from rest_framework import serializers
from core.apps.api.models import OrderModel, OrderItemModel, AdModel
from core.apps.accounts.models import Address
class OrderItemSerializer(serializers.ModelSerializer):
"""Order item serializer"""
ad_name = serializers.CharField(source="ad.name", read_only=True)
ad_image = serializers.ImageField(source="ad.image", read_only=True)
subtotal = serializers.DecimalField(
max_digits=10,
decimal_places=2,
read_only=True
)
class Meta:
model = OrderItemModel
fields = [
"id",
"ad",
"ad_name",
"ad_image",
"price",
"quantity",
"subtotal"
]
read_only_fields = ["id", "ad_name", "ad_image", "subtotal"]
class OrderListSerializer(serializers.ModelSerializer):
"""List serializer for orders"""
items_count = serializers.SerializerMethodField()
status_display = serializers.CharField(source="get_status_display", read_only=True)
class Meta:
model = OrderModel
fields = [
"id",
"status",
"status_display",
"total_amount",
"items_count",
"created_at"
]
read_only_fields = fields
def get_items_count(self, obj):
return obj.items.count()
class OrderDetailSerializer(serializers.ModelSerializer):
"""Detailed order serializer"""
items = OrderItemSerializer(many=True, read_only=True)
user_name = serializers.CharField(source="user.username", read_only=True)
address_details = serializers.SerializerMethodField()
status_display = serializers.CharField(source="get_status_display", read_only=True)
class Meta:
model = OrderModel
fields = [
"id",
"user",
"user_name",
"status",
"status_display",
"address",
"address_details",
"total_amount",
"items",
"created_at",
"updated_at"
]
read_only_fields = [
"id", "user", "user_name", "status_display",
"total_amount", "created_at", "updated_at"
]
def get_address_details(self, obj):
if obj.address:
return {
"id": obj.address.id,
"street": obj.address.street,
"city": obj.address.city,
"country": obj.address.country,
}
return None
class OrderItemCreateSerializer(serializers.Serializer):
"""Serializer for creating order items"""
ad = serializers.PrimaryKeyRelatedField(queryset=AdModel.objects.all())
quantity = serializers.IntegerField(min_value=1, default=1)
class OrderCreateSerializer(serializers.ModelSerializer):
"""Create order serializer"""
items = OrderItemCreateSerializer(many=True, write_only=True)
class Meta:
model = OrderModel
fields = ["address", "items"]
def validate_items(self, value):
if not value:
raise serializers.ValidationError("Order must have at least one item")
return value
def create(self, validated_data):
items_data = validated_data.pop("items")
validated_data["user"] = self.context["request"].user
# Create order
order = OrderModel.objects.create(**validated_data)
# Create order items and calculate total
total = 0
for item_data in items_data:
ad = item_data["ad"]
quantity = item_data.get("quantity", 1)
price = ad.price
OrderItemModel.objects.create(
order=order,
ad=ad,
price=price,
quantity=quantity
)
total += price * quantity
# Update order total
order.total_amount = total
order.save()
return order
class OrderUpdateSerializer(serializers.ModelSerializer):
"""Update order serializer"""
class Meta:
model = OrderModel
fields = ["status", "address"]
def validate_status(self, value):
# Add business logic for status transitions
current_status = self.instance.status
# Example: Can't change completed orders
if current_status == "completed":
raise serializers.ValidationError("Cannot modify completed orders")
return value