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