|
7 | 7 | from hashlib import md5
|
8 | 8 | import jwt
|
9 | 9 | import json
|
| 10 | +import redis |
| 11 | +import rq |
10 | 12 | from app.search import add_to_index, query_index, remove_from_index
|
11 | 13 |
|
12 | 14 | followers = db.Table('followers',
|
@@ -78,10 +80,23 @@ class User(SearchableMixin, UserMixin, db.Model):
|
78 | 80 | backref='recipient', lazy='dynamic')
|
79 | 81 | last_message_read_time = db.Column(db.DateTime)
|
80 | 82 | notifications = db.relationship('Notification', backref='user', lazy='dynamic')
|
| 83 | + tasks = db.relationship('Task', backref='user', lazy='dynamic') |
81 | 84 |
|
82 | 85 | def __repr__(self):
|
83 | 86 | return '<User {}>'.format(self.username)
|
84 | 87 |
|
| 88 | + def launch_task(self, name, description, *args, **kwargs): |
| 89 | + rq_job = current_app.task_queue.enqueue('app.tasks.' + name, self.id, *args, **kwargs) |
| 90 | + task = Task(id=rq_job.get_id(), name=name, description=description, user=self) |
| 91 | + db.session.add(task) |
| 92 | + return task |
| 93 | + |
| 94 | + def get_tasks_in_progress(self): |
| 95 | + return Task.query.filter_by(user=self, complete=False).all() |
| 96 | + |
| 97 | + def get_task_in_progress(self, name): |
| 98 | + return Task.query.filter_by(name=name, user=self, complete=False).first() |
| 99 | + |
85 | 100 | def add_notification(self, name, data):
|
86 | 101 | self.notifications.filter_by(name=name).delete()
|
87 | 102 | n = Notification(name=name, payload_json=json.dumps(data), user=self)
|
@@ -182,6 +197,24 @@ class Notification(db.Model):
|
182 | 197 | def get_data(self):
|
183 | 198 | return json.loads(str(self.payload_json))
|
184 | 199 |
|
| 200 | +class Task(db.Model): |
| 201 | + id = db.Column(db.String(36), primary_key=True) |
| 202 | + name = db.Column(db.String(128), index=True) |
| 203 | + description = db.Column(db.String(128)) |
| 204 | + user_id = db.Column(db.Integer, db.ForeignKey('user.id')) |
| 205 | + complete = db.Column(db.Boolean, default=False) |
| 206 | + |
| 207 | + def get_rq_job(self): |
| 208 | + rq_job = None |
| 209 | + try: |
| 210 | + rq_job = rq.job.Job.fetch(self.id, connection=current_app.redis) |
| 211 | + except expression as identifier: |
| 212 | + rq_job = None |
| 213 | + return rq_job |
| 214 | + |
| 215 | + def get_progress(self): |
| 216 | + job = get_rq_job() |
| 217 | + return job.meta.get('progress', 0) if job is not None else 100 |
185 | 218 | #
|
186 | 219 |
|
187 | 220 | db.event.listen(db.session, 'before_commit', Post.before_commit)
|
|
0 commit comments