import json import logging import os import uuid from datetime import datetime from utilities.render_worker import RenderStatus logger = logging.getLogger() class RenderJob: def __init__(self, render, priority=2, owner=None, client=None, notify=None, custom_id=None): self.id = custom_id or self.generate_id() self.owner = owner self.render = render self.priority = priority self.client = client self.notify = notify self.date_created = datetime.now() self.scheduled_start = None self.renderer = render.renderer self.name = os.path.basename(render.input_path) + '_' + self.date_created.isoformat() self.archived = False def render_status(self): """Returns status of render job""" try: if self.scheduled_start and self.render.status == RenderStatus.NOT_STARTED: return RenderStatus.SCHEDULED else: return self.render.status except Exception as e: logger.warning("render_status error: {}".format(e)) return RenderStatus.ERROR 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['render'] = self.render.__dict__.copy() for key in ['thread', 'process']: # remove unwanted keys from JSON d['render'].pop(key, None) d['render']['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.render.percent_complete if isinstance(self.render.percent_complete, numbers.Number) \ else self.render.percent_complete() d['render']['percent_complete'] = percent_complete json_string = json.dumps(d, default=date_serializer) except Exception as e: logger.error("Error converting to JSON: {}".format(e)) return json_string @classmethod def generate_id(cls): return str(uuid.uuid4()).split('-')[0]