Ejemplo n.º 1
0
    def get(self, owner_id, assignment_name):
        headers = {'Content-Type': 'text/html'}
        args = parser.parse_args()
        owner = User.objects(id=owner_id).first()
        user_id = session['user_id']
        user = User.objects(id=user_id).first()

        assignment = Assignment.objects(name=assignment_name)  \
            .filter(owner=owner).first()

        # Allow re-submission
        #if assignment.statuses[str(user_id)]:
        #    return redirect("/annotator")

        assignment.owner_name = assignment.owner.name
        assignment.ds_name = assignment.dataset.name
        assignment.ds_owner_id = str(assignment.dataset.owner.id)

        queries = Query.objects(assignment=assignment,
                                creator=user,
                                submitted=False)
        return make_response(
            render_template("assignment.html",
                            user=user,
                            assignment=assignment,
                            queries=queries), 200, headers)
Ejemplo n.º 2
0
    def post(self):
        headers = {'Content-Type': 'application/json'}
        args = parser.parse_args()
        name = args['name']
        ranker = args['ranker']
        params = args['params']
        dataset = args['dataset']
        deadline = args['deadline']
        doc_scores = args['doc_scores']
        num_results = args['num_results']

        assignment = Assignment()
        assignment.name = name
        assignment.owner = User.objects(id=session['user_id']).first()
        assignment.ranker = ranker
        assignment.params = params
        assignment.dataset = Dataset.objects(id=dataset).first()
        assignment.annotators = User.objects()
        assignment.statuses = {
            str(anno.id): False
            for anno in assignment.annotators
        }
        assignment.deadline = deadline
        assignment.num_results = num_results
        assignment.save()

        return str(assignment.id)
Ejemplo n.º 3
0
    def get(self):
        user = User.objects(id=session['user_id']).first()

        my_datasets = Dataset.objects(owner=user)
        public_datasets = Dataset.objects(privacy='public', owner__ne=user)
        authorized_datasets = Dataset.objects(privacy='private', collaborators__in=[user])

        classes = [class_.name for class_ in Class.objects(owner=user)]
        assignments = list(map(self._collect_assignment_data, Assignment.objects(owner=user)))  

        return make_response(render_template(
                "instructor.html", 
                data={
                    "user" : json.dumps(user.to_json()),
                    "my_datasets" : my_datasets,
                    "public_datasets" : public_datasets,
                    "authorized_datasets" : authorized_datasets,
                    "classes" : classes,
                    "assignments" : assignments
                },
                logged_in=('user_id' in session)
            ), 
            200, 
            {'Content-Type': 'text/html'}
        )
Ejemplo n.º 4
0
    def get(self):
        headers = {'Content-Type': 'text/html'}

        user_id = session['user_id'];
        user = User.objects(id=user_id).first()

        assignments = Assignment.objects()

        for assignment in assignments:
            assignment['owner_name'] = assignment.owner.name
            assignment['owner_id'] = str(assignment.owner.id)
            assignment['ds_name'] = assignment.dataset.name
            assignment['complete'] = assignment.statuses.get(str(user_id), False)

        return make_response(
            render_template(
                "annotator.html",
                data={
                    "assignments" : assignments,
                    "user" : user
                }, 
                logged_in=('user_id' in session)
            ),
            200, 
            headers
        )
Ejemplo n.º 5
0
    def _get_or_init_owner_path(self):
        owner = User.objects(id=session["user_id"]).first()
        owner_path = cfg["anno_dataset_base_path"] + str(owner.gitlab_id)

        if not os.path.exists(owner_path):
            os.mkdir(owner_path)

        return owner_path
Ejemplo n.º 6
0
    def post(self):
        args = parser.parse_args()

        class_ = Class()
        class_.owner = User.objects(id=session['user_id']).first()
        class_.name = args['name']
        #class_.password = args['password']
        class_.save()

        return make_response(jsonify({"message": "Success"}), 200)
Ejemplo n.º 7
0
def authorized():
    token = gitlab.authorize_access_token()
    session['gitlab_token'] = token

    resp = requests.get('https://lab.textdata.org/api/v4/user?access_token=' +
                        token['access_token'])

    resp = resp.json()
    if 'id' in resp:
        user = User.objects(gitlab_id=resp['id']).first()
        if not user:
            user = User(gitlab_id=resp['id'],
                        name=resp['name'],
                        email=resp['email'])
            user.save()

        session['user_id'] = str(user.id)

        return redirect('/')
    else:
        return redirect('/logout')
Ejemplo n.º 8
0
 def query_nsa_filter(assignment):
     queries_need_to_show_new = []
     for q in assignment.queries_need_to_show:
         all_annotations_of_the_query = Annotation.objects(query=q)
         annotations = []
         for annotation in all_annotations_of_the_query:
             if annotation.assignment.name == assignment.name and annotation.assignment.instructor == assignment.instructor:
                 annotations.append(annotation)
         students = {}
         student_list = []
         documents = {}
         for annotation in annotations:
             if annotation.annotator.id not in students.keys():
                 students[annotation.annotator.id] = len(students)
                 student_list.append(annotation.annotator.id)
             if annotation.doc.id not in documents.keys():
                 documents[annotation.doc.id] = len(documents)
         students_annotations_res = np.zeros(
             (len(documents), len(students)), dtype=int)
         credibility_scores = np.zeros(len(students))
         for annotation in annotations:
             score = 1 if annotation.judgement else -1
             students_annotations_res[documents[annotation.doc.id]][
                 students[annotation.annotator.id]] = score
         for studentID, pos in students.items():
             credibility_scores[pos] = User.objects(
                 id=studentID).first().credibility_score
         res = OutputDecision.Decision(students_annotations_res,
                                       credibility_scores)
         if res.completed:
             for i in range(len(student_list)):
                 userobj = User.objects(id=student_list[i]).first()
                 old_credibility_score = userobj.credibility_score
                 new_credibility_score = old_credibility_score + (
                     res.new_credibility_scores[i] -
                     old_credibility_score) / 3
                 userobj.update(credibility_score=new_credibility_score)
         else:
             queries_need_to_show_new.append(q)
     assignment.update(queries_need_to_show=queries_need_to_show_new)
Ejemplo n.º 9
0
	def post(self, owner_id, ds_name):
		args = parser.parse_args()
		query = args['query']
		ranker = args['ranker']
		num_results = args['num_results']
		params = args['params']

		owner = User.objects(id=owner_id).first()

		path = cfg["anno_dataset_base_path"] + str(owner.gitlab_id)
		searcher = Searcher(ds_name, path)
		documents = jsonify(searcher.search(query, ranker, params, num_results))
		return make_response(documents)
Ejemplo n.º 10
0
    def get(self):
        check_role('instructor')
        datasets = [(d.name, d.author.name) for d in DataSet.objects()]
        instructor = User.objects(email=current_user.email).first()

        assignments = {}
        for assignment in Assignment.objects(instructor=instructor):
            assignments[(assignment.name, assignment.instructor.name)] = (
                self.get_judgement_score(assignment))

        return make_response(
            render_template('instructor.html',
                            datasets=datasets,
                            assignments=assignments))
Ejemplo n.º 11
0
 def post(self):
     headers = {'Content-Type': 'application/json'}
     args = parser.parse_args()
     content = args['content']
     dataset = args['dataset']
     creator = args['creator']
     dataset = Dataset.objects(id=dataset)
     creator = User.objects(id=creator)
     query = Query()
     query.content = content
     query.data_set = dataset[0]
     query.creator = creator[0]
     query.submitted = False
     query.save()
     return make_response(jsonify("succeed"), 200, headers)
Ejemplo n.º 12
0
 def store_annotations(annotations, assignment_id):
     assignment = Assignment.objects(id=assignment_id).first()
     for query_id in annotations:
         query = Query.objects(id=query_id).first()
         for doc_id in annotations[query_id]:
             result = annotations[query_id][doc_id]
             judgement = False
             if result == 'T':
                 judgement = True
             doc = Document.objects(id=doc_id).first()
             user = User.objects(email=current_user.email).first()
             try:
                 Annotation(user, query, doc, judgement, assignment).save()
             except (NotUniqueError, ValidationError):
                 return False
     AnnotatorAPI.query_nsa_filter(assignment)
     return True
Ejemplo n.º 13
0
 def search(assignment, dataset_name, queries, ranker, params, num_results):
     author = User.objects(email=current_user.email).first()
     path = os.path.join(current_app.root_path, 'data', author.name)
     searcher = Searcher(dataset_name, path)
     for query in queries:
         results = searcher.search(query, ranker, params,
                                   num_results)['results']
         for result in results:
             doc_path = str(
                 os.path.join(path, result['path'].encode('utf8')[2:]))
             doc_score = result['score']
             document = Document.objects(path=doc_path).first()
             q = Query.objects(content=query).first()
             Score(result=doc_score,
                   assignment=assignment,
                   query=q,
                   document=document).save()
Ejemplo n.º 14
0
    def get(self, instructor_name, assignment_name):
        # TODO: annotation view
        check_role('annotator')
        instructor = User.objects(name=instructor_name).first()
        assignment = Assignment.objects(name=assignment_name,
                                        instructor=instructor).first()
        if not assignment:
            flash('No Such Assignment!')
            return redirect(url_for('annotatorapi'))
        queries = {}
        assignment_score = Score.objects(assignment=assignment)
        for q in assignment.queries_need_to_show:
            scores = assignment_score.filter(query=q)
            queries[q] = [score.document for score in scores]

        return make_response(
            render_template('assignment.html',
                            assignment=assignment,
                            queries=queries))
Ejemplo n.º 15
0
    def post(self):
        headers = {'Content-Type': 'application/json'}
        args = parser.parse_args()
        assignment_id = args['assignment_id']
        assignment = Assignment.objects(id=assignment_id).first()

        annotations = args['annotations']
        user_id = session['user_id']

        # Allow re-submission
        #if assignment.statuses[str(user_id)]:
        #    return make_response(jsonify("Failed: Already submitted assignment"), 200)

        annotator = User.objects(id=user_id).first()

        for query_content in annotations:
            query = Query.objects(assignment=assignment,
                                  content=query_content).first()
            apq = annotations[query_content]

            for file_name in apq:
                label = apq[file_name]

                dataset = assignment.dataset

                document = Document.objects(dataset=dataset) \
                            .filter(name=file_name).first()

                a = Annotation()
                a.annotator = annotator
                a.document = document
                a.judgement = label
                a.query = query
                a.save()

            Query.objects(id=query.id).update(submitted=True)

        # student has completed the assignment
        cstatus = assignment.statuses
        cstatus[str(user_id)] = True
        Assignment.objects(id=assignment_id).update(statuses=cstatus)

        return make_response(jsonify("succeed"), 200, headers)
Ejemplo n.º 16
0
    def post(self):
        args = parser.parse_args()

        query_content = args['query']
        assignment_id = args['assignment_id']
        user_id = args['user_id']
        doc_scores = args['doc_scores']

        assignment = Assignment.objects(id=assignment_id).first()
        creator = User.objects(id=user_id).first()

        query = Query()
        query.content = query_content
        query.assignment = assignment
        query.doc_scores = doc_scores
        query.creator = creator
        query.submitted = False
        query.save()

        return "OK"
Ejemplo n.º 17
0
    def post(self):
        check_role('instructor')
        args = parser.parse_args()
        queries = [q for q in args['query[]'] if q != '']
        if not queries:
            flash('Empty Query!')
            return redirect(url_for('instructorapi'))

        ranker = args['ranker']
        assignment_name = args['assignment_name']
        dataset_name = args['ds_name']
        params = self.generate_params_dict(ranker, args['param[]'])
        num_results = args['num_results']

        instructor = User.objects(email=current_user.email).first()
        dataset = DataSet.objects(name=dataset_name).first()
        assignment = Assignment(name=assignment_name,
                                instructor=instructor,
                                data_set=dataset,
                                ranker=ranker,
                                params=params,
                                num_results=num_results)
        try:
            assignment.save()
        except (NotUniqueError, ValidationError):
            flash('Invalid Input!')
            return redirect(url_for('instructorapi'))

        q = self.generate_queries(queries)
        assignment.update(queries=q)
        assignment.update(queries_need_to_show=q)
        try:
            self.search(assignment, dataset_name, queries, ranker, params,
                        num_results)
        except Exception as e:
            print(e)

        flash('Assignment Created!')
        return redirect(url_for('instructorapi'))
Ejemplo n.º 18
0
    def post(self):
        args = parser.parse_args()
        ds_name = args['ds_name']
        ds_privacy = args['ds_privacy']

        uploaded_files = request.files.getlist("file")

        is_zipfile = \
                len(uploaded_files) == 1 and \
                uploaded_files[0].filename[-4:] == ".zip"

        if is_zipfile:
            zipfile = uploaded_files[0]

        if not is_zipfile:
            err = self._validate_files(uploaded_files)
            if err:
                return make_response(jsonify(err), 200)

        owner = User.objects(id=session["user_id"]).first()
        owner_path = self._get_or_init_owner_path()
        err, ds_path = self._get_or_init_ds_path(owner_path, ds_name)

        if err:
            return make_response(jsonify(err), 200)

        self._save_dataset_files(uploaded_files, ds_path, is_zipfile)
        self._save_dataset_configs(ds_path)
        dataset = self._save_dataset_entry(ds_name, owner, ds_privacy)

        for fname in os.listdir(ds_path):
            document = Document()
            document.name = fname
            document.dataset = dataset
            document.save()

        return make_response(
            jsonify({"message": "Files have been successfully uploaded"}), 200)
Ejemplo n.º 19
0
 def get(self):
     return make_response(
         render_template(
             'upload_file.html',
             author=User.objects(id=session["user_id"]).first()), 200,
         {'Content-Type': 'text/html'})
Ejemplo n.º 20
0
    def post(self):
        check_role('instructor')
        args = parser.parse_args()
        ds_name = args['ds_name']
        author = User.objects(email=current_user.email).first()
        author_dir = os.path.join(current_app.root_path, 'data', author.name)
        ds_dir = os.path.join(author_dir, ds_name)

        if args['_method'] == 'DELETE':
            dataset = DataSet.objects(author=author, name=ds_name).first()
            shutil.rmtree(ds_dir)
            for doc in Document.objects(data_set=dataset):
                doc.delete()
            dataset.delete()
            if not DataSet.objects(author=author).first():
                shutil.rmtree(author_dir)
            flash('Dataset deleted.')
            return redirect(url_for('instructorapi'))
        else:
            # check file format
            files = request.files.getlist('file')
            for f in files:
                if not f or not allowed_file(f.filename):
                    flash('Wrong file format.')
                    return redirect(url_for('uploadapi'))
            # create dataset object
            dataset = DataSet(author, ds_name)
            try:
                dataset.save()
            except NotUniqueError:
                flash('Dataset name is occupied.')
                return redirect(url_for('uploadapi'))
            # save documents
            if not os.path.exists(author_dir):
                os.mkdir(author_dir)
            os.mkdir(ds_dir)
            for f in files:
                filename = secure_filename(f.filename)
                f_path = os.path.join(ds_dir, filename)
                f.save(f_path)
                doc = Document(f.filename, dataset, f_path)
                doc.save()
            # create config files - copied from guoqiao's gift
            if len(os.listdir(ds_dir)) != 0:
                file_corpus = open(ds_dir + "/dataset-full-corpus.txt", "w")
                file_toml = open(ds_dir + "/file.toml", "w")
                file_metadata = open(ds_dir + "/metadata.data", "w")

                for file in os.listdir(ds_dir):
                    if file[-3:] == "txt" and file != "dataset-full-corpus.txt":
                        file_corpus.write("[None] " + file + "\n")
                        file_metadata.write(file + " " + file[:-4] + "\n")

                file_toml.write("type = \"file-corpus\"" + "\n")
                file_toml.write("list = \"dataset\"")

                file_corpus.close()
                file_toml.close()
                file_metadata.close()

            flash('Dataset uploaded.')
            return redirect(url_for('instructorapi'))