From 75de3671530a479de0536daf385d5dfa45e56140 Mon Sep 17 00:00:00 2001 From: Brett Williams Date: Fri, 9 Jun 2023 11:10:42 -0500 Subject: [PATCH] Break get_time_elapsed into misc_helper (#10) --- dashboard.py | 14 +++++-------- lib/client/dashboard_window.py | 6 ++++-- lib/render_workers/base_worker.py | 34 +++---------------------------- lib/utilities/misc_helper.py | 31 ++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 42 deletions(-) diff --git a/dashboard.py b/dashboard.py index 2cd7bd5..34bc2b0 100755 --- a/dashboard.py +++ b/dashboard.py @@ -19,6 +19,7 @@ from rich.tree import Tree from lib.render_workers.base_worker import RenderStatus, string_to_status from lib.server.server_proxy import RenderServerProxy +from lib.utilities.misc_helper import get_time_elapsed from start_server import start_server """ @@ -133,19 +134,14 @@ def create_jobs_table(all_server_data) -> Table: if job_status == RenderStatus.ERROR and job['errors']: job_text = job_text + "\n" + "\n".join(job['errors']) - # calculate elapsed time - elapsed_time = job['time_elapsed'] - if job['start_time'] and job_status == RenderStatus.RUNNING: - start_time = datetime.datetime.fromisoformat(job['start_time']) - elapsed_time = str(datetime.datetime.now() - start_time) - # Project name - project_name = job_color + job['name'] + project_name = job_color + (job['name'] or os.path.basename(job['input_path'])) + elapsed_time = get_time_elapsed(datetime.datetime.fromisoformat(job['start_time']), + datetime.datetime.fromisoformat(job['end_time'])) if job_status == RenderStatus.RUNNING: job_text = f"{job_color}[bold]Running - {float(job['percent_complete']) * 100:.1f}%" - delta = datetime.datetime.now() - datetime.datetime.fromisoformat(job['start_time']) - elapsed_time = "[bold]" + str(delta) + elapsed_time = "[bold]" + elapsed_time project_name = "[bold]" + project_name elif job_status == RenderStatus.CANCELLED or job_status == RenderStatus.ERROR: project_name = "[strike]" + project_name diff --git a/lib/client/dashboard_window.py b/lib/client/dashboard_window.py index 89082db..4e8519a 100644 --- a/lib/client/dashboard_window.py +++ b/lib/client/dashboard_window.py @@ -1,3 +1,4 @@ +import datetime import logging import tkinter as tk import threading @@ -9,7 +10,7 @@ from PIL import Image, ImageTk from lib.client.new_job_window import NewJobWindow from lib.server.server_proxy import RenderServerProxy from lib.server.zeroconf_server import ZeroconfServer -from lib.utilities.misc_helper import launch_url, file_exists_in_mounts +from lib.utilities.misc_helper import launch_url, file_exists_in_mounts, get_time_elapsed logger = logging.getLogger() @@ -300,7 +301,8 @@ class DashboardWindow: job['renderer'] + "-" + job['renderer_version'], job['priority'], display_status, - job['time_elapsed'], + get_time_elapsed(datetime.datetime.fromisoformat(job['start_time']), + datetime.datetime.fromisoformat(job['end_time'])), job['total_frames'], job['date_created'], job['owner']) diff --git a/lib/render_workers/base_worker.py b/lib/render_workers/base_worker.py index 9617e49..7949e09 100644 --- a/lib/render_workers/base_worker.py +++ b/lib/render_workers/base_worker.py @@ -9,8 +9,9 @@ import glob from datetime import datetime from enum import Enum -from sqlalchemy import Column, Integer, String, DateTime, JSON, event +from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy.ext.declarative import declarative_base +from lib.utilities.misc_helper import get_time_elapsed import psutil @@ -273,35 +274,7 @@ class BaseRenderWorker(Base): raise NotImplementedError("_parse_stdout not implemented") 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 + return get_time_elapsed(self.start_time, self.end_time) def file_list(self): job_dir = os.path.dirname(self.output_path) @@ -322,7 +295,6 @@ class BaseRenderWorker(Base): 'start_time': self.start_time, 'end_time': self.end_time, 'status': self.status.value, - 'time_elapsed': self.time_elapsed(), 'file_hash': self.file_hash, 'percent_complete': self.percent_complete(), 'file_count': len(self.file_list()), diff --git a/lib/utilities/misc_helper.py b/lib/utilities/misc_helper.py index 47e2776..a5cc0af 100644 --- a/lib/utilities/misc_helper.py +++ b/lib/utilities/misc_helper.py @@ -1,6 +1,7 @@ import logging import os import subprocess +from datetime import datetime logger = logging.getLogger() @@ -55,3 +56,33 @@ def file_exists_in_mounts(filepath): possible_mount_path = os.path.join(root, mount, filepath.split(component)[-1].lstrip('/')) if os.path.exists(possible_mount_path): return possible_mount_path + + +def get_time_elapsed(start_time=None, end_time=None): + + 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 + + if start_time: + if end_time: + elapsed_time = end_time - start_time + else: + elapsed_time = datetime.now() - start_time + + elapsed_time_string = strfdelta(elapsed_time) if elapsed_time else None + return elapsed_time_string