from app.decorators import admin_required from app.models import Job, JobInput, JobResult, JobStatus from flask import ( abort, flash, redirect, render_template, send_from_directory, url_for ) from flask_login import current_user, login_required from . import bp from . import tasks import os @bp.route('/') @login_required def job(job_id): job = Job.query.get_or_404(job_id) if not (job.user == current_user or current_user.is_administrator()): abort(403) return render_template( 'jobs/job.html.j2', job=job, title='Job' ) @bp.route('//delete') @login_required def delete_job(job_id): job = Job.query.get_or_404(job_id) if not (job.user == current_user or current_user.is_administrator()): abort(403) tasks.delete_job(job_id) flash(f'Job "{job.title}" marked for deletion', 'job') return redirect(url_for('main.dashboard')) @bp.route('//inputs//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() if not ( job_input.job.user == current_user or current_user.is_administrator() ): abort(403) return send_from_directory( as_attachment=True, attachment_filename=job_input.filename, directory=os.path.dirname(job_input.path), filename=os.path.basename(job_input.path) ) @bp.route('//log') @login_required @admin_required def job_log(job_id): job = Job.query.get_or_404(job_id) if job.status not in [JobStatus.COMPLETED, JobStatus.FAILED]: flash( f'Can\'t restart job "{job.title}": Status is not "Completed/Failed"', # noqa category='error' ) return send_from_directory( attachment_filename=f'job_{job.hashid}_log.txt', directory=os.path.join(job.path, 'pipeline_data'), filename=os.path.join('logs', 'pyflow_log.txt') ) @bp.route('//restart') @login_required @admin_required def restart(job_id): job = Job.query.get_or_404(job_id) if job.status not in [JobStatus.COMPLETED, JobStatus.FAILED]: flash( f'Can\'t restart job "{job.title}": Status is not "Completed/Failed"', # noqa category='error' ) else: tasks.restart_job(job_id) flash(f'Job "{job.title}" marked to get restarted', category='job') return redirect(url_for('.job', job_id=job_id)) @bp.route('//results//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() if not ( job_result.job.user == current_user or current_user.is_administrator() ): abort(403) return send_from_directory( as_attachment=True, attachment_filename=job_result.filename, directory=os.path.dirname(job_result.path), filename=os.path.basename(job_result.path) )