From 4c92fdfb6caa2ec6a1755c21fad0cecc9698f58c Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Wed, 2 Dec 2020 14:26:17 +0100 Subject: [PATCH] Fix file path management and download bugs --- web/app/corpora/views.py | 8 ++++---- web/app/jobs/views.py | 13 +++++-------- web/app/models.py | 5 +++-- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/web/app/corpora/views.py b/web/app/corpora/views.py index 95f8681d..3bf1d7e6 100644 --- a/web/app/corpora/views.py +++ b/web/app/corpora/views.py @@ -234,7 +234,7 @@ def download_corpus_file(corpus_id, corpus_file_id): or current_user.is_administrator()): abort(403) return send_from_directory(as_attachment=True, - directory=corpus_file.corpus.path, + directory=os.path.dirname(corpus_file.path), filename=corpus_file.filename) @@ -382,8 +382,7 @@ def inspect_query_result(query_result_id): inspect_display_options_form = InspectDisplayOptionsForm( prefix='inspect-display-options-form' ) - query_result_file_path = os.path.join(query_result.path, query_result.filename) # noqa - with open(query_result_file_path, 'r') as query_result_file: + with open(query_result.path, 'r') as query_result_file: query_result_file_content = json.load(query_result_file) return render_template('corpora/query_results/inspect.html.j2', query_result=query_result, @@ -413,5 +412,6 @@ def download_query_result(query_result_id): if not (query_result.creator == current_user or current_user.is_administrator()): abort(403) - return send_from_directory(as_attachment=True, directory=query_result.path, + return send_from_directory(as_attachment=True, + directory=os.path.dirname(query_result.path), filename=query_result.filename) diff --git a/web/app/jobs/views.py b/web/app/jobs/views.py index 739f153c..ffb5df15 100644 --- a/web/app/jobs/views.py +++ b/web/app/jobs/views.py @@ -5,6 +5,7 @@ from . import jobs from . import tasks from ..decorators import admin_required from ..models import Job, JobInput, JobResult +import os @jobs.route('/') @@ -32,14 +33,12 @@ def delete_job(job_id): @jobs.route('//inputs//download') @login_required def download_job_input(job_id, job_input_id): - job_input = JobInput.query.get_or_404(job_input_id) - if not job_input.job_id == job_id: - abort(404) + job_input = JobInput.query.filter(JobInput.job_id == job_id, JobInput.id == job_input_id).first_or_404() # noqa if not (job_input.job.creator == current_user or current_user.is_administrator()): abort(403) return send_from_directory(as_attachment=True, - directory=job_input.job.path, + directory=os.path.dirname(job_input.path), filename=job_input.filename) @@ -59,12 +58,10 @@ def restart(job_id): @jobs.route('//results//download') @login_required def download_job_result(job_id, job_result_id): - job_result = JobResult.query.get_or_404(job_result_id) - if not job_result.job_id == job_id: - abort(404) + job_result = JobResult.query.filter(JobResult.job_id == job_id, JobResult.id == job_result_id).first_or_404() # noqa if not (job_result.job.creator == current_user or current_user.is_administrator()): abort(403) return send_from_directory(as_attachment=True, - directory=job_result.job.path, + directory=os.path.dirname(job_result.path), filename=job_result.filename) diff --git a/web/app/models.py b/web/app/models.py index 4dd9dba9..4ca7095f 100644 --- a/web/app/models.py +++ b/web/app/models.py @@ -311,7 +311,7 @@ class JobResult(db.Model): @property def path(self): - return os.path.join(self.job.path, self.filename) + return os.path.join(self.job.path, 'output', self.filename) def __repr__(self): ''' @@ -561,7 +561,8 @@ class QueryResult(db.Model): @property def path(self): - return os.path.join(self.creator.path, 'query_results', str(self.id)) + return os.path.join( + self.creator.path, 'query_results', str(self.id), self.filename) def delete(self): shutil.rmtree(self.path, ignore_errors=True)