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 @@
Input and result files
-
+
Filewise
@@ -85,10 +85,9 @@
Filename |
Download |
- Result |
-
+
{% for input in job.inputs %}
{{ input.filename }} |
@@ -97,7 +96,6 @@
file_download
- |
{% endfor %}
@@ -106,7 +104,7 @@
-
+
@@ -166,7 +131,6 @@
Filename |
Download |
- Results |
@@ -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(`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(" ");
+ resultsElement = document.getElementById("results");
+
+ 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 ###