from .models import * from rest_framework import serializers from django.utils import timezone from datetime import timedelta class InStuckColorsSerializer(serializers.ModelSerializer): class Meta: model = InStuckColors fields = ['color', 'in_stuck'] class DynamicProductSerializer(serializers.ModelSerializer): colors = InStuckColorsSerializer(many=True, read_only=True) price = serializers.SerializerMethodField() is_new = serializers.SerializerMethodField() related_products = serializers.SerializerMethodField() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) view_type = self.context.get('view_type', 'all') if view_type != 'all': allowed_fields = self.Meta.view_type[view_type] allowed = set(allowed_fields) existing = set(self.fields.keys()) for field_name in existing - allowed: self.fields.pop(field_name) class Meta: model = ProductModel fields = "__all__" view_type = { 'list': ['name', 'price', 'image1', 'video', 'rating', 'discount', 'slug', 'category', 'colors'], 'instance': ['name', 'description', 'price', 'image1', 'image2', 'image3', 'video', 'rating', 'discount', 'slug', 'meta_description', 'meta_keywords', 'meta_rating', 'category', 'colors', 'related_products'], 'chat': ['name', 'description', 'price', 'in_stock', 'discount', 'colors'] } def get_price(self, obj): dollor_price = self.context.get('dollor_price') dollar_to_dirham = 0.27 if dollor_price is None: raise ValidationError({"dollor_price": "The 'dollor_price' must be provided in the context for dollar pricing."}) if obj.currency == 'toman': toman_price = obj.price elif obj.currency == 'dollor': toman_price = obj.price * dollor_price elif obj.currency == 'derham': toman_price = obj.price * dollor_price * dollar_to_dirham # min price implmentaion toman_price = toman_price if toman_price > obj.min_price else obj.min_price return "{:,.0f} تومان".format(toman_price) def get_is_new(self, obj): return timezone.now() < obj.created_at + timedelta(days=7) def get_related_products(self, obj): if obj.related_products.all().count() >= 5: related_products = obj.related_products.all() else: related_products = obj.category.products serializer = DynamicProductSerializer( related_products, many=True, context={ 'view_type': 'list', 'dollor_price': self.context.get('dollor_price') } ) return serializer.data class CommentSerializer(serializers.ModelSerializer): class Meta: model = CommentModel fields = "__all__" read_only_fields = ('show', 'product', 'user') class SubCategorySerializer(serializers.ModelSerializer): product_count = serializers.SerializerMethodField() parent = serializers.SerializerMethodField() class Meta: model = SubCategoryModel fields = ['id', 'name', 'slug','icon', 'meta_title', 'meta_description', 'product_count', 'show', 'parent', 'image'] def get_product_count(self, obj): return obj.products.count() def get_parent(self, obj): return obj.parent.name class MainCategorySerializer(serializers.ModelSerializer): subcategorys = SubCategorySerializer(many=True) class Meta: model = MainCategoryModel fields = ['id', 'name', 'slug', 'icon', 'meta_title', 'meta_description', 'subcategorys']