HTT / store /serializers.py
Deep
backend
e7b5120
from rest_framework import serializers
from .models import (
User,
Address,
Product,
Order,
OrderDetail,
)
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, required=False)
class Meta:
model = User
fields = [
'id',
'username',
'email',
'password',
'full_name',
'user_age',
'user_gender',
'created_at',
]
read_only_fields = ['id', 'created_at']
def create(self, validated_data):
password = validated_data.pop('password', None)
user = User(**validated_data)
if password:
user.set_password(password)
user.save()
return user
def update(self, instance, validated_data):
password = validated_data.pop('password', None)
for attr, value in validated_data.items():
setattr(instance, attr, value)
if password:
instance.set_password(password)
instance.save()
return instance
class AddressSerializer(serializers.ModelSerializer):
# user is set server-side from the authenticated request
user = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Address
fields = [
'id',
'user',
'line1',
'line2',
'city',
'state',
'country',
'pincode',
'is_default',
'created_at',
]
read_only_fields = ['id', 'created_at']
class ProductSerializer(serializers.ModelSerializer):
display_price = serializers.SerializerMethodField()
is_price_adjusted = serializers.SerializerMethodField()
class Meta:
model = Product
fields = [
'id',
'product_name',
'base_price',
'display_price',
'is_price_adjusted',
'stock_quantity',
]
read_only_fields = ['id']
def get_display_price(self, obj):
"""Return base_price + 10% markup if user is predicted to be a high returner."""
markup = self.context.get('return_risk_markup', {})
if markup.get('apply'):
from decimal import Decimal
return str(round(float(obj.base_price) * 1.10, 2))
return str(obj.base_price)
def get_is_price_adjusted(self, obj):
markup = self.context.get('return_risk_markup', {})
return markup.get('apply', False)
class OrderDetailSerializer(serializers.ModelSerializer):
product = ProductSerializer(read_only=True)
product_id = serializers.PrimaryKeyRelatedField(
write_only=True, queryset=Product.objects.all(), source='product'
)
order = serializers.PrimaryKeyRelatedField(queryset=Order.objects.all())
class Meta:
model = OrderDetail
fields = [
'id',
'order',
'product',
'product_id',
'order_quantity',
'product_price',
'discount_applied',
'return_status',
'return_date',
'return_reason',
'days_to_return',
'is_exchanged',
'exchange_order',
]
read_only_fields = ['id']
class OrderSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(read_only=True)
shipping_address = AddressSerializer(read_only=True)
items = OrderDetailSerializer(many=True, read_only=True)
class Meta:
model = Order
fields = [
'id',
'user',
'shipping_address',
'order_date',
'payment_method',
'shipping_method',
'items',
]
read_only_fields = ['id', 'order_date']