serializers.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. # from rest_framework import serializers
  2. # class ProductInputSerializer(serializers.Serializer):
  3. # """Serializer for individual product input."""
  4. # product_id = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  5. # title = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  6. # short_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  7. # long_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  8. # class SingleProductRequestSerializer(serializers.Serializer):
  9. # """Serializer for single product extraction request."""
  10. # title = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  11. # short_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  12. # long_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  13. # mandatory_attrs = serializers.DictField(
  14. # child=serializers.ListField(child=serializers.CharField()),
  15. # required=True
  16. # )
  17. # model = serializers.CharField(required=False, default="llama-3.1-8b-instant")
  18. # extract_additional = serializers.BooleanField(required=False, default=True)
  19. # def validate_model(self, value):
  20. # from django.conf import settings
  21. # if value not in settings.SUPPORTED_MODELS:
  22. # raise serializers.ValidationError(
  23. # f"Model must be one of {settings.SUPPORTED_MODELS}"
  24. # )
  25. # return value
  26. # class BatchProductRequestSerializer(serializers.Serializer):
  27. # """Serializer for batch product extraction request."""
  28. # products = serializers.ListField(
  29. # child=ProductInputSerializer(),
  30. # required=True,
  31. # min_length=1
  32. # )
  33. # mandatory_attrs = serializers.DictField(
  34. # child=serializers.ListField(child=serializers.CharField()),
  35. # required=True
  36. # )
  37. # model = serializers.CharField(required=False, default="llama-3.1-8b-instant")
  38. # extract_additional = serializers.BooleanField(required=False, default=True)
  39. # def validate_model(self, value):
  40. # from django.conf import settings
  41. # if value not in settings.SUPPORTED_MODELS:
  42. # raise serializers.ValidationError(
  43. # f"Model must be one of {settings.SUPPORTED_MODELS}"
  44. # )
  45. # return value
  46. # def validate_products(self, value):
  47. # from django.conf import settings
  48. # max_size = getattr(settings, 'MAX_BATCH_SIZE', 100)
  49. # if len(value) > max_size:
  50. # raise serializers.ValidationError(
  51. # f"Batch size cannot exceed {max_size} products"
  52. # )
  53. # return value
  54. # class ProductAttributeResultSerializer(serializers.Serializer):
  55. # """Serializer for individual product extraction result."""
  56. # product_id = serializers.CharField(required=False)
  57. # mandatory = serializers.DictField()
  58. # additional = serializers.DictField(required=False)
  59. # error = serializers.CharField(required=False)
  60. # raw_output = serializers.CharField(required=False)
  61. # class BatchProductResponseSerializer(serializers.Serializer):
  62. # """Serializer for batch extraction response."""
  63. # results = serializers.ListField(child=ProductAttributeResultSerializer())
  64. # total_products = serializers.IntegerField()
  65. # successful = serializers.IntegerField()
  66. # failed = serializers.IntegerField()
  67. # ==================== serializers.py ====================
  68. from rest_framework import serializers
  69. class ProductInputSerializer(serializers.Serializer):
  70. """Serializer for individual product input."""
  71. product_id = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  72. title = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  73. short_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  74. long_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  75. image_url = serializers.URLField(required=False, allow_blank=True, allow_null=True)
  76. class MandatoryAttrsField(serializers.DictField):
  77. """Custom DictField to validate mandatory_attrs structure."""
  78. child = serializers.ListField(child=serializers.CharField())
  79. class ProductBatchInputSerializer(serializers.Serializer):
  80. """Serializer for an individual product input within the batch request."""
  81. item_id = serializers.CharField(required=True)
  82. mandatory_attrs = MandatoryAttrsField(
  83. required=True,
  84. help_text="A dictionary of attribute names and their possible values."
  85. )
  86. # You can also allow per-product model/flags if needed, but keeping it batch-level for simplicity here.
  87. class SingleProductRequestSerializer(serializers.Serializer):
  88. """Serializer for single product extraction request."""
  89. # title = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  90. # short_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  91. # long_desc = serializers.CharField(required=False, allow_blank=True, allow_null=True)
  92. # image_url = serializers.URLField(required=False, allow_blank=True, allow_null=True)
  93. item_id = serializers.CharField(required=True)
  94. mandatory_attrs = serializers.DictField(
  95. child=serializers.ListField(child=serializers.CharField()),
  96. required=True
  97. )
  98. model = serializers.CharField(required=False, default="llama-3.1-8b-instant")
  99. extract_additional = serializers.BooleanField(required=False, default=True)
  100. process_image = serializers.BooleanField(required=False, default=True)
  101. def validate_model(self, value):
  102. from django.conf import settings
  103. if value not in settings.SUPPORTED_MODELS:
  104. raise serializers.ValidationError(
  105. f"Model must be one of {settings.SUPPORTED_MODELS}"
  106. )
  107. return value
  108. class BatchProductRequestSerializer(serializers.Serializer):
  109. """Serializer for batch product extraction request (with item-specific attributes)."""
  110. products = serializers.ListField(
  111. child=ProductBatchInputSerializer(), # <--- Changed
  112. required=True,
  113. min_length=1
  114. )
  115. model = serializers.CharField(required=False, default="llama-3.1-8b-instant")
  116. extract_additional = serializers.BooleanField(required=False, default=True)
  117. process_image = serializers.BooleanField(required=False, default=True)
  118. # ... validate_model method ...
  119. def validate_model(self, value):
  120. from django.conf import settings
  121. if value not in settings.SUPPORTED_MODELS:
  122. raise serializers.ValidationError(
  123. f"Model must be one of {settings.SUPPORTED_MODELS}"
  124. )
  125. return value
  126. # ... validate_products method (updated to use products instead of item_ids) ...
  127. def validate_products(self, value):
  128. from django.conf import settings
  129. max_size = getattr(settings, 'MAX_BATCH_SIZE', 100)
  130. if len(value) > max_size:
  131. raise serializers.ValidationError(
  132. f"Batch size cannot exceed {max_size} products"
  133. )
  134. return value
  135. class OCRResultSerializer(serializers.Serializer):
  136. """Serializer for OCR results."""
  137. detected_text = serializers.ListField(child=serializers.DictField())
  138. extracted_attributes = serializers.DictField()
  139. class ProductAttributeResultSerializer(serializers.Serializer):
  140. """Serializer for individual product extraction result."""
  141. product_id = serializers.CharField(required=False)
  142. mandatory = serializers.DictField()
  143. additional = serializers.DictField(required=False)
  144. ocr_results = OCRResultSerializer(required=False)
  145. error = serializers.CharField(required=False)
  146. raw_output = serializers.CharField(required=False)
  147. class BatchProductResponseSerializer(serializers.Serializer):
  148. """Serializer for batch extraction response."""
  149. results = serializers.ListField(child=ProductAttributeResultSerializer())
  150. total_products = serializers.IntegerField()
  151. successful = serializers.IntegerField()
  152. failed = serializers.IntegerField()
  153. from rest_framework import serializers
  154. from .models import Product
  155. class ProductSerializer(serializers.ModelSerializer):
  156. product_type_details = serializers.SerializerMethodField()
  157. class Meta:
  158. model = Product
  159. fields = [
  160. 'id',
  161. 'item_id',
  162. 'product_name',
  163. 'product_long_description',
  164. 'product_short_description',
  165. 'product_type',
  166. 'image_path',
  167. 'image',
  168. 'product_type_details', # new field
  169. ]
  170. def get_product_type_details(self, obj):
  171. # Fetch ProductType object for this product
  172. try:
  173. product_type = ProductType.objects.get(name=obj.product_type)
  174. except ProductType.DoesNotExist:
  175. return []
  176. # Serialize its attributes
  177. attributes = ProductAttribute.objects.filter(product_type=product_type)
  178. return [
  179. {
  180. "attribute_name": attr.name,
  181. "is_mandatory": "Yes" if attr.is_mandatory else "No",
  182. "possible_values": [pv.value for pv in attr.possible_values.all()]
  183. }
  184. for attr in attributes
  185. ]
  186. from rest_framework import serializers
  187. from .models import Product, ProductType, ProductAttribute, AttributePossibleValue
  188. class AttributePossibleValueSerializer(serializers.ModelSerializer):
  189. class Meta:
  190. model = AttributePossibleValue
  191. fields = ['value']
  192. class ProductAttributeSerializer(serializers.ModelSerializer):
  193. possible_values = AttributePossibleValueSerializer(many=True, read_only=True)
  194. class Meta:
  195. model = ProductAttribute
  196. fields = ['name', 'is_mandatory', 'possible_values']
  197. class ProductTypeSerializer(serializers.ModelSerializer):
  198. attributes = ProductAttributeSerializer(many=True, read_only=True)
  199. class Meta:
  200. model = ProductType
  201. fields = ['name', 'attributes']