mirror of https://github.com/doccano/doccano.git
pythondatasetsactive-learningtext-annotationdatasetnatural-language-processingdata-labelingmachine-learningannotation-tool
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.4 KiB
37 lines
1.4 KiB
import json
|
|
|
|
from django.db import IntegrityError, transaction
|
|
from django.shortcuts import get_object_or_404
|
|
from rest_framework import status
|
|
from rest_framework.exceptions import ParseError
|
|
from rest_framework.parsers import MultiPartParser
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from labels.serializers import AnnotationRelationsSerializer
|
|
from members.permissions import IsProjectAdmin
|
|
|
|
from ...exceptions import AnnotationRelationValidationError
|
|
from ...models import Project
|
|
|
|
|
|
class RelationUploadAPI(APIView):
|
|
parser_classes = (MultiPartParser,)
|
|
permission_classes = [IsAuthenticated & IsProjectAdmin]
|
|
|
|
@transaction.atomic
|
|
def post(self, request, *args, **kwargs):
|
|
if 'file' not in request.data:
|
|
raise ParseError('Empty content')
|
|
project = get_object_or_404(Project, pk=kwargs['project_id'])
|
|
try:
|
|
annotation_relations = json.load(request.data)
|
|
serializer = AnnotationRelationsSerializer(data=annotation_relations, many=True)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save(project=project)
|
|
return Response(status=status.HTTP_201_CREATED)
|
|
except json.decoder.JSONDecodeError:
|
|
raise ParseError('The file format is invalid.')
|
|
except IntegrityError:
|
|
raise AnnotationRelationValidationError
|