aboutsummaryrefslogtreecommitdiff
path: root/app/admin/routes.py
blob: 7617943bf460b58ac837f01d7146174d9e4a175b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# -*- coding: utf-8 -*-

import os

from flask import render_template, flash, redirect, url_for, current_app

from werkzeug.utils import secure_filename

from app import db
from app.admin import bp
from app.admin.datasets import get_name_from_dataset, md5sum
from app.admin.decorators import admin_required
from app.admin.forms import AdminAssignTaskForm, AdminAddDatasetForm
from app.models import User, Dataset, Task


@bp.route("/assign", methods=("GET", "POST"))
@admin_required
def assign():
    user_list = [(u.id, u.username) for u in User.query.all()]
    dataset_list = [(d.id, d.name) for d in Dataset.query.all()]

    form = AdminAssignTaskForm()
    form.username.choices = user_list
    form.dataset.choices = dataset_list

    if form.validate_on_submit():
        user = User.query.filter_by(id=form.username.data).first()
        if user is None:
            flash("User does not exist.")
            return redirect(url_for("admin.assign"))
        dataset = Dataset.query.filter_by(id=form.dataset.data).first()
        if dataset is None:
            flash("Dataset does not exist.")
            return redirect(url_for("admin.assign"))

        task = Task.query.filter_by(
            annotator_id=user.id, dataset_id=dataset.id
        ).first()
        if not task is None:
            flash("Task assignment already exists.")
            return redirect(url_for("admin.assign"))

        task = Task(annotator_id=user.id, dataset_id=dataset.id)
        db.session.add(task)
        db.session.commit()
        flash("Task registered successfully.")
    tasks = Task.query.all()
    return render_template(
        "admin/assign.html", title="Assign Task", form=form, tasks=tasks
    )


@bp.route("/add", methods=("GET", "POST"))
@admin_required
def add_dataset():
    tmp_dir = os.path.join(
        current_app.instance_path, current_app.config["TEMP_DIR"]
    )
    dataset_dir = os.path.join(
        current_app.instance_path, current_app.config["DATASET_DIR"]
    )
    form = AdminAddDatasetForm()
    if form.validate_on_submit():
        temp_filename = os.path.join(
            tmp_dir, secure_filename(form.file_.data.filename)
        )
        if not os.path.exists(temp_filename):
            flash("Internal error: temporary dataset disappeared.")
            return redirect(url_for("admin.add_dataset"))
        name = get_name_from_dataset(temp_filename)
        target_filename = os.path.join(dataset_dir, name + ".json")
        if os.path.exists(target_filename):
            flash("Internal error: file already exists!")
            return redirect(url_for("admin.add_dataset"))
        os.rename(temp_filename, target_filename)
        if not os.path.exists(target_filename):
            flash("Internal error: file moving failed")
            return redirect(url_for("admin.add_dataset"))

        dataset = Dataset(name=name, md5sum=md5sum(target_filename))
        db.session.add(dataset)
        db.session.commit()
        flash("Dataset %r added successfully.", name)
        return redirect(url_for("admin.add_dataset"))
    return render_template("admin/add.html", title="Add Dataset", form=form)


@bp.route("/", methods=("GET",))
@admin_required
def index():
    return render_template("admin/index.html", title="Admin Home")