Files
hossein-por-shop/backend/product/serializers.py
T
2025-02-21 21:03:48 +03:30

155 lines
5.0 KiB
Python

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)
detail_category = serializers.StringRelatedField()
class Meta:
model = ProductDetailModel
fields = "__all__"
class AttributeTypeSerialzier(serializers.ModelSerializer):
class Meta:
model = AttributeType
fields = "__all__"
class AttributeValueSerialzier(serializers.ModelSerializer):
attribute_type = AttributeTypeSerialzier()
class Meta:
model = AttributeValue
fields = "__all__"
class InPackItemsSerialzier(serializers.ModelSerializer):
class Meta:
model = InPackItems
fields = '__all__'
class ProductImageSerailizer(serializers.ModelSerializer):
class Meta:
model = ProductImageModel
fields = '__all__'
class ProductVariantSerialzier(serializers.ModelSerializer):
product_attributes = AttributeValueSerialzier(many=True)
price = serializers.SerializerMethodField()
in_pack_items = InPackItemsSerialzier(many=True)
images = ProductImageSerailizer(many=True)
details = ProductDetailSerializer(many=True, read_only=True)
class Meta:
model = ProductVariant
exclude = ('min_price', 'max_price','sell', 'currency', 'product')
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 __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
view_type = self.context.get('view_type', None)
if view_type == 'list':
self.fields.pop('in_pack_items', None)
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']
class DynamicProductSerializer(serializers.ModelSerializer):
variants = serializers.SerializerMethodField()
colors = serializers.SerializerMethodField()
category = SubCategorySerializer(read_only=True)
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': ['id','name', 'rating', 'slug', 'category', 'variants', 'colors'],
'instance': ['id', 'name', 'description', 'rating', 'slug', 'meta_description', 'meta_keywords', 'meta_rating', 'category', 'related_products', 'in_pack_items', 'variants', 'colors'],
'chat': ['id', 'name', 'description', 'variants']
}
def get_variants(self, obj):
varients = obj.variants.all()
colors = set(varient.color for varient in varients)
return ProductVariantSerialzier(instance=varients, many=True, context=self.context).data
def get_colors(self, obj):
varients = obj.variants.all()
colors = list(set(varient.color for varient in varients))
return colors
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
exclude = ('review_status', )
read_only_fields = ('review_status', 'product', 'user')