diff --git a/doccano/app/app/settings.py b/doccano/app/app/settings.py index 2db098c7..0f93c003 100644 --- a/doccano/app/app/settings.py +++ b/doccano/app/app/settings.py @@ -39,6 +39,8 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'server.apps.ServerConfig', 'widget_tweaks', + 'rest_framework', + 'django_filters' ] MIDDLEWARE = [ @@ -105,6 +107,16 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] +REST_FRAMEWORK = { + # Use Django's standard `django.contrib.auth` permissions, + # or allow read-only access for unauthenticated users. + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' + ], + 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', + 'PAGE_SIZE': 2, + 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) +} # Internationalization # https://docs.djangoproject.com/en/2.0/topics/i18n/ diff --git a/doccano/app/app/urls.py b/doccano/app/app/urls.py index d394ab8e..84cc3ac4 100644 --- a/doccano/app/app/urls.py +++ b/doccano/app/app/urls.py @@ -16,6 +16,7 @@ Including another URLconf from django.contrib import admin from django.urls import path, include from django.contrib.auth.views import LoginView, PasswordResetView, LogoutView +from server.urls import router urlpatterns = [ @@ -25,4 +26,7 @@ urlpatterns = [ redirect_authenticated_user=True), name='login'), path('logout/', LogoutView.as_view(), name='logout'), path('password_reset/', PasswordResetView.as_view(), name='password_reset'), + path('api-auth/', include('rest_framework.urls')), + path('api/', include(router.urls)), + ] diff --git a/doccano/app/db.sqlite3 b/doccano/app/db.sqlite3 index ff72ec3d..de5f7a58 100644 Binary files a/doccano/app/db.sqlite3 and b/doccano/app/db.sqlite3 differ diff --git a/doccano/app/server/models.py b/doccano/app/server/models.py index 113128d9..a42cfe82 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, null=True) + project = models.ForeignKey(Project, on_delete=models.CASCADE) def as_dict(self): return {'id': self.id, diff --git a/doccano/app/server/serializers.py b/doccano/app/server/serializers.py new file mode 100644 index 00000000..49fe01d3 --- /dev/null +++ b/doccano/app/server/serializers.py @@ -0,0 +1,34 @@ +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: + model = Label + fields = ('id', 'text', 'shortcut') + + +class AnnotationSerializer(serializers.ModelSerializer): + label = LabelSerializer() + + class Meta: + model = Annotation + fields = ('id', 'prob', 'label') + + +class DocumentSerializer(serializers.ModelSerializer): + project = ProjectSerializer() + annotations = AnnotationSerializer(many=True) + + class Meta: + model = Document + fields = ('id', 'text', 'project', 'annotations') diff --git a/doccano/app/server/urls.py b/doccano/app/server/urls.py index 13ab724b..6ddf6fa4 100644 --- a/doccano/app/server/urls.py +++ b/doccano/app/server/urls.py @@ -3,6 +3,16 @@ from django.urls import path from .views import IndexView from .views import AnnotationAPIView, ProgressAPI, SearchAPI, InboxView from .views import ProjectListView, ProjectAdminView, RawDataAPI, LabelAPI, DataDownloadAPI +from rest_framework import routers +from .views import LabelViewSet, ProjectViewSet, DocumentViewSet + + +router = routers.DefaultRouter() +router.register(r'labels', LabelViewSet) +router.register(r'projects', ProjectViewSet) +router.register(r'documents', DocumentViewSet) +#router.register(r'users', UserViewSet) + urlpatterns = [ path('', IndexView.as_view(), name='index'), diff --git a/doccano/app/server/views.py b/doccano/app/server/views.py index b3767c02..0abf3f29 100644 --- a/doccano/app/server/views.py +++ b/doccano/app/server/views.py @@ -1,13 +1,16 @@ import json +import django_filters from django.http import JsonResponse, HttpResponse from django.shortcuts import render from django.views import View 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 .models import Annotation, Label, Document, Project +from .serializers import LabelSerializer, ProjectSerializer, DocumentSerializer class IndexView(View): @@ -195,3 +198,19 @@ class DataDownloadAPI(View): response['Content-Disposition'] = 'attachment; filename=annotation_data.json' 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 + + +class DocumentViewSet(viewsets.ModelViewSet): + queryset = Document.objects.all() + serializer_class = DocumentSerializer