diff --git a/web/app/corpora/views.py b/web/app/corpora/views.py index 765e53d33584ba385bfe0e5b84eaf18d763cb290..3f1bb8d8bec472de7ebb9b582c1bcc50df0f5f4e 100644 --- a/web/app/corpora/views.py +++ b/web/app/corpora/views.py @@ -9,7 +9,6 @@ from .forms import (AddCorpusFileForm, AddCorpusForm, EditCorpusFileForm, from .. import db from ..models import Corpus, CorpusFile import os -from .. import logger @corpora.route('/add', methods=['GET', 'POST']) diff --git a/web/app/results/views.py b/web/app/results/views.py index 53ccd8d8afceed9e20800c1e342d036eb1854393..1ea6440782597d4e5ce9c4fbbacb5c0ec089a85a 100644 --- a/web/app/results/views.py +++ b/web/app/results/views.py @@ -6,7 +6,7 @@ from ..models import Result, ResultFile, User from .forms import ImportResultsForm from datetime import datetime from flask import (abort, render_template, current_app, request, redirect, - flash, url_for, make_response) + flash, url_for, make_response, send_from_directory) from flask_login import current_user, login_required import json import os @@ -71,9 +71,11 @@ def results_overview(): # get all results of current user results = User.query.get(current_user.id).results logger.warning(results) + def __p_time(time_str): # helper to convert the datetime into a nice readable string return datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S.%f') + # convert results into a list of dicts to add the measier to list.js in # the template results = [dict(query=r.corpus_metadata['query'], @@ -82,6 +84,7 @@ def results_overview(): corpus_creation_date=__p_time(r.corpus_metadata['corpus_creation_date']), # noqa corpus_analysis_date=__p_time(r.corpus_metadata['corpus_analysis_date']), # noqa corpus_type=r.corpus_metadata['corpus_type'], + file_id=r.file[0].id, id=r.id) for r in results] return render_template('results/results.html.j2', @@ -141,3 +144,19 @@ def result_delete(result_id): tasks.delete_result(result_id) flash('Result deleted!') return redirect(url_for('results.results_overview')) + + +@results.route('/<int:result_id>/file/<int:result_file_id>/download') +@login_required +def result_download(result_id, result_file_id): + result_file = ResultFile.query.get_or_404(result_file_id) + if not result_file.result_id == result_id: + abort(404) + if not (result_file.result.creator == current_user + or current_user.is_administrator()): + abort(403) + dir = os.path.join(current_app.config['NOPAQUE_STORAGE'], + result_file.dir) + return send_from_directory(as_attachment=True, + directory=dir, + filename=result_file.filename) diff --git a/web/app/static/js/nopaque.lists.js b/web/app/static/js/nopaque.lists.js index fdcd4bbd25a12d1cf7dae4817a6587af86766107..8c464263d884c414519d200b4ebf55e6fe655416 100644 --- a/web/app/static/js/nopaque.lists.js +++ b/web/app/static/js/nopaque.lists.js @@ -114,6 +114,7 @@ RessourceList.dataMapper = { corpus_type : result.corpus_type, "details-link": `${result.id}/details`, "inspect-link": `${result.id}/inspect`, + "download-link": `${result.id}/file/${result.file_id}/download`, "delete-modal": `delete-result-${result.id}-modal` }), // Mapping for user entities shown in admin table @@ -285,6 +286,12 @@ RessourceList.options = { data-tooltip="View Results"> <i class="material-icons">search</i> </a> + <a class="btn-floating tooltipped download-link + waves-effect waves-light" + data-position="top" + data-tooltip="Download"> + <i class="material-icons">file_download</i> + </a> <a class="btn-floating tooltipped red delete-modal waves-effect waves-light modal-trigger" data-position="top" @@ -303,6 +310,7 @@ RessourceList.options = { "corpus_type", {name: "details-link", attr: "href"}, {name: "inspect-link", attr: "href"}, + {name: "download-link", attr: "href"}, {name: "delete-modal", attr: "data-target"}] }, // User entity blueprint setting html strucuture per entity per row