From a575435b81229fbf9d12d45fda5a2b0a17ed8f50 Mon Sep 17 00:00:00 2001 From: Hironsan Date: Tue, 26 Jun 2018 13:14:38 +0900 Subject: [PATCH] Update serializers --- doccano/app/app/settings.py | 3 +- doccano/app/db.sqlite3 | Bin 233472 -> 196608 bytes doccano/app/server/models.py | 6 +-- doccano/app/server/serializers.py | 21 +++++----- doccano/app/server/static/annotation.js | 4 +- doccano/app/server/views.py | 53 ++++++++++++++++++++---- 6 files changed, 64 insertions(+), 23 deletions(-) diff --git a/doccano/app/app/settings.py b/doccano/app/app/settings.py index 0f93c003..a9fbcfd7 100644 --- a/doccano/app/app/settings.py +++ b/doccano/app/app/settings.py @@ -115,7 +115,8 @@ REST_FRAMEWORK = { ], 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'PAGE_SIZE': 2, - 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) + 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',), + 'SEARCH_PARAM': 'q', } # Internationalization diff --git a/doccano/app/db.sqlite3 b/doccano/app/db.sqlite3 index 29a5856c7a994cab6198aa651284a9c817d6f228..fb73d843beb6aecad6f026d624b9e1584c71d5df 100644 GIT binary patch delta 3037 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 KIvM-|!2b_2$|ZpS diff --git a/doccano/app/server/models.py b/doccano/app/server/models.py index a42cfe82..63424cbe 100644 --- a/doccano/app/server/models.py +++ b/doccano/app/server/models.py @@ -16,7 +16,7 @@ class Project(models.Model): class Label(models.Model): text = models.CharField(max_length=100, unique=True) shortcut = models.CharField(max_length=10, unique=True) - project = models.ForeignKey(Project, on_delete=models.CASCADE) + project = models.ForeignKey(Project, related_name='labels', on_delete=models.CASCADE) def as_dict(self): return {'id': self.id, @@ -29,7 +29,7 @@ class Label(models.Model): class Document(models.Model): text = models.TextField() - project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) + project = models.ForeignKey(Project, related_name='documents', on_delete=models.CASCADE) def as_dict(self): return {'id': self.id, @@ -42,7 +42,7 @@ class Document(models.Model): class Annotation(models.Model): prob = models.FloatField(blank=True, null=True) label = models.ForeignKey(Label, on_delete=models.CASCADE) - data = models.ForeignKey(Document, related_name='annotations', on_delete=models.CASCADE) + data = models.ForeignKey(Document, related_name='labels', on_delete=models.CASCADE) manual = models.BooleanField(default=False) def as_dict(self): diff --git a/doccano/app/server/serializers.py b/doccano/app/server/serializers.py index 49fe01d3..f4a13557 100644 --- a/doccano/app/server/serializers.py +++ b/doccano/app/server/serializers.py @@ -3,13 +3,6 @@ from rest_framework import serializers from .models import Label, Project, Document, Annotation -class ProjectSerializer(serializers.ModelSerializer): - - class Meta: - model = Project - fields = ('id', 'name', 'description', 'created_at', 'updated_at', 'users') - - class LabelSerializer(serializers.ModelSerializer): class Meta: @@ -26,9 +19,17 @@ class AnnotationSerializer(serializers.ModelSerializer): class DocumentSerializer(serializers.ModelSerializer): - project = ProjectSerializer() - annotations = AnnotationSerializer(many=True) + labels = AnnotationSerializer(many=True) class Meta: model = Document - fields = ('id', 'text', 'project', 'annotations') + fields = ('id', 'text', 'labels') + + +class ProjectSerializer(serializers.ModelSerializer): + labels = LabelSerializer(many=True) + documents = DocumentSerializer(many=True) + + class Meta: + model = Project + fields = ('id', 'name', 'description', 'users', 'labels', 'documents') diff --git a/doccano/app/server/static/annotation.js b/doccano/app/server/static/annotation.js index 7e98bf94..70bb0c07 100644 --- a/doccano/app/server/static/annotation.js +++ b/doccano/app/server/static/annotation.js @@ -164,9 +164,9 @@ var vm = new Vue({ computed: { achievement: function () { if (this.total == 0) { - return 0; + return 0 } else { - return (this.total - this.remaining) / this.total * 100 + return Math.round((this.total - this.remaining) / this.total * 100) } }, progressColor: function () { diff --git a/doccano/app/server/views.py b/doccano/app/server/views.py index 9de4d352..5c3860f6 100644 --- a/doccano/app/server/views.py +++ b/doccano/app/server/views.py @@ -1,6 +1,6 @@ import json -import django_filters +from django_filters.rest_framework import DjangoFilterBackend from django.http import JsonResponse, HttpResponse from django.shortcuts import render from django.views import View @@ -8,6 +8,9 @@ from django.views.generic.list import ListView from django.views.generic.detail import DetailView from django.core.paginator import Paginator from rest_framework import viewsets, filters +from rest_framework.decorators import action +from rest_framework.response import Response + from .models import Annotation, Label, Document, Project from .serializers import LabelSerializer, ProjectSerializer, DocumentSerializer @@ -200,17 +203,53 @@ class DataDownloadAPI(View): return response -class LabelViewSet(viewsets.ModelViewSet): - queryset = Label.objects.all() - serializer_class = LabelSerializer - filter_fields = ('text', 'project') - - class ProjectViewSet(viewsets.ModelViewSet): queryset = Project.objects.all() serializer_class = ProjectSerializer + @action(methods=['get'], detail=True) + def labels(self, request, pk=None): + project = self.get_object() + res = {label.id: label.text for label in project.labels.all()} + return Response(res) + + @action(methods=['get'], detail=True) + def docs(self, request, pk=None): + project = self.get_object() + res = [doc.as_dict() for doc in project.documents.all()] + return Response(res) + + @action(methods=['get'], detail=True) + def progress(self, request, pk=None): + project = self.get_object() + docs = project.documents.all() + remaining = docs.filter(labels__isnull=True).count() + return Response({'total': docs.count(), 'remaining': remaining}) + + @action(methods=['post'], detail=True) + def upload_doc(self, request, pk=None): + project = self.get_object() + f = request.FILES['file'] + content = ''.join(chunk.decode('utf-8') for chunk in f.chunks()) + for line in content.split('\n'): + j = json.loads(line) + Document(project=project, text=j['text']).save() + + @action(methods=['get'], detail=True) + def download_doc(self, request, pk=None): + project = self.get_object() + res = [] + return res + class DocumentViewSet(viewsets.ModelViewSet): queryset = Document.objects.all() serializer_class = DocumentSerializer + filter_backends = (DjangoFilterBackend, filters.SearchFilter) + search_fields = ('text', ) + + +class LabelViewSet(viewsets.ModelViewSet): + queryset = Label.objects.all() + serializer_class = LabelSerializer + filter_fields = ('project',)