From adb852f0e78dfbc8664417a6cd314821fefab917 Mon Sep 17 00:00:00 2001 From: Hironsan Date: Wed, 16 May 2018 15:54:55 +0900 Subject: [PATCH] Implement annotation update --- doccano/app/db.sqlite3 | Bin 163840 -> 163840 bytes doccano/app/server/static/main.js | 83 +++++++++++++++++------------- doccano/app/server/views.py | 40 ++++++++++---- 3 files changed, 78 insertions(+), 45 deletions(-) diff --git a/doccano/app/db.sqlite3 b/doccano/app/db.sqlite3 index 65767a640dde19a04d2648986153ca8a3d56c438..7681d8658b9cc3d71a8f0ab32312c0b95cdc19b1 100644 GIT binary patch delta 1263 zcmZ9MOKcle6ox(VBZ;f#I<8ohg75+%q)3S$aUK>65LH?sfhx)_id46Ct03$kCx`_L z&z*7ezzKOZnG`!BZi*e6+KyuqJ2+0aELa4wD{42#Gh?fW2q}mKEI4;2u_&9PnLFP( z=b!T*U7ok{ymjsZcWM5WcezXXYrl1Jmc{qG&U5C)+g&T1ecNf;YBLkrK>i_rkw3_D zA{W}P{X#5eBgdJ{h37}-w~ThOBsH&buUSZv#K{r@!^F-2s~+36XPcDHaYG2FrRFUL z=gA|IM)(UtOvYBu&O$p2w&Lz%?gN|AZatQo4-q{RJ@c0JxZtw=XgxPzZ#58CYX{f* zPS1z_&oBDN{8I24_p%gx%AM`-_*`C}x3|;X?{)R{4YW5{?+NP|x&CqB#+c(xuQc?O zdsR>9?(cMZo&D~f0b3)X`~L~uT0)!4=jrx&+?_p6ugB>w{`4!?_qxr}++t`uKD%bU zY(3ZVthoiH9$O;fRg1|m(E;Krh*1!E5ZC1FdToP0+MoRIA<#Goi$E7x@8& zE#KMD(OMZRX4Pm?Sxr{UyY+iB)%{uEXVlCT2n$MH0D)o_@-7e17*ZHPm{KO^K#1u> z1eyklU<`Oc$*jv*fQiiM9e|c1*g~&dOHo#nW|ai5?g$MNu7pQ$xYBDFBPEUYy|A{I?&1q@gmUhSDihO6B|sfHdlOL)@66)%6;WdjQJp7rvf^u zY?tw?x)W9R?t)mZRubyn4V+*tH7jQ$U+YFN*Myj^anLn{`f-7JUsxcwzCd1FAP+W0 zoyu~hmPF@H{L}M5Tm}(Ws{~>i7p(EywZa6h1MZ7@@ZIU*6b#U8wZy9%*+KWvpojJK zn2d%XCW81Ch~pscgHU9p#KLK#l(u3ISrjKU;BoP?wQ2t)yoA6&{w9BtBLbw3*T&DM qmr$|Z)pX%)1P%>&NBvH!SJWj130$7)Mt`*0J`871JM3={7?9A0j)d5KmArclNtc5bwE}C diff --git a/doccano/app/server/static/main.js b/doccano/app/server/static/main.js index 98459a4f..1dad29eb 100644 --- a/doccano/app/server/static/main.js +++ b/doccano/app/server/static/main.js @@ -1,50 +1,55 @@ Vue.config.debug = true; +axios.defaults.xsrfCookieName = 'csrftoken'; +axios.defaults.xsrfHeaderName = 'X-CSRFToken'; +var base_url = window.location.href.split('/').slice(3, 5).join('/'); + +function swap(values){ + var ret = {}; + for(var item of values){ + ret[item['text']] = item['id']; + } + return ret; +} var app = new Vue({ el: '#app', delimiters: ['[[', ']]'], data: { cur: 0, - items: [{ - "id": 10, - "labels": [{ - "text": "Prefecture", - "prob": 0.98 - }, { - "text": "Domestic Region", - "prob": 0.58 - }], - "text": "北海道(ほっかいどう)は、日本の北部に位置する島[※ 1][※ 2]。また、同島および付随する島を管轄する地方公共団体(道)である。島としての北海道は日本列島を構成する主要4島の一つである。地方公共団体としての北海道は47都道府県中唯一の「道」で、道庁所在地は札幌市。" - }, - { - "id": 11, - "labels": [{ - "text": "Person", - "prob": 0.98 - }], - "text": "安倍 晋三(あべ しんぞう、1954年(昭和29年)9月21日 - )は、日本の政治家。自由民主党所属の衆議院議員(9期)、第90代・第96代・第97代・第98代内閣総理大臣、第21代・第25代自由民主党総裁。" - }, - { - "id": 12, - "labels": [{ - "text": "Country", - "prob": 0.99 - }, { - "text": "Continental Region", - "prob": 0.58 - }], - "text": "アメリカ合衆国(アメリカがっしゅうこく、英語: United States of America)、通称アメリカ、米国(べいこく)は、50の州および連邦区から成る連邦共和国である[6][7]。アメリカ本土の48州およびワシントンD.C.は、カナダとメキシコの間の北アメリカ中央に位置する。アラスカ州は北アメリカ北西部の角に位置し、東ではカナダと、西ではベーリング海峡をはさんでロシアと国境を接している。ハワイ州は中部太平洋における島嶼群である。同国は、太平洋およびカリブに5つの有人の海外領土および9つの無人の海外領土を有する。985万平方キロメートル (km2) の総面積は世界第3位または第4位、3億1千7百万人の人口は世界第3位である。同国は世界で最も民族的に多様かつ多文化な国の1つであり、これは多くの国からの大規模な移住の産物とされている[8]。また同国の広大な国土における地理および気候も極めて多様であり、多種多様な野生生物が存在する。" - }, - ], + items: [], +// { +// "id": 10, +// "labels": [{ +// "text": "Prefecture", +// "prob": 0.98 +// }, { +// "text": "Domestic Region", +// "prob": 0.58 +// }], +// "text": "北海道(ほっかいどう)は、日本の北部に位置する島[※ 1][※ 2]。また、同島および付随する島を管轄する地方公共団体(道)である。島としての北海道は日本列島を構成する主要4島の一つである。地方公共団体としての北海道は47都道府県中唯一の「道」で、道庁所在地は札幌市。" +// } labels: [], guideline: '' }, methods: { addLabel: function (label) { - this.items[this.cur]['labels'].push({ + var label = { 'text': label, 'prob': null - }) + }; + this.items[this.cur]['labels'].push(label); + console.log(this.labels); + console.log(swap(this.labels)); + var label2id = swap(this.labels); + var data = {'id': this.items[this.cur]['id'], 'label_id': label2id[label['text']]}; + + axios.post('/' + base_url + '/apis/data', data) + .then(function (response) { + console.log('post data'); + }) + .catch(function (error) { + console.log('ERROR!! happend by Backend.') + }); }, deleteLabel: function (index) { this.items[this.cur]['labels'].splice(index, 1) @@ -58,15 +63,23 @@ var app = new Vue({ }, created: function () { console.log('created'); - var base_url = window.location.href.split('/').slice(3, 5).join('/'); var self = this; axios.get('/' + base_url + '/apis/label') .then(function (response) { - console.log('label request'); + console.log('request label'); self.labels = response.data['labels']; }) .catch(function (error) { console.log('ERROR!! happend by Backend.') }); + + axios.get('/' + base_url + '/apis/data') + .then(function (response) { + console.log('request data'); + self.items = response.data['data']; + }) + .catch(function (error) { + console.log('ERROR!! happend by Backend.') + }); } }) \ No newline at end of file diff --git a/doccano/app/server/views.py b/doccano/app/server/views.py index c53df847..3b30e4a9 100644 --- a/doccano/app/server/views.py +++ b/doccano/app/server/views.py @@ -1,9 +1,10 @@ -from django.core.paginator import Paginator +import json + from django.http import JsonResponse from django.shortcuts import render from django.views import View -from .models import Annotation, Label +from .models import Annotation, Label, RawData class AnnotationView(View): @@ -16,17 +17,36 @@ class AnnotationView(View): class AnnotationAPIView(View): def get(self, request, *args, **kwargs): - annotation_list = Annotation.objects.all() - paginator = Paginator(annotation_list, 5) + once_active_learned = len(Annotation.objects.all().exclude(prob=None)) > 0 + if once_active_learned: + # Use Annotation model & RawData model. + # Left outer join data and annotation. + # Filter manual=False + # Sort prob + docs = Annotation.objects.all() + else: + # Left outer join data and annotation. + docs = RawData.objects.filter(annotation__isnull=True) + docs = [{**d.as_dict(), **{'labels': []}} for d in docs] + + return JsonResponse({'data': docs}) - page = request.GET.get('page') - annotations = paginator.get_page(page) - annotations = [a.as_dict() for a in annotations] + def post(self, request, *args, **kwargs): + body = json.loads(request.body) + data_id, label_id = body.get('id'), body.get('label_id') # {id:0, label_id:1} - return JsonResponse({'annotations': annotations}) + data = RawData.objects.get(id=data_id) + label = Label.objects.get(id=label_id) + Annotation(data=data, label=label, manual=True).save() - def post(self, request, *args, **kwargs): - pass + return JsonResponse({}) + + def delete(self, request, *args, **kwargs): + body = json.loads(request.body) + data_id, label_id = body.get('id'), body.get('label_id') # {id:0, label_id:1} + Annotation.objects.get(data=data_id, label=label_id).delete() + + return JsonResponse({}) class LabelAPIView(View):