87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
from rest_framework import serializers
|
|
from .models import OrderItemModel, OrderModel, DiscountCode
|
|
from product.serializers import ProductVariantSerialzier
|
|
from account.serializers import UserAddressSerializer
|
|
class DiscountCodeSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = DiscountCode
|
|
fields = ('code', 'percent')
|
|
read_only_fields = ('percent',)
|
|
|
|
|
|
class OrderItemSerailzier(serializers.ModelSerializer):
|
|
product = serializers.SerializerMethodField()
|
|
class Meta:
|
|
model = OrderItemModel
|
|
fields = "__all__"
|
|
read_only_fields = ('order', 'product')
|
|
def get_product(self, obj):
|
|
return ProductVariantSerialzier(instance=obj.product, context={'request': self.context.get('request')}).data
|
|
|
|
class CartSerializer(serializers.ModelSerializer):
|
|
items = OrderItemSerailzier(many=True)
|
|
product_discount = serializers.SerializerMethodField()
|
|
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', 'product_discount', 'tax', 'final_price']
|
|
|
|
|
|
def get_discount_code(self, obj):
|
|
if obj.discount_code:
|
|
return {
|
|
'code': obj.discount_code.code,
|
|
'persent': obj.discount_code.percent,
|
|
'amount': '100,000 تومان'
|
|
}
|
|
else:
|
|
return None
|
|
|
|
def get_product_discount(self, obj):
|
|
return [
|
|
{
|
|
'product_name': 'iphone 13',
|
|
'dicount': '20%',
|
|
'discount_amount': '100,000 تومان'
|
|
},
|
|
{
|
|
'product_name': 'iphone 12',
|
|
'dicount': '10%',
|
|
'discount_amount': '50,000 تومان'
|
|
},
|
|
]
|
|
|
|
|
|
|
|
|
|
def get_tax(self, obj):
|
|
return 1000
|
|
|
|
def get_cart_total(self, obj):
|
|
return 10000
|
|
|
|
def get_final_price(self, obj):
|
|
return 8000
|
|
|
|
|
|
|
|
class OrderSerializer(serializers.ModelSerializer):
|
|
count = serializers.SerializerMethodField()
|
|
images = serializers.SerializerMethodField()
|
|
class Meta:
|
|
model = OrderModel
|
|
fields = ['address', 'created_at', 'is_paid', 'status', 'discount_code', "images", "count", "id"]
|
|
|
|
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) |