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']