From 3e35ffddfd7e2fd421599249c73ef2b5ad66ce2a Mon Sep 17 00:00:00 2001 From: Brett Williams Date: Wed, 24 May 2023 09:34:25 -0500 Subject: [PATCH] Add json and time_elapsed methods to render_worker.py --- lib/render_workers/render_worker.py | 57 +++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/lib/render_workers/render_worker.py b/lib/render_workers/render_worker.py index 0012f3e..8a6f84a 100644 --- a/lib/render_workers/render_worker.py +++ b/lib/render_workers/render_worker.py @@ -4,6 +4,7 @@ import logging import os import subprocess import threading +import json from datetime import datetime from enum import Enum @@ -208,14 +209,54 @@ class BaseRenderWorker(object): def _parse_stdout(self, line): raise NotImplementedError("_parse_stdout not implemented") - def elapsed_time(self): - elapsed = "" - if self.start_time: - if self.end_time: - elapsed = self.end_time - self.start_time - elif self.is_running(): - elapsed = datetime.now() - self.start_time - return elapsed + 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.start_time + end_time = self.end_time + + if start_time: + if end_time: + elapsed_time = end_time - start_time + elif self.status == RenderStatus.RUNNING: + elapsed_time = datetime.now() - start_time + + elapsed_time_string = strfdelta(elapsed_time) if elapsed_time else "Unknown" + return elapsed_time_string + + def json(self): + worker_data = self.__dict__.copy() + keys_to_remove = ['thread', 'process'] # remove unwanted keys from dict + for key in worker_data.keys(): + if key.startswith('_'): + keys_to_remove.append(key) + for key in keys_to_remove: + worker_data.pop(key, None) + + # convert to json and back to auto-convert dates to iso format + def date_serializer(o): + if isinstance(o, datetime): + return o.isoformat() + + json_convert = json.dumps(worker_data, default=date_serializer) + worker_json = json.loads(json_convert) + return worker_json class BaseRenderEngine(object):