from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from apps.core.media import presigned_media_url from apps.stores.serializers import StoreListSerializer from .models import Product, ProductCategory class ProductCategorySerializer(serializers.ModelSerializer): icon_url = serializers.SerializerMethodField() class Meta: model = ProductCategory fields = ('uuid', 'name', 'parent', 'icon', 'icon_url', 'order') @extend_schema_field(serializers.URLField(allow_null=True)) def get_icon_url(self, obj): return presigned_media_url(obj.icon) class ProductListSerializer(serializers.ModelSerializer): is_out_of_stock = serializers.BooleanField(read_only=True) image_url = serializers.SerializerMethodField() class Meta: model = Product fields = ( 'uuid', 'name', 'image', 'image_url', 'price', 'unit_type', 'unit_value', 'is_active', 'is_out_of_stock', ) @extend_schema_field(serializers.URLField(allow_null=True)) def get_image_url(self, obj): return presigned_media_url(obj.image) class ProductDetailSerializer(ProductListSerializer): category = ProductCategorySerializer(read_only=True) store = StoreListSerializer(read_only=True) class Meta(ProductListSerializer.Meta): fields = ProductListSerializer.Meta.fields + ('description', 'category', 'store') class SellerProductSerializer(serializers.ModelSerializer): """Read/write serializer for the seller's own products (S06/S07/S08).""" category = ProductCategorySerializer(read_only=True) category_uuid = serializers.PrimaryKeyRelatedField( source='category', queryset=ProductCategory.objects.all(), write_only=True, ) is_out_of_stock = serializers.BooleanField(read_only=True) is_low_stock = serializers.BooleanField(read_only=True) image_url = serializers.SerializerMethodField() class Meta: model = Product fields = ( 'uuid', 'name', 'description', 'image', 'image_url', 'category', 'category_uuid', 'price', 'unit_type', 'unit_value', 'stock_quantity', 'low_stock_threshold', 'is_active', 'sold_count', 'is_out_of_stock', 'is_low_stock', 'created_at', ) read_only_fields = ('sold_count',) @extend_schema_field(serializers.URLField(allow_null=True)) def get_image_url(self, obj): return presigned_media_url(obj.image) def create(self, validated_data): validated_data['store'] = self.context['request'].user.store return super().create(validated_data) class StockAdjustSerializer(serializers.Serializer): stock_quantity = serializers.IntegerField(min_value=0)