from wtforms import SubmitField, StringField, FloatField, HiddenField, validators, Form from flask_wtf import FlaskForm from flask import request, render_template, redirect from main import db, app, ma from sqlalchemy import Sequence from sqlalchemy.exc import SQLAlchemyError from status import st, Status from datetime import datetime, timedelta import pytz class Joblog(db.Model): id = db.Column(db.Integer, db.Sequence('ill_id_seq'), primary_key=True ) job_id = db.Column(db.Integer, db.ForeignKey('job.id'), primary_key=True ) log_date = db.Column(db.DateTime(timezone=True)) log = db.Column(db.String) def __repr__(self): return "".format(self.id, self.start_time, self.last_update, self.name, self.state, self.num_passes, self.current_pass, self.num_files, self.num_files, self.current_file_num, self.current_file) ################################################################################ # Utility classes for Jobs ################################################################################ def GetNumActiveJobs(): ret = db.engine.execute("select num_active_jobs from pa_job_manager").first(); if( ret != None ): return ret.num_active_jobs ############################################################################### # NewJob takes a name (which will be matched in pa_job_manager.py to run # the appropriate job - which will update the Job() until complete ############################################################################### def NewJob(name, num_passes="1", num_files="0", wait_for=None ): job=Job(start_time='now()', last_update='now()', name=name, state="New", num_passes=num_passes, num_files=num_files, current_pass=0, current_file_num=0, current_file='', wait_for=wait_for, pa_job_state="New" ) db.session.add(job) db.session.commit() ################################################################################ # /jobs -> show current settings ################################################################################ @app.route("/jobs", methods=["GET"]) def jobs(): page_title='Job actions' jobs = Job.query.all() return render_template("jobs.html", jobs=jobs, page_title=page_title) ############################################################################### # /job/ -> GET -> shows status/history of jobs ################################################################################ @app.route("/job/", methods=["GET"]) def joblog(id): page_title='Show Job Details' joblog = Job.query.get(id) logs=Joblog.query.filter(Joblog.job_id==id).all() duration=(datetime.now(pytz.utc)-joblog.start_time) duration= duration-timedelta(microseconds=duration.microseconds) return render_template("joblog.html", job=joblog, logs=logs, duration=duration, page_title=page_title) ############################################################################### # This func creates a new filter in jinja2 to format the time from the db in a # way that is more readable (converted to local tz too) ################################################################################ @app.template_filter('vicdate') def _jinja2_filter_datetime(date, fmt=None): return date.strftime("%d/%m/%Y %I:%M:%S %p")