From 6e20e00c4e1e06cf651a196ccc084e65a40f549b Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Thu, 30 Jan 2020 11:01:17 +0100
Subject: [PATCH] Change models

---
 app/models.py                        | 10 +--
 app/templates/jobs/job.html.j2       | 94 ++++++++++------------------
 migrations/versions/6227310c2112_.py | 30 +++++++++
 3 files changed, 64 insertions(+), 70 deletions(-)
 create mode 100644 migrations/versions/6227310c2112_.py

diff --git a/app/models.py b/app/models.py
index 5c6966dd..5aeb8f17 100644
--- a/app/models.py
+++ b/app/models.py
@@ -246,9 +246,6 @@ class JobInput(db.Model):
     filename = db.Column(db.String(255))
     dir = db.Column(db.String(255))
     job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'))
-    # Relationships
-    results = db.relationship('JobResult', backref='job_input', lazy='dynamic',
-                              cascade='save-update, merge, delete')
 
     def __repr__(self):
         """
@@ -260,8 +257,7 @@ class JobInput(db.Model):
         return {'id': self.id,
                 'dir': self.dir,
                 'filename': self.filename,
-                'job_id': self.job_id,
-                'results': [result.to_dict() for result in self.results]}
+                'job_id': self.job_id}
 
 
 class JobResult(db.Model):
@@ -274,7 +270,6 @@ class JobResult(db.Model):
     filename = db.Column(db.String(255))
     dir = db.Column(db.String(255))
     job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'))
-    job_input_id = db.Column(db.Integer, db.ForeignKey('job_inputs.id'))
 
     def __repr__(self):
         """
@@ -286,8 +281,7 @@ class JobResult(db.Model):
         return {'id': self.id,
                 'dir': self.dir,
                 'filename': self.filename,
-                'job_id': self.job_id,
-                'job_input_id': self.job_input_id}
+                'job_id': self.job_id}
 
 
 class Job(db.Model):
diff --git a/app/templates/jobs/job.html.j2 b/app/templates/jobs/job.html.j2
index c1f881b7..d6931dc4 100644
--- a/app/templates/jobs/job.html.j2
+++ b/app/templates/jobs/job.html.j2
@@ -76,7 +76,7 @@
   <h4>Input and result files</h4>
 </div>
 
-<div class="col s12 m8">
+<div class="col s12 m7">
   <div class="card">
     <div class="card-content">
       <span class="card-title">Filewise</span>
@@ -85,10 +85,9 @@
           <tr>
             <th>Filename</th>
             <th>Download</th>
-            <th>Result</th>
           </tr>
         </thead>
-        <tbody>
+        <tbody id="inputs">
           {% for input in job.inputs %}
           <tr>
             <td id="input-{{ input.id }}-filename">{{ input.filename }}</td>
@@ -97,7 +96,6 @@
                 <i class="material-icons">file_download</i>
               </a>
             </td>
-            <td id="input-{{ input.id }}-results"></td>
           </tr>
           {% endfor %}
         </tbody>
@@ -106,7 +104,7 @@
   </div>
 </div>
 
-<div class="col s12 m4">
+<div class="col s12 m5">
   <div class="card">
     <div class="card-content">
       <span class="card-title">Bundled</span>
@@ -117,40 +115,7 @@
             <th>Download</th>
           </tr>
         </thead>
-        <tbody>
-          <tr>
-            <td>AIO-Bundle</td>
-            <td>
-              <a class="waves-effect waves-light btn-small" download href="">
-                <i class="material-icons">file_download</i>
-              </a>
-            </td>
-          </tr>
-          <tr>
-            <td>PDF-Bundle</td>
-            <td>
-              <a class="waves-effect waves-light btn" download href="">
-                <i class="material-icons">file_download</i>
-              </a>
-            </td>
-          </tr>
-          <tr>
-            <td>TXT-Bundle</td>
-            <td>
-              <a class="waves-effect waves-light btn" download href="">
-                <i class="material-icons">file_download</i>
-              </a>
-            </td>
-          </tr>
-          <tr>
-            <td>XML-Bundle</td>
-            <td>
-              <a class="waves-effect waves-light btn" download href="">
-                <i class="material-icons">file_download</i>
-              </a>
-            </td>
-          </tr>
-        </tbody>
+        <tbody id="results"></tbody>
       </table>
     </div>
   </div>
@@ -166,7 +131,6 @@
           <tr>
             <th>Filename</th>
             <th>Download</th>
-            <th>Results</th>
           </tr>
         </thead>
         <tbody>
@@ -228,12 +192,8 @@
       this.setStatus(job.status);
       // End date
       if (job.end_date) {this.setEndDate(job.end_date);}
-      // Input results
-      for (let input of job.inputs) {
-        for (let result of input.results) {
-          this.setResult(result);
-        }
-      }
+      // Results
+      if (job.results) {this.setResults(job.results);}
     }
 
     _update(patch) {
@@ -245,7 +205,7 @@
         if (pathArray[0] != this.jobId) {continue;}
         switch(operation.op) {
           case "add":
-            if (pathArray[1] === "inputs" && pathArray[3] === "results") {
+            if (pathArray[1] === "results") {
               this.setResult(operation.value);
             }
             break;
@@ -277,22 +237,32 @@
       M.updateTextFields();
     }
 
-    setResult(result) {
-      let resultsElement, resultDownloadButtonElement,
-          resultDownloadButtonIconElement;
+    setResults(results) {
+      let resultElement, resultsElement, resultDownloadElement,
+          resultDownloadButtonElement, resultDownloadButtonIconElement,
+          resultTitleElement;
+
+      resultsElement = document.getElementById("results");
 
-      resultsElement = document.getElementById(`input-${result.job_input_id}-results`);
-      resultDownloadButtonElement = document.createElement("a");
-      resultDownloadButtonElement.classList.add("waves-effect", "waves-light", "btn-small");
-      resultDownloadButtonElement.href = `/jobs/${this.jobId}/results/${result.id}/download`;
-      resultDownloadButtonElement.innerText = result.filename.split(".").reverse()[0];
-      resultDownloadButtonElement.setAttribute("download", "");
-      resultDownloadButtonIconElement = document.createElement("i");
-      resultDownloadButtonIconElement.classList.add("material-icons", "left");
-      resultDownloadButtonIconElement.innerText = "file_download";
-      resultDownloadButtonElement.prepend(resultDownloadButtonIconElement);
-      resultsElement.append(resultDownloadButtonElement);
-      resultsElement.append(" ");
+      for (let result of results) {
+        resultElement = document.createElement("tr");
+        resultTitleElement = document.createElement("td");
+        resultTitleElement.innerText = result.filename;
+        resultElement.append(resultTitleElement);
+        resultDownloadElement = document.createElement("td");
+        resultDownloadButtonElement = document.createElement("a");
+        resultDownloadButtonElement.classList.add("waves-effect", "waves-light",
+                                                  "btn-small");
+        resultDownloadButtonElement.href = `/jobs/${result.job_id}/results/${result.id}/download`;
+        resultDownloadButtonElement.setAttribute("download", "");
+        resultDownloadButtonIconElement = document.createElement("i");
+        resultDownloadButtonIconElement.classList.add("material-icons");
+        resultDownloadButtonIconElement.innerText = "file_download";
+        resultDownloadButtonElement.append(resultDownloadButtonIconElement);
+        resultDownloadElement.append(resultDownloadButtonElement)
+        resultElement.append(resultDownloadElement);
+        resultsElement.append(resultElement);
+      }
     }
 
     setStatus(status) {
diff --git a/migrations/versions/6227310c2112_.py b/migrations/versions/6227310c2112_.py
new file mode 100644
index 00000000..f4307c2e
--- /dev/null
+++ b/migrations/versions/6227310c2112_.py
@@ -0,0 +1,30 @@
+"""empty message
+
+Revision ID: 6227310c2112
+Revises: ded5a37f8a7b
+Create Date: 2020-01-30 09:28:06.770159
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '6227310c2112'
+down_revision = 'ded5a37f8a7b'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_constraint('job_results_job_input_id_fkey', 'job_results', type_='foreignkey')
+    op.drop_column('job_results', 'job_input_id')
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('job_results', sa.Column('job_input_id', sa.INTEGER(), autoincrement=False, nullable=True))
+    op.create_foreign_key('job_results_job_input_id_fkey', 'job_results', 'job_inputs', ['job_input_id'], ['id'])
+    # ### end Alembic commands ###
-- 
GitLab