From 799101d3808f96462fcfbd01e3bc076ee43709b5 Mon Sep 17 00:00:00 2001 From: Patrick Jentsch <p.jentsch@uni-bielefeld.de> Date: Mon, 4 Nov 2019 09:03:31 +0100 Subject: [PATCH] Move /jobs related code in dedicated package. --- app/__init__.py | 3 ++ app/jobs/__init__.py | 6 +++ app/jobs/views.py | 61 +++++++++++++++++++++ app/main/views.py | 66 ++--------------------- app/templates/{main => }/jobs/job.html.j2 | 4 +- 5 files changed, 75 insertions(+), 65 deletions(-) create mode 100644 app/jobs/__init__.py create mode 100644 app/jobs/views.py rename app/templates/{main => }/jobs/job.html.j2 (98%) diff --git a/app/__init__.py b/app/__init__.py index b77e6a1b..c08a4cf3 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -32,6 +32,9 @@ def create_app(config_name): from .corpora import corpora as corpora_blueprint app.register_blueprint(corpora_blueprint, url_prefix='/corpora') + from .jobs import jobs as jobs_blueprint + app.register_blueprint(jobs_blueprint, url_prefix='/jobs') + from .main import main as main_blueprint app.register_blueprint(main_blueprint) diff --git a/app/jobs/__init__.py b/app/jobs/__init__.py new file mode 100644 index 00000000..3e73643d --- /dev/null +++ b/app/jobs/__init__.py @@ -0,0 +1,6 @@ +from flask import Blueprint + +jobs = Blueprint('jobs', __name__) + + +from . import views diff --git a/app/jobs/views.py b/app/jobs/views.py new file mode 100644 index 00000000..e713fb71 --- /dev/null +++ b/app/jobs/views.py @@ -0,0 +1,61 @@ +from app.utils import background_delete_job +from flask import (abort, current_app, flash, redirect, render_template, + send_from_directory, url_for) +from flask_login import current_user, login_required +from . import jobs +from ..models import Job, JobInput, JobResult +import os +import threading + + +@jobs.route('/<int:job_id>') +@login_required +def job(job_id): + job = Job.query.get_or_404(job_id) + if not (job.creator == current_user or current_user.is_administrator()): + abort(403) + return render_template('jobs/job.html.j2', job=job, title='Job') + + +@jobs.route('/<int:job_id>/delete') +@login_required +def delete_job(job_id): + delete_thread = threading.Thread( + target=background_delete_job, + args=(current_app._get_current_object(), job_id) + ) + delete_thread.start() + flash('Job has been deleted!') + return redirect(url_for('main.dashboard')) + + +@jobs.route('/<int:job_id>/inputs/<int:job_input_id>/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) + if not (job_input.job.creator == current_user + or current_user.is_administrator()): + abort(403) + dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], + job_input.dir) + return send_from_directory(as_attachment=True, + directory=dir, + filename=job_input.filename) + + +@jobs.route('/<int:job_id>/results/<int:job_result_id>/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) + if not (job_result.job.creator == current_user + or current_user.is_administrator()): + abort(403) + dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], + job_result.dir) + return send_from_directory(as_attachment=True, + directory=dir, + filename=job_result.filename) diff --git a/app/main/views.py b/app/main/views.py index 8631c0f7..fe8ec583 100644 --- a/app/main/views.py +++ b/app/main/views.py @@ -1,12 +1,6 @@ -from app.utils import background_delete_job -from flask import (abort, current_app, flash, redirect, render_template, - send_from_directory, url_for) -from flask_login import current_user, login_required +from flask import render_template +from flask_login import login_required from . import main -from ..corpora.forms import AddCorpusForm -from ..models import Job, JobInput, JobResult -import os -import threading @main.route('/') @@ -17,58 +11,4 @@ def index(): @main.route('/dashboard') @login_required def dashboard(): - return render_template('main/dashboard.html.j2', - add_corpus_form=AddCorpusForm(), title='Dashboard') - - -@main.route('/jobs/<int:job_id>') -@login_required -def job(job_id): - job = Job.query.get_or_404(job_id) - if not (job.creator == current_user or current_user.is_administrator()): - abort(403) - return render_template('main/jobs/job.html.j2', job=job, title='Job') - - -@main.route('/jobs/<int:job_id>/delete') -@login_required -def delete_job(job_id): - delete_thread = threading.Thread( - target=background_delete_job, - args=(current_app._get_current_object(), job_id) - ) - delete_thread.start() - flash('Job has been deleted!') - return redirect(url_for('main.dashboard')) - - -@main.route('/jobs/<int:job_id>/inputs/<int:job_input_id>/download') -@login_required -def job_input_download(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) - if not (job_input.job.creator == current_user - or current_user.is_administrator()): - abort(403) - dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], - job_input.dir) - return send_from_directory(as_attachment=True, - directory=dir, - filename=job_input.filename) - - -@main.route('/jobs/<int:job_id>/results/<int:job_result_id>/download') -@login_required -def job_result_download(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) - if not (job_result.job.creator == current_user - or current_user.is_administrator()): - abort(403) - dir = os.path.join(current_app.config['OPAQUE_STORAGE_DIRECTORY'], - job_result.dir) - return send_from_directory(as_attachment=True, - directory=dir, - filename=job_result.filename) + return render_template('main/dashboard.html.j2', title='Dashboard') diff --git a/app/templates/main/jobs/job.html.j2 b/app/templates/jobs/job.html.j2 similarity index 98% rename from app/templates/main/jobs/job.html.j2 rename to app/templates/jobs/job.html.j2 index 86257257..2c7d064a 100644 --- a/app/templates/main/jobs/job.html.j2 +++ b/app/templates/jobs/job.html.j2 @@ -123,7 +123,7 @@ All iput and output files will be permanently deleted.</p> </div> <div class="modal-footer"> - <a href="{{ url_for('main.delete_job', job_id=job.id) }}" class="modal-close waves-effect waves-green btn red"><i class="material-icons left">delete</i>Delete Job</a> + <a href="{{ url_for('jobs.delete_job', job_id=job.id) }}" class="modal-close waves-effect waves-green btn red"><i class="material-icons left">delete</i>Delete Job</a> <a href="#!" class="modal-close waves-effect waves-green btn cancel">Cancel</a> </div> </div> @@ -207,7 +207,7 @@ <tr> <td id="input-{{ input.id }}-filename">{{ input.filename }}</td> <td id="input-{{ input.id }}-download"> - <a class="waves-effect waves-light btn-small" download href="{{ url_for('main.job_input_download', job_id=job.id, job_input_id=input.id) }}"> + <a class="waves-effect waves-light btn-small" download href="{{ url_for('jobs.download_job_input', job_id=job.id, job_input_id=input.id) }}"> <i class="material-icons">file_download</i> </a> </td> -- GitLab