From 29dbdc9f949c6ab6b226df68976484e5473353a3 Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Thu, 3 Dec 2020 15:13:24 +0100
Subject: [PATCH] Add URL property to some models

---
 web/app/models.py | 51 ++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 46 insertions(+), 5 deletions(-)

diff --git a/web/app/models.py b/web/app/models.py
index 4ca7095f..1fde6add 100644
--- a/web/app/models.py
+++ b/web/app/models.py
@@ -1,5 +1,5 @@
 from datetime import datetime
-from flask import current_app
+from flask import current_app, url_for
 from flask_login import UserMixin, AnonymousUserMixin
 from itsdangerous import BadSignature, TimedJSONWebSignatureSerializer
 from time import sleep
@@ -281,10 +281,20 @@ class JobInput(db.Model):
     # Fields
     filename = db.Column(db.String(255))
 
+    @property
+    def download_url(self):
+        return url_for('job.download_job_input', job_id=self.job_id,
+                       job_input_id=self.id)
+
     @property
     def path(self):
         return os.path.join(self.job.path, self.filename)
 
+    @property
+    def url(self):
+        return url_for('jobs.job', job_id=self.job_id,
+                       _anchor='job-{}-input-{}'.format(self.job_id, self.id))
+
     def __repr__(self):
         '''
         String representation of the JobInput. For human readability.
@@ -292,7 +302,9 @@ class JobInput(db.Model):
         return '<JobInput {}>'.format(self.filename)
 
     def to_dict(self):
-        return {'id': self.id,
+        return {'download_url': self.download_url,
+                'url': self.url,
+                'id': self.id,
                 'job_id': self.job_id,
                 'filename': self.filename}
 
@@ -309,10 +321,20 @@ class JobResult(db.Model):
     # Fields
     filename = db.Column(db.String(255))
 
+    @property
+    def download_url(self):
+        return url_for('job.download_job_result', job_id=self.job_id,
+                       job_result_id=self.id)
+
     @property
     def path(self):
         return os.path.join(self.job.path, 'output', self.filename)
 
+    @property
+    def url(self):
+        return url_for('jobs.job', job_id=self.job_id,
+                       _anchor='job-{}-result-{}'.format(self.job_id, self.id))
+
     def __repr__(self):
         '''
         String representation of the JobResult. For human readability.
@@ -320,7 +342,9 @@ class JobResult(db.Model):
         return '<JobResult {}>'.format(self.filename)
 
     def to_dict(self):
-        return {'id': self.id,
+        return {'download_url': self.download_url,
+                'url': self.url,
+                'id': self.id,
                 'job_id': self.job_id,
                 'filename': self.filename}
 
@@ -359,6 +383,10 @@ class Job(db.Model):
     def path(self):
         return os.path.join(self.creator.path, 'jobs', str(self.id))
 
+    @property
+    def path(self):
+        return url_for('job.job', job_id=self.id)
+
     def __repr__(self):
         '''
         String representation of the Job. For human readability.
@@ -395,7 +423,8 @@ class Job(db.Model):
         self.status = 'submitted'
 
     def to_dict(self):
-        return {'id': self.id,
+        return {'url': self.url,
+                'id': self.id,
                 'user_id': self.user_id,
                 'creation_date': self.creation_date.timestamp(),
                 'description': self.description,
@@ -435,10 +464,20 @@ class CorpusFile(db.Model):
     school = db.Column(db.String(255))
     title = db.Column(db.String(255))
 
+    @property
+    def download_url(self):
+        return url_for('corpora.download_corpus_file',
+                       corpus_id=self.corpus_id, corpus_file_id=self.id)
+
     @property
     def path(self):
         return os.path.join(self.corpus.path, self.filename)
 
+    @property
+    def url(self):
+        return url_for('corpora.corpus_file', corpus_id=self.corpus_id,
+                       corpus_file_id=self.id)
+
     def delete(self):
         try:
             os.remove(self.path)
@@ -449,7 +488,9 @@ class CorpusFile(db.Model):
         self.corpus.status = 'unprepared'
 
     def to_dict(self):
-        return {'id': self.id,
+        return {'download_url': self.download_url,
+                'url': self.url,
+                'id': self.id,
                 'corpus_id': self.corpus_id,
                 'address': self.address,
                 'author': self.author,
-- 
GitLab