100 lines
3.6 KiB
Python
100 lines
3.6 KiB
Python
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 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):
|
|
colors = InStuckColorsSerializer(many=True, read_only=True)
|
|
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', 'colors'],
|
|
'instance': ['name', 'description', 'price', 'image1', 'image2', 'image3', 'video', 'rating', 'discount', 'slug', 'meta_description', 'meta_keywords', 'meta_rating', 'category', 'colors', 'related_products', 'details', 'in_pack_items'],
|
|
'chat': ['name', 'description', 'price', 'in_stock', 'discount', 'colors']
|
|
}
|
|
|
|
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']
|