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('/')
+@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('//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('//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)
+ 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('//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)
+ 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/')
-@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//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//inputs//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//results//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.
@@ -207,7 +207,7 @@
{{ input.filename }} |
-
+
file_download
|