from .models import * from rest_framework import serializers from django.utils import timezone from datetime import timedelta class DetailSerializer(serializers.ModelSerializer): class Meta: model = DetailModel fields = '__all__' class ProductDetailSerializer(serializers.ModelSerializer): detail = DetailSerializer(many=True, read_only=True) class Meta: model = ProductDetailModel exclude = ('product',) class DynamicProductSerializer(serializers.ModelSerializer): price = serializers.SerializerMethodField() is_new = serializers.SerializerMethodField() related_products = serializers.SerializerMethodField() details = ProductDetailSerializer(many=True, read_only=True) 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', ], 'instance': ['name', 'description', 'price', 'image1', 'image2', 'image3', 'video', 'rating', 'discount', 'slug', 'meta_description', 'meta_keywords', 'meta_rating', 'category', 'related_products', 'details', 'in_pack_items'], 'chat': ['name', 'description', 'price', 'in_stock', 'discount', ] } def get_price(self, obj): dollor_price = self.context.get('dollor_price') toman_price = obj.get_toman_price(dollor_price=dollor_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']