# from rest_framework import serializers # class ProductInputSerializer(serializers.Serializer): # """Serializer for individual product input.""" # product_id = serializers.CharField(required=False, allow_blank=True, allow_null=True) # title = serializers.CharField(required=False, allow_blank=True, allow_null=True) # short_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True) # long_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True) # class SingleProductRequestSerializer(serializers.Serializer): # """Serializer for single product extraction request.""" # title = serializers.CharField(required=False, allow_blank=True, allow_null=True) # short_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True) # long_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True) # mandatory_attrs = serializers.DictField( # child=serializers.ListField(child=serializers.CharField()), # required=True # ) # model = serializers.CharField(required=False, default="llama-3.1-8b-instant") # extract_additional = serializers.BooleanField(required=False, default=True) # def validate_model(self, value): # from django.conf import settings # if value not in settings.SUPPORTED_MODELS: # raise serializers.ValidationError( # f"Model must be one of {settings.SUPPORTED_MODELS}" # ) # return value # class BatchProductRequestSerializer(serializers.Serializer): # """Serializer for batch product extraction request.""" # products = serializers.ListField( # child=ProductInputSerializer(), # required=True, # min_length=1 # ) # mandatory_attrs = serializers.DictField( # child=serializers.ListField(child=serializers.CharField()), # required=True # ) # model = serializers.CharField(required=False, default="llama-3.1-8b-instant") # extract_additional = serializers.BooleanField(required=False, default=True) # def validate_model(self, value): # from django.conf import settings # if value not in settings.SUPPORTED_MODELS: # raise serializers.ValidationError( # f"Model must be one of {settings.SUPPORTED_MODELS}" # ) # return value # def validate_products(self, value): # from django.conf import settings # max_size = getattr(settings, 'MAX_BATCH_SIZE', 100) # if len(value) > max_size: # raise serializers.ValidationError( # f"Batch size cannot exceed {max_size} products" # ) # return value # class ProductAttributeResultSerializer(serializers.Serializer): # """Serializer for individual product extraction result.""" # product_id = serializers.CharField(required=False) # mandatory = serializers.DictField() # additional = serializers.DictField(required=False) # error = serializers.CharField(required=False) # raw_output = serializers.CharField(required=False) # class BatchProductResponseSerializer(serializers.Serializer): # """Serializer for batch extraction response.""" # results = serializers.ListField(child=ProductAttributeResultSerializer()) # total_products = serializers.IntegerField() # successful = serializers.IntegerField() # failed = serializers.IntegerField() # ==================== serializers.py ==================== from rest_framework import serializers class ProductInputSerializer(serializers.Serializer): """Serializer for individual product input.""" product_id = serializers.CharField(required=False, allow_blank=True, allow_null=True) title = serializers.CharField(required=False, allow_blank=True, allow_null=True) short_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True) long_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True) image_url = serializers.URLField(required=False, allow_blank=True, allow_null=True) class SingleProductRequestSerializer(serializers.Serializer): """Serializer for single product extraction request.""" # title = serializers.CharField(required=False, allow_blank=True, allow_null=True) # short_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True) # long_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True) # image_url = serializers.URLField(required=False, allow_blank=True, allow_null=True) item_id = serializers.CharField(required=True) mandatory_attrs = serializers.DictField( child=serializers.ListField(child=serializers.CharField()), required=True ) model = serializers.CharField(required=False, default="llama-3.1-8b-instant") extract_additional = serializers.BooleanField(required=False, default=True) process_image = serializers.BooleanField(required=False, default=True) def validate_model(self, value): from django.conf import settings if value not in settings.SUPPORTED_MODELS: raise serializers.ValidationError( f"Model must be one of {settings.SUPPORTED_MODELS}" ) return value # class BatchProductRequestSerializer(serializers.Serializer): # """Serializer for batch product extraction request.""" # products = serializers.ListField( # child=ProductInputSerializer(), # required=True, # min_length=1 # ) # mandatory_attrs = serializers.DictField( # child=serializers.ListField(child=serializers.CharField()), # required=True # ) # model = serializers.CharField(required=False, default="llama-3.1-8b-instant") # extract_additional = serializers.BooleanField(required=False, default=True) # process_image = serializers.BooleanField(required=False, default=True) # def validate_model(self, value): # from django.conf import settings # if value not in settings.SUPPORTED_MODELS: # raise serializers.ValidationError( # f"Model must be one of {settings.SUPPORTED_MODELS}" # ) # return value # def validate_products(self, value): # from django.conf import settings # max_size = getattr(settings, 'MAX_BATCH_SIZE', 100) # if len(value) > max_size: # raise serializers.ValidationError( # f"Batch size cannot exceed {max_size} products" # ) # return value class BatchProductRequestSerializer(serializers.Serializer): """Serializer for batch product extraction request (by item_id).""" item_ids = serializers.ListField( child=serializers.CharField(), required=True, min_length=1 ) mandatory_attrs = serializers.DictField( child=serializers.ListField(child=serializers.CharField()), required=True ) model = serializers.CharField(required=False, default="llama-3.1-8b-instant") extract_additional = serializers.BooleanField(required=False, default=True) process_image = serializers.BooleanField(required=False, default=True) def validate_model(self, value): from django.conf import settings if value not in settings.SUPPORTED_MODELS: raise serializers.ValidationError( f"Model must be one of {settings.SUPPORTED_MODELS}" ) return value def validate_item_ids(self, value): from django.conf import settings max_size = getattr(settings, 'MAX_BATCH_SIZE', 100) if len(value) > max_size: raise serializers.ValidationError( f"Batch size cannot exceed {max_size} products" ) return value class OCRResultSerializer(serializers.Serializer): """Serializer for OCR results.""" detected_text = serializers.ListField(child=serializers.DictField()) extracted_attributes = serializers.DictField() class ProductAttributeResultSerializer(serializers.Serializer): """Serializer for individual product extraction result.""" product_id = serializers.CharField(required=False) mandatory = serializers.DictField() additional = serializers.DictField(required=False) ocr_results = OCRResultSerializer(required=False) error = serializers.CharField(required=False) raw_output = serializers.CharField(required=False) class BatchProductResponseSerializer(serializers.Serializer): """Serializer for batch extraction response.""" results = serializers.ListField(child=ProductAttributeResultSerializer()) total_products = serializers.IntegerField() successful = serializers.IntegerField() failed = serializers.IntegerField() from rest_framework import serializers from .models import Product class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = [ 'id', 'item_id', 'product_name', 'product_long_description', 'product_short_description', 'product_type', 'image_path', 'image', ]