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.
76 lines
2.7 KiB
Python
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)
|