2 changed files with 112 additions and 51 deletions
@ -1,50 +1,49 @@ |
|||
from rest_framework import viewsets, status |
|||
from rest_framework.decorators import action |
|||
from rest_framework.response import Response |
|||
from .models import CrawlTask, CrawlRun |
|||
from .serializers import CrawlTaskSerializer, CrawlRunSerializer |
|||
|
|||
class CrawlTaskViewSet(viewsets.ModelViewSet): |
|||
""" |
|||
ViewSet for CrawlTask models. Supports CRUD and custom trigger/runs actions. |
|||
""" |
|||
queryset = CrawlTask.objects.all().order_by('-created_at') |
|||
serializer_class = CrawlTaskSerializer |
|||
|
|||
@action(detail=True, methods=['post'], url_path='trigger') |
|||
def trigger(self, request, pk=None): |
|||
task = self.get_object() |
|||
|
|||
# Create a new CrawlRun with status RUNNING |
|||
run = CrawlRun.objects.create( |
|||
crawl_task=task, |
|||
status='RUNNING' |
|||
) |
|||
|
|||
# Check if tasks can be imported. |
|||
# This will integrate with crawlers/tasks.py once it is written in a later step. |
|||
try: |
|||
from crawler.tasks import run_crawl_pipeline |
|||
# run asynchronously |
|||
run_crawl_pipeline.delay(str(run.id)) |
|||
is_queued = True |
|||
except ImportError: |
|||
# Fallback if tasks.py doesn't exist yet or run_crawl_pipeline is not defined |
|||
is_queued = False |
|||
|
|||
return Response({ |
|||
"status": "queued" if is_queued else "queued_stub", |
|||
"run_id": str(run.id) |
|||
}, status=status.HTTP_202_ACCEPTED) |
|||
|
|||
@action(detail=True, methods=['get'], url_path='runs') |
|||
def runs(self, request, pk=None): |
|||
task = self.get_object() |
|||
runs = task.runs.all().order_by('-started_at') |
|||
page = self.paginate_queryset(runs) |
|||
if page is not None: |
|||
serializer = CrawlRunSerializer(page, many=True) |
|||
return self.get_paginated_response(serializer.data) |
|||
|
|||
serializer = CrawlRunSerializer(runs, many=True) |
|||
return Response(serializer.data) |
|||
from rest_framework import viewsets, status |
|||
from rest_framework.decorators import action |
|||
from rest_framework.response import Response |
|||
from .models import CrawlTask, CrawlRun |
|||
from .serializers import CrawlTaskSerializer, CrawlRunSerializer |
|||
|
|||
class CrawlTaskViewSet(viewsets.ModelViewSet): |
|||
""" |
|||
ViewSet for CrawlTask models. Supports CRUD and custom trigger/runs actions. |
|||
""" |
|||
queryset = CrawlTask.objects.all().order_by('-created_at') |
|||
serializer_class = CrawlTaskSerializer |
|||
|
|||
@action(detail=True, methods=['post'], url_path='trigger') |
|||
def trigger(self, request, pk=None): |
|||
task = self.get_object() |
|||
|
|||
# Create a new CrawlRun with status RUNNING |
|||
run = CrawlRun.objects.create( |
|||
crawl_task=task, |
|||
status='RUNNING' |
|||
) |
|||
|
|||
# Check if tasks can be imported. |
|||
try: |
|||
from crawler.tasks import run_crawl_pipeline |
|||
# run asynchronously |
|||
run_crawl_pipeline.delay(str(run.id)) |
|||
is_queued = True |
|||
except ImportError: |
|||
# Fallback if tasks.py doesn't exist yet or run_crawl_pipeline is not defined |
|||
is_queued = False |
|||
|
|||
return Response({ |
|||
"status": "queued" if is_queued else "queued_stub", |
|||
"run_id": str(run.id) |
|||
}, status=status.HTTP_202_ACCEPTED) |
|||
|
|||
@action(detail=True, methods=['get'], url_path='runs') |
|||
def runs(self, request, pk=None): |
|||
task = self.get_object() |
|||
runs = task.runs.all().order_by('-started_at') |
|||
page = self.paginate_queryset(runs) |
|||
if page is not None: |
|||
serializer = CrawlRunSerializer(page, many=True) |
|||
return self.get_paginated_response(serializer.data) |
|||
|
|||
serializer = CrawlRunSerializer(runs, many=True) |
|||
return Response(serializer.data) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue