winofy-backend/apps/catalog/serializers.py
Ali Asadi 3748da1af7 Add explicit schema types for presigned media URL fields
Swagger inferred these SerializerMethodFields as untyped strings and
warned on generation; annotate each with @extend_schema_field so the
generated OpenAPI schema declares them as nullable URLs.
2026-08-18 10:48:36 +03:30

76 lines
2.7 KiB
Python

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)