Browse Source

Update serializers

pull/10/head
Hironsan 6 years ago
parent
commit
a575435b81
6 changed files with 64 additions and 23 deletions
  1. 3
      doccano/app/app/settings.py
  2. BIN
      doccano/app/db.sqlite3
  3. 6
      doccano/app/server/models.py
  4. 21
      doccano/app/server/serializers.py
  5. 4
      doccano/app/server/static/annotation.js
  6. 53
      doccano/app/server/views.py

3
doccano/app/app/settings.py

@ -115,7 +115,8 @@ REST_FRAMEWORK = {
], ],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 2, 'PAGE_SIZE': 2,
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
'SEARCH_PARAM': 'q',
} }
# Internationalization # Internationalization

BIN
doccano/app/db.sqlite3

6
doccano/app/server/models.py

@ -16,7 +16,7 @@ class Project(models.Model):
class Label(models.Model): class Label(models.Model):
text = models.CharField(max_length=100, unique=True) text = models.CharField(max_length=100, unique=True)
shortcut = models.CharField(max_length=10, 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): def as_dict(self):
return {'id': self.id, return {'id': self.id,
@ -29,7 +29,7 @@ class Label(models.Model):
class Document(models.Model): class Document(models.Model):
text = models.TextField() 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): def as_dict(self):
return {'id': self.id, return {'id': self.id,
@ -42,7 +42,7 @@ class Document(models.Model):
class Annotation(models.Model): class Annotation(models.Model):
prob = models.FloatField(blank=True, null=True) prob = models.FloatField(blank=True, null=True)
label = models.ForeignKey(Label, on_delete=models.CASCADE) 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) manual = models.BooleanField(default=False)
def as_dict(self): def as_dict(self):

21
doccano/app/server/serializers.py

@ -3,13 +3,6 @@ from rest_framework import serializers
from .models import Label, Project, Document, Annotation 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 LabelSerializer(serializers.ModelSerializer):
class Meta: class Meta:
@ -26,9 +19,17 @@ class AnnotationSerializer(serializers.ModelSerializer):
class DocumentSerializer(serializers.ModelSerializer): class DocumentSerializer(serializers.ModelSerializer):
project = ProjectSerializer()
annotations = AnnotationSerializer(many=True)
labels = AnnotationSerializer(many=True)
class Meta: class Meta:
model = Document 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')

4
doccano/app/server/static/annotation.js

@ -164,9 +164,9 @@ var vm = new Vue({
computed: { computed: {
achievement: function () { achievement: function () {
if (this.total == 0) { if (this.total == 0) {
return 0;
return 0
} else { } else {
return (this.total - this.remaining) / this.total * 100
return Math.round((this.total - this.remaining) / this.total * 100)
} }
}, },
progressColor: function () { progressColor: function () {

53
doccano/app/server/views.py

@ -1,6 +1,6 @@
import json import json
import django_filters
from django_filters.rest_framework import DjangoFilterBackend
from django.http import JsonResponse, HttpResponse from django.http import JsonResponse, HttpResponse
from django.shortcuts import render from django.shortcuts import render
from django.views import View 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.views.generic.detail import DetailView
from django.core.paginator import Paginator from django.core.paginator import Paginator
from rest_framework import viewsets, filters 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 .models import Annotation, Label, Document, Project
from .serializers import LabelSerializer, ProjectSerializer, DocumentSerializer from .serializers import LabelSerializer, ProjectSerializer, DocumentSerializer
@ -200,17 +203,53 @@ class DataDownloadAPI(View):
return response return response
class LabelViewSet(viewsets.ModelViewSet):
queryset = Label.objects.all()
serializer_class = LabelSerializer
filter_fields = ('text', 'project')
class ProjectViewSet(viewsets.ModelViewSet): class ProjectViewSet(viewsets.ModelViewSet):
queryset = Project.objects.all() queryset = Project.objects.all()
serializer_class = ProjectSerializer 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): class DocumentViewSet(viewsets.ModelViewSet):
queryset = Document.objects.all() queryset = Document.objects.all()
serializer_class = DocumentSerializer 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',)
Loading…
Cancel
Save