Files
hossein-por-shop/backend/order/serializers.py
T
2025-03-17 17:28:05 +03:30

160 lines
5.9 KiB
Python

from rest_framework import serializers
from .models import OrderItemModel, OrderModel, DiscountCode
from product.serializers import ProductVariantSerialzier, AttributeValueSerialzier, ProductImageSerailizer
from account.serializers import UserAddressSerializer
from product.models import ProductVariant
class ProductVariantSerialzier(serializers.ModelSerializer):
product_attributes = AttributeValueSerialzier(many=True)
image = serializers.SerializerMethodField()
discount_amount = serializers.SerializerMethodField()
title = serializers.SerializerMethodField()
price = serializers.SerializerMethodField()
final_price = serializers.SerializerMethodField()
category = serializers.SerializerMethodField()
class Meta:
model = ProductVariant
fields = ['id', 'title', 'product_attributes', 'in_stock', 'price', 'discount', 'color', 'image', 'discount_amount', 'category', 'final_price']
def get_discount_amount(self, obj):
discount_amount = int(obj.price * (obj.discount / 100))
return f'{discount_amount:,.0f} تومان'
def get_final_price(self, obj):
final_price = obj.price - int(obj.price * (obj.discount / 100))
return f'{final_price:,.0f} تومان'
def get_price(self, obj):
return f'{obj.price:,.0f} تومان'
def get_image(self, obj):
return self.context.get('request').build_absolute_uri(obj.images.all().first().image.url)
def get_title(self, obj):
return obj.product.name
def get_category(self, obj):
return obj.product.category.name
class DiscountCodeSerializer(serializers.ModelSerializer):
class Meta:
model = DiscountCode
fields = ('code', 'percent')
read_only_fields = ('percent',)
class OrderItemSerailzier(serializers.ModelSerializer):
product = serializers.SerializerMethodField()
discount_amount = serializers.SerializerMethodField()
price = serializers.SerializerMethodField()
final_price = serializers.SerializerMethodField()
discount = serializers.SerializerMethodField()
class Meta:
model = OrderItemModel
exclude = ('order',)
read_only_fields = ('order', 'product',)
def get_product(self, obj):
return ProductVariantSerialzier(instance=obj.product, context={'request': self.context.get('request')}).data
def get_discount_amount(self, obj):
discount_amount = int(obj.price * (obj.product.discount / 100))
return f'{(discount_amount * obj.quantity):,.0f} تومان'
def get_final_price(self, obj):
final_price = obj.price - int(obj.price * (obj.product.discount / 100))
return f'{(final_price * obj.quantity):,.0f} تومان'
def get_price(self, obj):
return f'{(obj.price * obj.quantity):,.0f} تومان'
def get_discount(self, obj):
return obj.product.discount
class CartSerializer(serializers.ModelSerializer):
items = OrderItemSerailzier(many=True)
cart_total = serializers.SerializerMethodField()
tax = serializers.SerializerMethodField()
final_price = serializers.SerializerMethodField()
discount_code = serializers.SerializerMethodField()
class Meta:
model = OrderModel
fields = [ 'discount_code', 'items', 'cart_total', 'tax', 'final_price']
def get_discount_code(self, obj):
if obj.discount_code:
return {
'code': f'{obj.discount_code.code}',
'percent': obj.discount_code.percent,
'amount': f'{10000:,.0f} تومان'
}
else:
return None
def get_tax(self, obj):
return f'{1000:,.0f} تومان'
def get_cart_total(self, obj):
return f'{10000:,.0f} تومان'
def get_final_price(self, obj):
return f'{8000:,.0f} تومان'
class OrderListSerializer(serializers.ModelSerializer):
count = serializers.SerializerMethodField()
images = serializers.SerializerMethodField()
order_id = serializers.SerializerMethodField()
verbose_status = serializers.SerializerMethodField()
class Meta:
model = OrderModel
fields = ['created_at', 'status', "images", "count", "id", 'final_price', 'order_id', 'verbose_status']
read_only_fields = ['count', 'images', 'order_id', 'verbose_status']
def get_verbose_status(self, obj):
return obj.get_status_display()
def get_count(self, obj):
return obj.items.all().count()
def get_images(self, obj):
image_list = [
self.context.get('request').build_absolute_uri(image.image.url)
if (image := item.product.images.all().first()) else None
for item in obj.items.all()[:3]
]
return filter(lambda x: x is not None, image_list)
def get_order_id(self, obj):
return obj.id + 1000
class OrderGetSerializer(serializers.ModelSerializer):
count = serializers.SerializerMethodField()
images = serializers.SerializerMethodField()
order_id = serializers.SerializerMethodField()
verbose_status = serializers.SerializerMethodField()
items = OrderItemSerailzier(many=True)
address = UserAddressSerializer()
discount_code = DiscountCodeSerializer()
class Meta:
model = OrderModel
fields = ['created_at', 'status', "images", "count", "id", 'final_price', 'order_id', 'verbose_status', 'address', 'items', 'tax' , 'cart_total', 'discount_code', 'discount']
def get_verbose_status(self, obj):
return obj.get_status_display()
def get_count(self, obj):
return obj.items.all().count()
def get_images(self, obj):
image_list = [
self.context.get('request').build_absolute_uri(image.image.url)
if (image := item.product.images.all().first()) else None
for item in obj.items.all()[:3]
]
return filter(lambda x: x is not None, image_list)
def get_order_id(self, obj):
return obj.id + 1000