mirror of
https://github.com/blw1138/Zordon.git
synced 2025-12-17 08:48:13 +00:00
78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
import hashlib
|
|
import json
|
|
import logging
|
|
import os
|
|
import uuid
|
|
from datetime import datetime
|
|
|
|
from utilities.render_worker import RenderStatus, RenderWorkerFactory
|
|
|
|
logger = logging.getLogger()
|
|
|
|
|
|
class RenderJob:
|
|
|
|
def __init__(self, renderer, input_path, output_path, args, priority=2, owner=None, client=None, notify=None, custom_id=None):
|
|
self.id = custom_id or self.generate_id()
|
|
self.owner = owner
|
|
self.priority = priority
|
|
self.client = client
|
|
self.notify = notify
|
|
self.date_created = datetime.now()
|
|
self.scheduled_start = None
|
|
self.renderer = renderer
|
|
self.name = os.path.basename(input_path) + '_' + self.date_created.isoformat()
|
|
self.archived = False
|
|
|
|
self.worker = RenderWorkerFactory.create_worker(renderer, input_path, output_path, args)
|
|
self.worker.log_path = os.path.join(os.path.dirname(input_path), os.path.basename(input_path) + '.log')
|
|
|
|
def render_status(self):
|
|
"""Returns status of render job"""
|
|
try:
|
|
if self.scheduled_start and self.worker.status == RenderStatus.NOT_STARTED:
|
|
return RenderStatus.SCHEDULED
|
|
else:
|
|
return self.worker.status
|
|
except Exception as e:
|
|
logger.warning("render_status error: {}".format(e))
|
|
return RenderStatus.ERROR
|
|
|
|
def file_hash(self):
|
|
return hashlib.md5(open(self.worker.input_path, 'rb').read()).hexdigest()
|
|
|
|
def json(self):
|
|
"""Converts RenderJob into JSON format"""
|
|
import numbers
|
|
|
|
def date_serializer(o):
|
|
if isinstance(o, datetime):
|
|
return o.isoformat()
|
|
|
|
json_string = ''
|
|
|
|
try:
|
|
d = self.__dict__.copy()
|
|
d['status'] = self.render_status().value
|
|
d['file_hash'] = self.file_hash if isinstance(self.file_hash, str) else self.file_hash()
|
|
d['worker'] = self.worker.__dict__.copy()
|
|
for key in ['thread', 'process']: # remove unwanted keys from JSON
|
|
d['worker'].pop(key, None)
|
|
d['worker']['status'] = d['status']
|
|
|
|
# jobs from current_session generate percent completed
|
|
# jobs after loading server pull in a saved value. Have to check if callable object or not
|
|
|
|
percent_complete = self.worker.percent_complete if isinstance(self.worker.percent_complete, numbers.Number) \
|
|
else self.worker.percent_complete()
|
|
d['worker']['percent_complete'] = percent_complete
|
|
|
|
json_string = json.dumps(d, default=date_serializer)
|
|
except Exception as e:
|
|
logger.exception(e)
|
|
logger.error("Error converting to JSON: {}".format(e))
|
|
return json_string
|
|
|
|
@classmethod
|
|
def generate_id(cls):
|
|
return str(uuid.uuid4()).split('-')[0] |