Create and use a decorator for background functions

This commit is contained in:
Patrick Jentsch
2020-04-21 18:34:21 +02:00
parent 79c9ca97b2
commit bc27744946
12 changed files with 131 additions and 133 deletions

View File

@ -1,9 +0,0 @@
from ..models import Job
def delete_job_(app, job_id):
with app.app_context():
job = Job.query.get(job_id)
if job is None:
raise Exception('Job {} not found!'.format(job_id))
job.delete()

28
app/jobs/tasks.py Normal file
View File

@ -0,0 +1,28 @@
from time import sleep
from .. import db
from ..decorators import background
from ..models import Job
import os
import shutil
@background
def delete_job(app, job_id):
with app.app_context():
job = Job.query.get(job_id)
if job is None:
return
if job.status not in ['complete', 'failed']:
job.status = 'canceling'
db.session.commit()
while job.status != 'canceled':
# In case the daemon handled a job in any way
if job.status != 'canceling':
job.status = 'canceling'
db.session.commit()
sleep(1)
db.session.refresh(job)
path = os.path.join(app.config['NOPAQUE_STORAGE'], str(job.user_id),
'jobs', str(job.id))
shutil.rmtree(path, ignore_errors=True)
job.delete()

View File

@ -1,9 +1,8 @@
from flask import (abort, current_app, flash, redirect, render_template,
send_from_directory, url_for)
from flask_login import current_user, login_required
from threading import Thread
from . import jobs
from .background_functions import delete_job_
from . import tasks
from ..models import Job, JobInput, JobResult
import os
@ -23,9 +22,7 @@ def delete_job(job_id):
job = Job.query.get_or_404(job_id)
if not (job.creator == current_user or current_user.is_administrator()):
abort(403)
thread = Thread(target=delete_job_,
args=(current_app._get_current_object(), job_id))
thread.start()
tasks.delete_job(job_id)
flash('Job has been deleted!')
return redirect(url_for('main.dashboard'))