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 = ['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() class Meta: model = OrderItemModel exclude = ('price', 'order') 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) 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 OrderSerializer(serializers.ModelSerializer): count = serializers.SerializerMethodField() images = serializers.SerializerMethodField() address = UserAddressSerializer() items = OrderItemSerailzier(many=True) class Meta: model = OrderModel fields = ['address', 'created_at', 'items', '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)