Convert render_queue and scheduledjob to use sql instead of json

This commit is contained in:
Brett Williams
2023-05-24 09:58:02 -05:00
parent dd2ae2d71a
commit e11c5e7e58
4 changed files with 76 additions and 152 deletions

View File

@@ -3,7 +3,6 @@ import hashlib
import json
import logging
import os
import threading
import uuid
from datetime import datetime
@@ -20,10 +19,17 @@ class ScheduledJob(Base):
__tablename__ = 'scheduled_jobs'
id = Column(String, primary_key=True)
# Get file hash on bg thread
def __get_file_hash(self):
if os.path.exists(self.worker.input_path):
self.file_hash = hashlib.md5(open(self.worker.input_path, 'rb').read()).hexdigest()
renderer = Column(String)
input_path = Column(String)
output_path = Column(String)
priority = Column(Integer)
owner = Column(String)
client = Column(String)
notify = Column(String)
date_created = Column(DateTime)
scheduled_start = Column(DateTime)
name = Column(String)
file_hash = Column(String)
def __init__(self, renderer, input_path, output_path, args, priority=2, owner=None, client=None, notify=None,
custom_id=None, name=None):
@@ -45,18 +51,23 @@ class ScheduledJob(Base):
self.worker_object.validate()
self.file_hash = None
threading.Thread(target=self.__get_file_hash).start() # get file hash on bg thread
if not self.file_hash and os.path.exists(input_path):
self.file_hash = hashlib.md5(open(input_path, 'rb').read()).hexdigest()
def worker(self):
if hasattr(self, 'worker_object'):
return self.worker_object
else:
return {}
def render_status(self):
if self.scheduled_start and self.worker.status == RenderStatus.NOT_STARTED:
return RenderStatus.SCHEDULED
else:
return self.worker.status
def file_hash(self):
if os.path.exists(self.worker.input_path):
return hashlib.md5(open(self.worker.input_path, 'rb').read()).hexdigest()
return None
try:
if self.scheduled_start and self.worker().status == RenderStatus.NOT_STARTED:
return RenderStatus.SCHEDULED
else:
return self.worker().status
except:
return RenderStatus.CANCELLED
def json(self):
"""Converts RenderJob into JSON-friendly dict"""
@@ -94,44 +105,15 @@ class ScheduledJob(Base):
return job_dict
def start(self):
self.worker.start()
if hasattr(self, 'worker'):
self.worker().start()
def stop(self):
self.worker.stop()
def time_elapsed(self):
from string import Template
class DeltaTemplate(Template):
delimiter = "%"
def strfdelta(tdelta, fmt='%H:%M:%S'):
d = {"D": tdelta.days}
hours, rem = divmod(tdelta.seconds, 3600)
minutes, seconds = divmod(rem, 60)
d["H"] = '{:02d}'.format(hours)
d["M"] = '{:02d}'.format(minutes)
d["S"] = '{:02d}'.format(seconds)
t = DeltaTemplate(fmt)
return t.substitute(**d)
# calculate elapsed time
elapsed_time = None
start_time = self.worker.start_time
end_time = self.worker.end_time
if start_time:
if end_time:
elapsed_time = end_time - start_time
elif self.render_status() == RenderStatus.RUNNING:
elapsed_time = datetime.now() - start_time
elapsed_time_string = strfdelta(elapsed_time) if elapsed_time else "Unknown"
return elapsed_time_string
if hasattr(self, 'worker'):
self.worker().stop()
def frame_count(self):
return self.worker.total_frames
return self.worker().total_frames
def work_path(self):
return os.path.dirname(self.output_path)
@@ -144,7 +126,10 @@ class ScheduledJob(Base):
return os.path.join(os.path.dirname(self.input_path), self.name + '.log')
def percent_complete(self):
return self.worker.percent_complete()
try:
return self.worker().percent_complete()
except:
return -1
@classmethod
def generate_id(cls):