mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-11-03 20:02:47 +00:00 
			
		
		
		
	Change directory structure (move ./nopaque/* to ./)
This commit is contained in:
		
							
								
								
									
										5
									
								
								app/jobs/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								app/jobs/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
from flask import Blueprint
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
jobs = Blueprint('jobs', __name__)
 | 
			
		||||
from . import views
 | 
			
		||||
							
								
								
									
										36
									
								
								app/jobs/tasks.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								app/jobs/tasks.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
from .. import db, socketio
 | 
			
		||||
from ..decorators import background
 | 
			
		||||
from ..models import Job
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@background
 | 
			
		||||
def delete_job(job_id, *args, **kwargs):
 | 
			
		||||
    with kwargs['app'].app_context():
 | 
			
		||||
        job = Job.query.get(job_id)
 | 
			
		||||
        if job is None:
 | 
			
		||||
            raise Exception('Job {} not found'.format(job_id))
 | 
			
		||||
        event = 'user_{}_patch'.format(job.user_id)
 | 
			
		||||
        jsonpatch = [{'op': 'remove', 'path': '/jobs/{}'.format(job.id)}]
 | 
			
		||||
        room = 'user_{}'.format(job.user_id)
 | 
			
		||||
        job.delete()
 | 
			
		||||
        db.session.commit()
 | 
			
		||||
        socketio.emit(event, jsonpatch, room=room)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@background
 | 
			
		||||
def restart_job(job_id, *args, **kwargs):
 | 
			
		||||
    with kwargs['app'].app_context():
 | 
			
		||||
        job = Job.query.get(job_id)
 | 
			
		||||
        if job is None:
 | 
			
		||||
            raise Exception('Job {} not found'.format(job_id))
 | 
			
		||||
        try:
 | 
			
		||||
            job.restart()
 | 
			
		||||
        except Exception:
 | 
			
		||||
            pass
 | 
			
		||||
        else:
 | 
			
		||||
            db.session.commit()
 | 
			
		||||
            event = 'user_{}_patch'.format(job.user_id)
 | 
			
		||||
            jsonpatch = [{'op': 'replace', 'path': '/jobs/{}/end_date'.format(job.id), 'value': job.end_date.timestamp()},  # noqa
 | 
			
		||||
                         {'op': 'replace', 'path': '/jobs/{}/status'.format(job.id), 'value': job.status}]  # noqa
 | 
			
		||||
            room = 'user_{}'.format(job.user_id)
 | 
			
		||||
            socketio.emit(event, jsonpatch, room=room)
 | 
			
		||||
							
								
								
									
										67
									
								
								app/jobs/views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								app/jobs/views.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
from flask import (abort, flash, redirect, render_template,
 | 
			
		||||
                   send_from_directory, url_for)
 | 
			
		||||
from flask_login import current_user, login_required
 | 
			
		||||
from . import jobs
 | 
			
		||||
from . import tasks
 | 
			
		||||
from ..decorators import admin_required
 | 
			
		||||
from ..models import Job, JobInput, JobResult
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@jobs.route('/<int:job_id>')
 | 
			
		||||
@login_required
 | 
			
		||||
def job(job_id):
 | 
			
		||||
    job = Job.query.get_or_404(job_id)
 | 
			
		||||
    if not (job.creator == current_user or current_user.is_administrator()):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    job_inputs = [job_input.to_dict() for job_input in job.inputs]
 | 
			
		||||
    return render_template('jobs/job.html.j2', job=job, job_inputs=job_inputs,
 | 
			
		||||
                           title='Job')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@jobs.route('/<int:job_id>/delete')
 | 
			
		||||
@login_required
 | 
			
		||||
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)
 | 
			
		||||
    tasks.delete_job(job_id)
 | 
			
		||||
    flash('Job has been marked for deletion!', 'job')
 | 
			
		||||
    return redirect(url_for('main.dashboard'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@jobs.route('/<int:job_id>/inputs/<int:job_input_id>/download')
 | 
			
		||||
@login_required
 | 
			
		||||
def download_job_input(job_id, job_input_id):
 | 
			
		||||
    job_input = JobInput.query.filter(JobInput.job_id == job_id, JobInput.id == job_input_id).first_or_404()  # noqa
 | 
			
		||||
    if not (job_input.job.creator == current_user
 | 
			
		||||
            or current_user.is_administrator()):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    return send_from_directory(as_attachment=True,
 | 
			
		||||
                               directory=os.path.dirname(job_input.path),
 | 
			
		||||
                               filename=job_input.filename)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@jobs.route('/<int:job_id>/restart')
 | 
			
		||||
@login_required
 | 
			
		||||
@admin_required
 | 
			
		||||
def restart(job_id):
 | 
			
		||||
    job = Job.query.get_or_404(job_id)
 | 
			
		||||
    if job.status not in ['complete', 'failed']:
 | 
			
		||||
        flash('Can not restart job "{}": Status is not "complete/failed"'.format(job.title), 'error')  # noqa
 | 
			
		||||
    else:
 | 
			
		||||
        tasks.restart_job(job_id)
 | 
			
		||||
        flash('Job "{}" has been marked to get restarted!'.format(job.title), 'job')  # noqa
 | 
			
		||||
    return redirect(url_for('.job', job_id=job_id))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@jobs.route('/<int:job_id>/results/<int:job_result_id>/download')
 | 
			
		||||
@login_required
 | 
			
		||||
def download_job_result(job_id, job_result_id):
 | 
			
		||||
    job_result = JobResult.query.filter(JobResult.job_id == job_id, JobResult.id == job_result_id).first_or_404()  # noqa
 | 
			
		||||
    if not (job_result.job.creator == current_user
 | 
			
		||||
            or current_user.is_administrator()):
 | 
			
		||||
        abort(403)
 | 
			
		||||
    return send_from_directory(as_attachment=True,
 | 
			
		||||
                               directory=os.path.dirname(job_result.path),
 | 
			
		||||
                               filename=job_result.filename)
 | 
			
		||||
		Reference in New Issue
	
	Block a user