diff --git a/lib/client/client.py b/lib/client/client.py index c672c31..ae1e9c0 100644 --- a/lib/client/client.py +++ b/lib/client/client.py @@ -40,6 +40,8 @@ def available_servers(): class ZordonClient: + default_image = Image.open("../server/static/images/desktop.png") + def __init__(self): servers = available_servers() @@ -56,6 +58,7 @@ class ZordonClient: photo_pad.pack(fill=tk.BOTH, pady=5, padx=5) self.photo_label = tk.Label(photo_pad, height=500) self.photo_label.pack(fill=tk.BOTH, expand=True) + self.set_image(self.default_image) server_frame = tk.LabelFrame(self.root, text="Server") server_frame.pack(fill=tk.BOTH, pady=5, padx=5, expand=True) @@ -117,12 +120,15 @@ class ZordonClient: self.root.minsize(width=900, height=1000) make_sortable(self.job_tree) + # update jobs self.update_jobs() try: selected_job = self.job_tree.get_children()[0] self.job_tree.selection_set(selected_job) except IndexError: pass + + # update servers self.populate_server_tree() try: selected_server = self.server_tree.get_children()[0] @@ -160,6 +166,12 @@ class ZordonClient: self.server_proxy.request_data(f'job/{job_id}/delete?confirm=true') self.update_jobs(clear_table=True) + def set_image(self, image): + thumb_image = ImageTk.PhotoImage(image) + if thumb_image: + self.photo_label.configure(image=thumb_image) + self.photo_label.image = thumb_image + def on_row_select(self, event): if self.job_tree.selection(): selected_item = self.job_tree.selection()[0] # Get the selected item @@ -167,24 +179,22 @@ class ZordonClient: job_id = row_data['values'][0] # update thumb - thumb_url = f'http://{self.server_proxy.hostname}:{self.server_proxy.port}/ui/job/{job_id}/thumbnail?size=big' - response = requests.get(thumb_url) - if response.status_code == 200: + response = self.server_proxy.request(f'job/{job_id}/thumbnail?size=big') + if response.ok: try: import io image_data = response.content image = Image.open(io.BytesIO(image_data)) - thumb_image = ImageTk.PhotoImage(image) - if thumb_image: - self.photo_label.configure(image=thumb_image) - self.photo_label.image = thumb_image + self.set_image(image) except Exception as e: print(f"error getting image: {e}") # update button status job = next((d for d in self.job_cache if d.get('id') == job_id), None) - button_state = 'normal' if job['status'] == 'running' else 'disabled' + button_state = 'normal' if job and job['status'] == 'running' else 'disabled' self.stop_button.config(state=button_state) + else: + self.set_image(self.default_image) def reveal_in_finder(self): selected_item = self.job_tree.selection()[0] # Get the selected item diff --git a/lib/client/server_proxy.py b/lib/client/server_proxy.py index 91fc3c5..92a226a 100644 --- a/lib/client/server_proxy.py +++ b/lib/client/server_proxy.py @@ -24,13 +24,16 @@ class RenderServerProxy: def request_data(self, payload, timeout=5): try: - req = requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout) + req = self.request(payload, timeout) if req.ok: return req.json() except Exception as e: pass return None + def request(self, payload, timeout=5): + return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout) + def get_jobs(self): all_jobs = self.request_data('jobs') sorted_jobs = [] diff --git a/lib/render_workers/base_worker.py b/lib/render_workers/base_worker.py index fd27b15..fafd773 100644 --- a/lib/render_workers/base_worker.py +++ b/lib/render_workers/base_worker.py @@ -42,8 +42,8 @@ class BaseRenderWorker(Base): input_path = Column(String) output_path = Column(String) date_created = Column(DateTime) - start_time = Column(DateTime) - end_time = Column(DateTime) + start_time = Column(DateTime, nullable=True) + end_time = Column(DateTime, nullable=True) renderer = Column(String) renderer_version = Column(String) priority = Column(Integer) diff --git a/lib/server/job_server.py b/lib/server/job_server.py index 8917d00..178f6f4 100755 --- a/lib/server/job_server.py +++ b/lib/server/job_server.py @@ -68,7 +68,7 @@ def job_detail(job_id): job=found_job, renderer_info=renderer_info()) -@server.route('/ui/job//thumbnail') +@server.route('/api/job//thumbnail') def job_thumbnail(job_id): big_thumb = request.args.get('size', False) == "big" found_job = RenderQueue.job_with_id(job_id, none_ok=True) diff --git a/lib/server/static/js/job_table.js b/lib/server/static/js/job_table.js index f66925d..7d2208a 100644 --- a/lib/server/static/js/job_table.js +++ b/lib/server/static/js/job_table.js @@ -2,7 +2,7 @@ const grid = new gridjs.Grid({ columns: [ { data: (row) => row.id, name: 'Thumbnail', - formatter: (cell) => gridjs.html(``), + formatter: (cell) => gridjs.html(``), sort: {enabled: false} }, { id: 'name',