Browse Source

Merge branch 'develop_server' of https://github.com/chakki-works/doccano into develop_server

# Conflicts:
#	app/db.sqlite3
pull/10/head
Hironsan 6 years ago
parent
commit
7668c31671
43 changed files with 144 additions and 70 deletions
  1. 20
      Pipfile
  2. 1
      Procfile
  3. 0
      app/app/__init__.py
  4. 0
      app/app/settings.py
  5. 0
      app/app/urls.py
  6. 0
      app/app/wsgi.py
  7. 0
      app/classifier/__init__.py
  8. 0
      app/classifier/model.py
  9. 0
      app/classifier/preprocess.py
  10. 6
      app/classifier/task.py
  11. 0
      app/classifier/utils.py
  12. BIN
      app/db.sqlite3
  13. 0
      app/manage.py
  14. 0
      app/server/__init__.py
  15. 11
      app/server/admin.py
  16. 0
      app/server/apps.py
  17. 0
      app/server/data/test.jsonl
  18. 0
      app/server/migrations/__init__.py
  19. 67
      app/server/models.py
  20. 0
      app/server/package-lock.json
  21. 0
      app/server/package.json
  22. 0
      app/server/serializers.py
  23. 0
      app/server/static/annotation.js
  24. 0
      app/server/static/forum.css
  25. 0
      app/server/static/images/cat.png
  26. 0
      app/server/static/images/logo.png
  27. 0
      app/server/static/inbox.css
  28. 0
      app/server/static/main.js
  29. 0
      app/server/static/project_admin.js
  30. 0
      app/server/templates/annotation.html
  31. 0
      app/server/templates/base.html
  32. 0
      app/server/templates/index.html
  33. 0
      app/server/templates/login.html
  34. 0
      app/server/templates/project_admin.html
  35. 0
      app/server/templates/projects.html
  36. 37
      app/server/tests.py
  37. 0
      app/server/urls.py
  38. 9
      app/server/views.py
  39. 0
      app/server/webpack.config.js
  40. 8
      doccano/app/server/admin.py
  41. 53
      doccano/app/server/models.py
  42. 0
      doccano/classifier/__init__.py
  43. 2
      tests/test_classifier.py

20
Pipfile

@ -0,0 +1,20 @@
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[requires]
python_version = "3.6"
[packages]
"psycopg2-binary" = "*"
django-heroku = "*"
gunicorn = "*"
[dev-packages]

1
Procfile

@ -0,0 +1 @@
web: gunicorn app.app.wsgi

doccano/__init__.py → app/app/__init__.py

doccano/app/app/settings.py → app/app/settings.py

doccano/app/app/urls.py → app/app/urls.py

doccano/app/app/wsgi.py → app/app/wsgi.py

doccano/app/app/__init__.py → app/classifier/__init__.py

doccano/classifier/model.py → app/classifier/model.py

doccano/classifier/preprocess.py → app/classifier/preprocess.py

doccano/classifier/task.py → app/classifier/task.py

@ -3,9 +3,9 @@ Task runner.
"""
import numpy as np
from doccano.classifier.model import build_model
from doccano.classifier.preprocess import build_vectorizer
from doccano.classifier.utils import load_dataset, save_dataset, make_output, train_test_split
from doccano.app.classifier.model import build_model
from doccano.app.classifier import build_vectorizer
from doccano.app.classifier import load_dataset, save_dataset, make_output, train_test_split
def run(filename):

doccano/classifier/utils.py → app/classifier/utils.py

BIN
doccano/app/db.sqlite3 → app/db.sqlite3

doccano/app/manage.py → app/manage.py

doccano/app/server/__init__.py → app/server/__init__.py

11
app/server/admin.py

@ -0,0 +1,11 @@
from django.contrib import admin
from .models import Label, Document, Project
from .models import DocumentAnnotation, SequenceAnnotation, Seq2seqAnnotation
admin.site.register(DocumentAnnotation)
admin.site.register(SequenceAnnotation)
admin.site.register(Seq2seqAnnotation)
admin.site.register(Label)
admin.site.register(Document)
admin.site.register(Project)

doccano/app/server/apps.py → app/server/apps.py

doccano/app/server/data/test.jsonl → app/server/data/test.jsonl

doccano/app/server/migrations/__init__.py → app/server/migrations/__init__.py

67
app/server/models.py

@ -0,0 +1,67 @@
from django.db import models
from django.contrib.auth.models import User
class Project(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
users = models.ManyToManyField(User)
def __str__(self):
return self.name
class Label(models.Model):
# choices: shortcut
# add color
text = models.CharField(max_length=100, unique=True)
shortcut = models.CharField(max_length=10, unique=True)
project = models.ForeignKey(Project, related_name='labels', on_delete=models.CASCADE)
def __str__(self):
return self.text
class Document(models.Model):
text = models.TextField()
project = models.ForeignKey(Project, related_name='documents', on_delete=models.CASCADE)
def __str__(self):
return self.text[:50]
class Annotation(models.Model):
prob = models.FloatField(default=0.0)
manual = models.BooleanField(default=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
abstract = True
class DocumentAnnotation(Annotation):
document = models.ForeignKey(Document, related_name='doc_annotations', on_delete=models.CASCADE)
label = models.ForeignKey(Label, on_delete=models.CASCADE)
class Meta:
unique_together = ('document', 'user', 'label')
class SequenceAnnotation(Annotation):
document = models.ForeignKey(Document, related_name='seq_annotations', on_delete=models.CASCADE)
label = models.ForeignKey(Label, on_delete=models.CASCADE)
start_offset = models.IntegerField()
end_offset = models.IntegerField()
class Meta:
unique_together = ('document', 'user', 'label', 'start_offset', 'end_offset')
class Seq2seqAnnotation(Annotation):
document = models.ForeignKey(Document, related_name='seq2seq_annotations', on_delete=models.CASCADE)
text = models.TextField()
class Meta:
unique_together = ('document', 'user', 'text')

doccano/app/server/package-lock.json → app/server/package-lock.json

doccano/app/server/package.json → app/server/package.json

doccano/app/server/serializers.py → app/server/serializers.py

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

doccano/app/server/static/forum.css → app/server/static/forum.css

doccano/app/server/static/images/cat.png → app/server/static/images/cat.png

doccano/app/server/static/images/logo.png → app/server/static/images/logo.png

doccano/app/server/static/inbox.css → app/server/static/inbox.css

doccano/app/server/static/main.js → app/server/static/main.js

doccano/app/server/static/project_admin.js → app/server/static/project_admin.js

doccano/app/server/templates/annotation.html → app/server/templates/annotation.html

doccano/app/server/templates/base.html → app/server/templates/base.html

doccano/app/server/templates/index.html → app/server/templates/index.html

doccano/app/server/templates/login.html → app/server/templates/login.html

doccano/app/server/templates/project_admin.html → app/server/templates/project_admin.html

doccano/app/server/templates/projects.html → app/server/templates/projects.html

doccano/app/server/tests.py → app/server/tests.py

@ -1,9 +1,12 @@
import os
from unittest.mock import MagicMock
from django.test import TestCase, Client
from django.urls import reverse
from django.db.utils import IntegrityError
from .models import Project, Document, Label
from .models import Project, Document, Label, User
from .models import DocumentAnnotation, SequenceAnnotation, Seq2seqAnnotation
class ProjectModelTest(TestCase):
@ -81,3 +84,35 @@ class TestLabelAPI(TestCase):
res = client.delete(reverse('label_api', args=[1]),
data={"id": label_id})
self.assertEqual(Label.objects.count(), 0)
class TestAnnotationModel(TestCase):
def setUp(self):
project = Project(name='project', description='description')
project.save()
self.user = User(username='hoge', email='hoge@example.com')
self.user.save()
self.doc = Document(text='document', project=project)
self.doc.save()
self.label = Label(text='label', shortcut='k', project=project)
self.label.save()
def test_save(self):
self.assertEqual(DocumentAnnotation.objects.count(), 0)
doc_ano = DocumentAnnotation(document=self.doc, user=self.user, label=self.label)
doc_ano.save()
self.assertEqual(DocumentAnnotation.objects.count(), 1)
self.assertEqual(doc_ano.document, self.doc)
self.assertEqual(doc_ano.user, self.user)
self.assertEqual(doc_ano.label, self.label)
def test_uniquness(self):
annotation1 = DocumentAnnotation(document=self.doc, user=self.user, label=self.label)
annotation1.save()
annotation2 = DocumentAnnotation(document=self.doc, user=self.user, label=self.label)
with self.assertRaises(IntegrityError):
annotation2.save()

doccano/app/server/urls.py → app/server/urls.py

doccano/app/server/views.py → app/server/views.py

@ -14,7 +14,8 @@ from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAdminUser
from .models import Annotation, Label, Document, Project
from .models import Label, Document, Project
from .models import DocumentAnnotation
from .serializers import LabelSerializer, ProjectSerializer, DocumentSerializer, AnnotationSerializer
@ -123,7 +124,7 @@ class ProjectDocsAPI(generics.ListCreateAPIView):
class AnnotationsAPI(generics.ListCreateAPIView):
queryset = Annotation.objects.all()
queryset = DocumentAnnotation.objects.all()
serializer_class = AnnotationSerializer
pagination_class = None
@ -137,7 +138,7 @@ class AnnotationsAPI(generics.ListCreateAPIView):
label_id = request.data['label_id']
doc = Document.objects.get(id=doc_id)
label = Label.objects.get(id=label_id)
annotation = Annotation(data=doc, label=label, manual=True)
annotation = DocumentAnnotation(data=doc, label=label, manual=True)
annotation.save()
serializer = self.serializer_class(annotation)
@ -145,7 +146,7 @@ class AnnotationsAPI(generics.ListCreateAPIView):
class AnnotationAPI(generics.RetrieveUpdateDestroyAPIView):
queryset = Annotation.objects.all()
queryset = DocumentAnnotation.objects.all()
serializer_class = AnnotationSerializer
def get_queryset(self):

doccano/app/server/webpack.config.js → app/server/webpack.config.js

8
doccano/app/server/admin.py

@ -1,8 +0,0 @@
from django.contrib import admin
from .models import Annotation, Label, Document, Project
admin.site.register(Annotation)
admin.site.register(Label)
admin.site.register(Document)
admin.site.register(Project)

53
doccano/app/server/models.py

@ -1,53 +0,0 @@
from django.db import models
from django.contrib.auth.models import User
class Project(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
users = models.ManyToManyField(User)
def __str__(self):
return self.name
class Label(models.Model):
text = models.CharField(max_length=100, unique=True)
shortcut = models.CharField(max_length=10, unique=True)
project = models.ForeignKey(Project, related_name='labels', on_delete=models.CASCADE)
def as_dict(self):
return {'id': self.id,
'text': self.text,
'shortcut': self.shortcut}
def __str__(self):
return self.text
class Document(models.Model):
text = models.TextField()
project = models.ForeignKey(Project, related_name='documents', on_delete=models.CASCADE)
def as_dict(self):
return {'id': self.id,
'text': self.text}
def __str__(self):
return self.text[:50]
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='labels', on_delete=models.CASCADE)
manual = models.BooleanField(default=False)
def as_dict(self):
return {'id': self.id,
'doc': self.data.as_dict(),
'label': self.label.as_dict(),
'prob': self.prob,
'manual': self.manual}

0
doccano/classifier/__init__.py

2
tests/test_classifier.py

@ -1,7 +1,7 @@
import os
import unittest
from doccano.classifier.task import run
from doccano.app.classifier import run
class TestClassifier(unittest.TestCase):

Loading…
Cancel
Save