aboutsummaryrefslogtreecommitdiff
path: root/app/admin/routes.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/admin/routes.py')
-rw-r--r--app/admin/routes.py51
1 files changed, 49 insertions, 2 deletions
diff --git a/app/admin/routes.py b/app/admin/routes.py
index 0736549..518b3fc 100644
--- a/app/admin/routes.py
+++ b/app/admin/routes.py
@@ -1,8 +1,18 @@
# -*- coding: utf-8 -*-
+import clevercsv
+import io
import os
-
-from flask import render_template, flash, redirect, url_for, current_app
+import datetime
+
+from flask import (
+ current_app,
+ flash,
+ redirect,
+ render_template,
+ send_file,
+ url_for,
+)
from werkzeug.utils import secure_filename
@@ -254,6 +264,43 @@ def view_annotations():
)
+@bp.route("/annotations/download", methods=("GET",))
+@admin_required
+def download_annotations_csv():
+ annotations = (
+ Annotation.query.join(Task, Annotation.task)
+ .join(User, Task.user)
+ .join(Dataset, Task.dataset)
+ .order_by(Dataset.id, User.username, Annotation.cp_index)
+ .all()
+ )
+
+ # based on: https://stackoverflow.com/a/45111660/1154005
+ header = ["DatasetID", "DatasetName", "UserID", "AnnotationIndex"]
+
+ proxy = io.StringIO()
+ writer = clevercsv.writer(proxy)
+ writer.writerow(header)
+ for ann in annotations:
+ row = [ann.task.dataset.id, ann.task.dataset.name, ann.task.user.id]
+ if ann.cp_index is None:
+ row.append("no_cp")
+ else:
+ row.append(ann.cp_index)
+ writer.writerow(row)
+
+ mem = io.BytesIO()
+ mem.write(proxy.getvalue().encode("utf-8"))
+ mem.seek(0)
+ proxy.close()
+
+ fname = "%i_annotations.csv" % (round(datetime.datetime.now().timestamp()))
+
+ return send_file(
+ mem, as_attachment=True, attachment_filename=fname, mimetype="text/csv"
+ )
+
+
@bp.route("/annotations_by_dataset/<int:dset_id>", methods=("GET",))
@admin_required
def view_annotations_by_dataset(dset_id):