mirror of
https://github.com/blw1138/Zordon.git
synced 2025-12-17 16:58:12 +00:00
Manually add servers (#9)
* Add ability to manually add servers to client * Misc client cleanup * Add availability check before adding server to client UI
This commit is contained in:
@@ -1,12 +1,10 @@
|
|||||||
import subprocess
|
|
||||||
import logging
|
import logging
|
||||||
import requests
|
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
import socket
|
import socket
|
||||||
import os, sys
|
import os
|
||||||
from tkinter import ttk, messagebox
|
from tkinter import ttk, messagebox, simpledialog
|
||||||
from PIL import Image, ImageTk
|
from PIL import Image, ImageTk
|
||||||
from lib.client.new_job_window import NewJobWindow
|
from lib.client.new_job_window import NewJobWindow
|
||||||
from lib.server.server_proxy import RenderServerProxy
|
from lib.server.server_proxy import RenderServerProxy
|
||||||
@@ -42,6 +40,7 @@ class DashboardWindow:
|
|||||||
self.local_host = socket.gethostname()
|
self.local_host = socket.gethostname()
|
||||||
self.server_proxy = RenderServerProxy(hostname=self.local_host)
|
self.server_proxy = RenderServerProxy(hostname=self.local_host)
|
||||||
self.job_cache = []
|
self.job_cache = []
|
||||||
|
self.added_hostnames = []
|
||||||
|
|
||||||
# Setup zeroconf
|
# Setup zeroconf
|
||||||
self.zeroconf = ZeroconfServer("_zordon._tcp.local.", socket.gethostname(), 8080)
|
self.zeroconf = ZeroconfServer("_zordon._tcp.local.", socket.gethostname(), 8080)
|
||||||
@@ -58,13 +57,21 @@ class DashboardWindow:
|
|||||||
server_frame.pack(fill=tk.BOTH, pady=5, padx=5, expand=True)
|
server_frame.pack(fill=tk.BOTH, pady=5, padx=5, expand=True)
|
||||||
|
|
||||||
# Create server tree
|
# Create server tree
|
||||||
self.server_tree = ttk.Treeview(server_frame, show="headings")
|
left_frame = tk.Frame(server_frame)
|
||||||
self.server_tree.pack(side=tk.LEFT, expand=True, fill=tk.BOTH)
|
left_frame.pack(side=tk.LEFT, expand=True, fill=tk.BOTH)
|
||||||
|
self.server_tree = ttk.Treeview(left_frame, show="headings")
|
||||||
|
self.server_tree.pack(expand=True, fill=tk.BOTH)
|
||||||
self.server_tree["columns"] = ("Server")
|
self.server_tree["columns"] = ("Server")
|
||||||
self.server_tree.column("Server", width=50)
|
self.server_tree.column("Server", width=50)
|
||||||
self.server_tree.bind("<<TreeviewSelect>>", self.server_picked)
|
self.server_tree.bind("<<TreeviewSelect>>", self.server_picked)
|
||||||
self.server_tree.column("Server", width=200)
|
self.server_tree.column("Server", width=200)
|
||||||
make_sortable(self.server_tree)
|
|
||||||
|
left_button_frame = tk.Frame(left_frame)
|
||||||
|
left_button_frame.pack(side=tk.BOTTOM, fill=tk.X, expand=False)
|
||||||
|
|
||||||
|
# Create buttons
|
||||||
|
add_server_button = tk.Button(left_button_frame, text="Add Server", command=self.add_server_button)
|
||||||
|
add_server_button.pack(side=tk.RIGHT, padx=5, pady=5)
|
||||||
|
|
||||||
# Create separator
|
# Create separator
|
||||||
separator = ttk.Separator(server_frame, orient=tk.VERTICAL)
|
separator = ttk.Separator(server_frame, orient=tk.VERTICAL)
|
||||||
@@ -96,7 +103,7 @@ class DashboardWindow:
|
|||||||
self.job_tree.pack(fill=tk.BOTH, expand=True)
|
self.job_tree.pack(fill=tk.BOTH, expand=True)
|
||||||
|
|
||||||
button_frame = tk.Frame(server_frame)
|
button_frame = tk.Frame(server_frame)
|
||||||
button_frame.pack(pady=5, fill=tk.BOTH, expand=True)
|
button_frame.pack(pady=5, fill=tk.X, expand=False)
|
||||||
|
|
||||||
# Create buttons
|
# Create buttons
|
||||||
self.logs_button = tk.Button(button_frame, text="Logs", command=self.open_logs)
|
self.logs_button = tk.Button(button_frame, text="Logs", command=self.open_logs)
|
||||||
@@ -105,8 +112,6 @@ class DashboardWindow:
|
|||||||
self.delete_button = tk.Button(button_frame, text="Delete", command=self.delete_job)
|
self.delete_button = tk.Button(button_frame, text="Delete", command=self.delete_job)
|
||||||
add_job_button = tk.Button(button_frame, text="Add Job", command=self.show_new_job_window)
|
add_job_button = tk.Button(button_frame, text="Add Job", command=self.show_new_job_window)
|
||||||
|
|
||||||
self.stop_button.config(state='disabled')
|
|
||||||
|
|
||||||
# Pack the buttons in the frame
|
# Pack the buttons in the frame
|
||||||
self.stop_button.pack(side=tk.LEFT)
|
self.stop_button.pack(side=tk.LEFT)
|
||||||
self.stop_button.config(state='disabled')
|
self.stop_button.config(state='disabled')
|
||||||
@@ -123,6 +128,7 @@ class DashboardWindow:
|
|||||||
self.root.maxsize(width=2000, height=1200)
|
self.root.maxsize(width=2000, height=1200)
|
||||||
self.root.minsize(width=900, height=800)
|
self.root.minsize(width=900, height=800)
|
||||||
make_sortable(self.job_tree)
|
make_sortable(self.job_tree)
|
||||||
|
make_sortable(self.server_tree)
|
||||||
|
|
||||||
# update jobs
|
# update jobs
|
||||||
self.update_jobs()
|
self.update_jobs()
|
||||||
@@ -145,6 +151,16 @@ class DashboardWindow:
|
|||||||
x.daemon = True
|
x.daemon = True
|
||||||
x.start()
|
x.start()
|
||||||
|
|
||||||
|
def add_server_button(self):
|
||||||
|
hostname = simpledialog.askstring("Server Hostname", "Enter the server hostname to add:")
|
||||||
|
if hostname:
|
||||||
|
hostname = hostname.strip()
|
||||||
|
if hostname not in self.added_hostnames:
|
||||||
|
if RenderServerProxy(hostname=hostname).connect():
|
||||||
|
self.added_hostnames.append(hostname)
|
||||||
|
else:
|
||||||
|
messagebox.showerror("Cannot Connect", f"Cannot connect to server at hostname: '{hostname}'")
|
||||||
|
|
||||||
def server_picked(self, event):
|
def server_picked(self, event):
|
||||||
try:
|
try:
|
||||||
new_hostname = self.server_tree.selection()[0]
|
new_hostname = self.server_tree.selection()[0]
|
||||||
@@ -250,7 +266,7 @@ class DashboardWindow:
|
|||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
|
|
||||||
def update_servers(self):
|
def update_servers(self):
|
||||||
servers = self.zeroconf.found_clients()
|
servers = list(set(self.zeroconf.found_clients() + self.added_hostnames))
|
||||||
if len(servers) < len(self.server_tree.get_children()):
|
if len(servers) < len(self.server_tree.get_children()):
|
||||||
self.server_tree.delete(*self.server_tree.get_children())
|
self.server_tree.delete(*self.server_tree.get_children())
|
||||||
for hostname in servers:
|
for hostname in servers:
|
||||||
@@ -268,7 +284,7 @@ class DashboardWindow:
|
|||||||
break
|
break
|
||||||
|
|
||||||
hostname = self.server_proxy.hostname
|
hostname = self.server_proxy.hostname
|
||||||
job_fetch = self.server_proxy.get_jobs()
|
job_fetch = self.server_proxy.get_jobs(ignore_token=clear_table)
|
||||||
# have to check hostname is still valid because of delay in fetching jobs
|
# have to check hostname is still valid because of delay in fetching jobs
|
||||||
if hostname == self.server_proxy.hostname:
|
if hostname == self.server_proxy.hostname:
|
||||||
if job_fetch is not None:
|
if job_fetch is not None:
|
||||||
@@ -285,7 +301,9 @@ class DashboardWindow:
|
|||||||
job['priority'],
|
job['priority'],
|
||||||
display_status,
|
display_status,
|
||||||
job['time_elapsed'],
|
job['time_elapsed'],
|
||||||
job['total_frames'])
|
job['total_frames'],
|
||||||
|
job['date_created'],
|
||||||
|
job['owner'])
|
||||||
try:
|
try:
|
||||||
if self.job_tree.exists(job['id']):
|
if self.job_tree.exists(job['id']):
|
||||||
update_row(self.job_tree, job['id'], new_values=values, tags=tags)
|
update_row(self.job_tree, job['id'], new_values=values, tags=tags)
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ class RenderServerProxy:
|
|||||||
def request(self, payload, timeout=5):
|
def request(self, payload, timeout=5):
|
||||||
return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout)
|
return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout)
|
||||||
|
|
||||||
def get_jobs(self, timeout=5):
|
def get_jobs(self, timeout=5, ignore_token=False):
|
||||||
url = f'jobs?token={self.__jobs_cache_token}' if self.__jobs_cache_token else 'jobs'
|
url = f'jobs?token={self.__jobs_cache_token}' if self.__jobs_cache_token and not ignore_token else 'jobs'
|
||||||
status_result = self.request_data(url, timeout=timeout)
|
status_result = self.request_data(url, timeout=timeout)
|
||||||
all_jobs = None
|
all_jobs = None
|
||||||
if status_result is not None:
|
if status_result is not None:
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
from lib.client.dashboard_window import start_client
|
from lib.client.dashboard_window import start_client
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
Reference in New Issue
Block a user