From 85e36328f7bd5033efaa92c3b040769eb2eee181 Mon Sep 17 00:00:00 2001 From: Gertjan van den Burg Date: Fri, 13 Sep 2019 15:27:37 +0100 Subject: Assign new tasks on the fly The old logic assigned a task when the user finished the demo, logged in, or finished an annotation. This was not optimal as it could lead to race conditions where some datasets were annotated unnecessarily. With this change we select the dataset to annotate at the exact moment the user wants to do another one. --- app/main/demo.py | 8 -------- app/main/routes.py | 37 ++++++++++++++++++++++++++----------- 2 files changed, 26 insertions(+), 19 deletions(-) (limited to 'app/main') diff --git a/app/main/demo.py b/app/main/demo.py index bc9e7bd..3be8258 100644 --- a/app/main/demo.py +++ b/app/main/demo.py @@ -23,7 +23,6 @@ from app.main import bp from app.main.forms import NextForm from app.main.routes import RUBRIC from app.utils.datasets import load_data_for_chart, get_demo_true_cps -from app.utils.tasks import generate_user_task LOGGER = logging.getLogger(__name__) @@ -381,13 +380,6 @@ def redirect_user(demo_id, phase_id): current_user.is_introduced = True db.session.commit() - # assign a task to the user - task = generate_user_task(current_user) - if task is None: - return redirect(url_for("main.index")) - db.session.add(task) - db.session.commit() - return redirect(url_for("main.index")) elif phase_id == demo_last_phase_id: demo_id += 1 diff --git a/app/main/routes.py b/app/main/routes.py index 13fe3f8..8a0e83e 100644 --- a/app/main/routes.py +++ b/app/main/routes.py @@ -46,6 +46,32 @@ def index(): return render_template("index.html", title="Home") +@bp.route("/assign") +@login_required +def assign(): + # Intermediate page that assigns a task to a user if needed and then + # redirects to /annotate/task.id + user_tasks = Task.query.filter_by(annotator_id=current_user.id).all() + user_tasks = [t for t in user_tasks if not t.dataset.is_demo] + user_tasks = [t for t in user_tasks if not t.done] + + # if the user has, for some reason, a unfinished assigned task, redirect to + # that + if len(user_tasks) > 0: + task = user_tasks[0] + return redirect(url_for("main.annotate", task_id=task.id)) + + task = generate_user_task(current_user) + if task is None: + flash( + "There are no more datasets to annotate at the moment, thanks for all your help!", + "info", + ) + return redirect(url_for("main.index")) + db.session.add(task) + db.session.commit() + return redirect(url_for("main.annotate", task_id=task.id)) + @bp.route("/annotate/", methods=("GET", "POST")) @login_required def annotate(task_id): @@ -94,17 +120,6 @@ def annotate(task_id): "annotations_raw": annotation, } send_annotation_backup(record) - - # assign a new task if necessary - task = generate_user_task(current_user) - if task is None: - return url_for("main.index") - db.session.add(task) - db.session.commit() - flash( - "A new dataset has been assigned for you to annotate. Thanks for your help!", - "info", - ) return url_for("main.index") task = Task.query.filter_by(id=task_id).first() -- cgit v1.2.3