1+ import csv
2+ import io
13import logging
24
35from braces import views
4- from django .views import generic
6+ from django .contrib import messages
57from django .db .models import Q
8+ from django .http import HttpResponseRedirect
9+ from django .urls import reverse_lazy
10+ from django .views import generic
611
12+ from hicalweb .interfaces .CAL import functions as CALFunctions
13+ from hicalweb .judgment .forms import UploadForm
714from hicalweb .judgment .models import Judgement
15+ from hicalweb .CAL .exceptions import CALError
816
917logger = logging .getLogger (__name__ )
1018
@@ -23,8 +31,96 @@ def get_context_data(self, **kwargs):
2331 Q (nonrelevant = True )
2432 ))
2533 context ["judgments" ] = judgments
26-
34+ context [ 'upload_form' ] = UploadForm ()
2735 return context
2836
37+ def post (self , request , * args , ** kwargs ):
38+ try :
39+ csv_file = request .FILES ['csv_file' ]
40+ train_model = request .POST .get ('train_model' )
41+ update_existing = request .POST .get ('update_existing' )
42+ except KeyError :
43+ messages .error (request , 'Ops! Something wrong happened. '
44+ 'Could not upload judgments.' )
45+ return HttpResponseRedirect (reverse_lazy ('archive:main' ))
46+ if not csv_file .name .endswith ('.csv' ):
47+ messages .error (request , 'Please upload a file ending with .csv extension.' )
48+ return HttpResponseRedirect (reverse_lazy ('archive:main' ))
49+
50+ train_model = train_model == "on"
51+ update_existing = update_existing == "on"
52+ try :
53+ data = csv_file .read ().decode ('UTF-8' )
54+ except UnicodeEncodeError :
55+ messages .error (request , 'Ops! Something wrong happened while encoding file.' )
56+ return HttpResponseRedirect (reverse_lazy ('archive:main' ))
57+
58+ try :
59+ io_string = io .StringIO (data )
60+ reader = csv .DictReader (io_string )
61+ except csv .Error :
62+ messages .error (request , 'Ops! Please make sure you upload a valid csv file.' )
63+ return HttpResponseRedirect (reverse_lazy ('archive:main' ))
64+
65+ new , updated , failed = 0 , 0 , 0
66+ for row in reader :
67+ try :
68+ docno , rel = row ['docno' ], row ['judgment' ].lower ()
69+ except KeyError :
70+ messages .error (request , 'Ops! Please make sure you upload a valid csv file.' )
71+ return HttpResponseRedirect (reverse_lazy ('archive:main' ))
72+ rel = 1 if rel == "relevant" else - 1 if rel == "nonrelevant" else 2
73+ # Check if docid is valid
74+ if not CALFunctions .check_docid_exists (self .request .user .current_task .uuid ,
75+ docno ):
76+ failed += 1
77+ continue
78+
79+ # check if judged
80+ judged = Judgement .objects .filter (user = self .request .user ,
81+ doc_id = docno ,
82+ task = self .request .user .current_task )
83+ if train_model :
84+ try :
85+ CALFunctions .send_judgment (self .request .user .current_task .uuid ,
86+ docno ,
87+ 1 if rel > 0 else - 1 )
88+ except (TimeoutError , CALError ):
89+ failed += 1
90+ continue
91+
92+ if judged .exists ():
93+ if update_existing :
94+ judged = judged .first ()
95+ judged_rel = 2 if judged .highlyRelevant else 1 if judged .relevant else - 1
96+ if judged_rel != rel :
97+ judged .highlyRelevant = rel == 2
98+ judged .relevant = rel == 1
99+ judged .nonrelevant = rel == - 1
100+ judged .source = "uploaded"
101+ judged .save ()
102+ updated += 1
103+ else :
104+ Judgement .objects .create (
105+ user = self .request .user ,
106+ doc_id = docno ,
107+ task = self .request .user .current_task ,
108+ highlyRelevant = rel == 2 ,
109+ relevant = rel == 1 ,
110+ nonrelevant = rel == - 1 ,
111+ source = "uploaded" ,
112+ )
113+ new += 1
114+
115+ if failed :
116+ messages .error (request , 'Ops! {} judgments were not recorded.' .format (failed ))
117+
118+ messages .success (request ,
119+ ("Added {} new judgments. " .format (new ) if new else "" ) +
120+ ("{} judgments were updated" .format (updated ) if updated else "" ),
121+ )
122+
123+ return HttpResponseRedirect (reverse_lazy ('archive:main' ))
124+
29125 def get (self , request , * args , ** kwargs ):
30126 return super (HomePageView , self ).get (self , request , * args , ** kwargs )
0 commit comments