| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- # 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 MandatoryAttrsField(serializers.DictField):
- """Custom DictField to validate mandatory_attrs structure."""
- child = serializers.ListField(child=serializers.CharField())
- class ProductBatchInputSerializer(serializers.Serializer):
- """Serializer for an individual product input within the batch request."""
- item_id = serializers.CharField(required=True)
- mandatory_attrs = MandatoryAttrsField(
- required=True,
- help_text="A dictionary of attribute names and their possible values."
- )
- # You can also allow per-product model/flags if needed, but keeping it batch-level for simplicity here.
- 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 (with item-specific attributes)."""
- products = serializers.ListField(
- child=ProductBatchInputSerializer(), # <--- Changed
- required=True,
- min_length=1
- )
- 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)
-
- # ... validate_model method ...
- 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
-
- # ... validate_products method (updated to use products instead of item_ids) ...
- 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 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):
- product_type_details = serializers.SerializerMethodField()
-
- class Meta:
- model = Product
- fields = [
- 'id',
- 'item_id',
- 'product_name',
- 'product_long_description',
- 'product_short_description',
- 'product_type',
- 'image_path',
- 'image',
- 'product_type_details', # new field
- ]
- def get_product_type_details(self, obj):
- # Fetch ProductType object for this product
- try:
- product_type = ProductType.objects.get(name=obj.product_type)
- except ProductType.DoesNotExist:
- return []
- # Serialize its attributes
- attributes = ProductAttribute.objects.filter(product_type=product_type)
- return [
- {
- "attribute_name": attr.name,
- "is_mandatory": "Yes" if attr.is_mandatory else "No",
- "possible_values": [pv.value for pv in attr.possible_values.all()]
- }
- for attr in attributes
- ]
- from rest_framework import serializers
- from .models import Product, ProductType, ProductAttribute, AttributePossibleValue
- class AttributePossibleValueSerializer(serializers.ModelSerializer):
- class Meta:
- model = AttributePossibleValue
- fields = ['value']
- class ProductAttributeSerializer(serializers.ModelSerializer):
- possible_values = AttributePossibleValueSerializer(many=True, read_only=True)
-
- class Meta:
- model = ProductAttribute
- fields = ['name', 'is_mandatory', 'possible_values']
- class ProductTypeSerializer(serializers.ModelSerializer):
- attributes = ProductAttributeSerializer(many=True, read_only=True)
-
- class Meta:
- model = ProductType
- fields = ['name', 'attributes']
|