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