from django.shortcuts import render # Create your views here. # views.py from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .tasks import extract_product_attributes, batch_extract_attributes from .models import Product, ProductAttribute from .serializers import ProductAttributeSerializer class ExtractAttributesView(APIView): """ Trigger attribute extraction for a product """ def post(self, request, product_id): try: product = Product.objects.get(id=product_id) # Trigger async task task = extract_product_attributes.delay(product_id) return Response({ 'message': 'Extraction started', 'task_id': task.id, 'product_id': product_id }, status=status.HTTP_202_ACCEPTED) except Product.DoesNotExist: return Response({'error': 'Product not found'}, status=status.HTTP_404_NOT_FOUND) class BatchExtractAttributesView(APIView): """ Trigger batch extraction """ def post(self, request): product_ids = request.data.get('product_ids', []) if not product_ids: return Response({'error': 'No product IDs provided'}, status=status.HTTP_400_BAD_REQUEST) task_results = batch_extract_attributes.delay(product_ids) return Response({ 'message': f'Batch extraction started for {len(product_ids)} products', 'task_id': task_results.id }, status=status.HTTP_202_ACCEPTED) class ProductAttributesView(APIView): """ Get extracted attributes for a product """ def get(self, request, product_id): try: product = Product.objects.get(id=product_id) attributes = ProductAttribute.objects.filter(product=product) serializer = ProductAttributeSerializer(attributes, many=True) return Response({ 'product_id': product_id, 'attributes_extracted': product.attributes_extracted, 'attributes': serializer.data }) except Product.DoesNotExist: return Response({'error': 'Product not found'}, status=status.HTTP_404_NOT_FOUND) class AttributeReviewView(APIView): """ Review and update low-confidence attributes """ def get(self, request): # Get attributes needing review attributes = ProductAttribute.objects.filter( needs_review=True, reviewed=False ).select_related('product')[:50] serializer = ProductAttributeSerializer(attributes, many=True) return Response(serializer.data) def patch(self, request, attribute_id): try: attribute = ProductAttribute.objects.get(id=attribute_id) # Update attribute attribute.attribute_value = request.data.get('attribute_value', attribute.attribute_value) attribute.reviewed = True attribute.confidence_score = 1.0 # Human verified attribute.save() return Response({'message': 'Attribute updated'}) except ProductAttribute.DoesNotExist: return Response({'error': 'Attribute not found'}, status=status.HTTP_404_NOT_FOUND)