forked from bartvdbraak/blender
netrender
buttons to cancel and reset jobs in the web interface
This commit is contained in:
parent
fedea2eb5c
commit
e677e7e99a
@ -139,6 +139,7 @@ class MRenderFrame(netrender.model.RenderFrame):
|
||||
|
||||
def reset(self, all):
|
||||
if all or self.status == ERROR:
|
||||
self.log_path = None
|
||||
self.slave = None
|
||||
self.time = 0
|
||||
self.status = QUEUED
|
||||
@ -151,6 +152,8 @@ class MRenderFrame(netrender.model.RenderFrame):
|
||||
file_pattern = re.compile("/file_([a-zA-Z0-9]+)_([0-9]+)")
|
||||
render_pattern = re.compile("/render_([a-zA-Z0-9]+)_([0-9]+).exr")
|
||||
log_pattern = re.compile("/log_([a-zA-Z0-9]+)_([0-9]+).log")
|
||||
reset_pattern = re.compile("/reset(all|)_([a-zA-Z0-9]+)_([0-9]+)")
|
||||
cancel_pattern = re.compile("/cancel_([a-zA-Z0-9]+)")
|
||||
|
||||
class RenderHandler(http.server.BaseHTTPRequestHandler):
|
||||
def send_head(self, code = http.client.OK, headers = {}, content = "application/octet-stream"):
|
||||
@ -419,17 +422,23 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
|
||||
self.server.stats("", "New job, missing files (%i total)" % len(job.files))
|
||||
self.send_head(http.client.ACCEPTED, headers=headers)
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
elif self.path == "/cancel":
|
||||
job_id = self.headers.get('job-id', "")
|
||||
elif self.path.startswith("/cancel"):
|
||||
match = cancel_pattern.match(self.path)
|
||||
|
||||
if match:
|
||||
job_id = match.groups()[0]
|
||||
|
||||
job = self.server.getJobID(job_id)
|
||||
|
||||
if job:
|
||||
self.server.stats("", "Cancelling job")
|
||||
self.server.removeJob(job)
|
||||
self.send_head()
|
||||
job = self.server.getJobID(job_id)
|
||||
|
||||
if job:
|
||||
self.server.stats("", "Cancelling job")
|
||||
self.server.removeJob(job)
|
||||
self.send_head()
|
||||
else:
|
||||
# no such job id
|
||||
self.send_head(http.client.NO_CONTENT)
|
||||
else:
|
||||
# no such job id
|
||||
# invalid url
|
||||
self.send_head(http.client.NO_CONTENT)
|
||||
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
@ -440,31 +449,36 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
|
||||
|
||||
self.send_head()
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
elif self.path == "/reset":
|
||||
job_id = self.headers.get('job-id', "")
|
||||
job_frame = int(self.headers.get('job-frame', "-1"))
|
||||
all = bool(self.headers.get('reset-all', "False"))
|
||||
elif self.path.startswith("/reset"):
|
||||
match = reset_pattern.match(self.path)
|
||||
|
||||
job = self.server.getJobID(job_id)
|
||||
|
||||
if job:
|
||||
if job_frame != -1:
|
||||
|
||||
frame = job[job_frame]
|
||||
if frame:
|
||||
self.server.stats("", "Reset job frame")
|
||||
frame.reset(all)
|
||||
self.send_head()
|
||||
else:
|
||||
# no such frame
|
||||
self.send_head(http.client.NO_CONTENT)
|
||||
if match:
|
||||
all = match.groups()[0] == 'all'
|
||||
job_id = match.groups()[1]
|
||||
job_frame = int(match.groups()[2])
|
||||
|
||||
job = self.server.getJobID(job_id)
|
||||
|
||||
if job:
|
||||
if job_frame != 0:
|
||||
|
||||
else:
|
||||
self.server.stats("", "Reset job")
|
||||
job.reset(all)
|
||||
self.send_head()
|
||||
|
||||
else: # job not found
|
||||
frame = job[job_frame]
|
||||
if frame:
|
||||
self.server.stats("", "Reset job frame")
|
||||
frame.reset(all)
|
||||
self.send_head()
|
||||
else:
|
||||
# no such frame
|
||||
self.send_head(http.client.NO_CONTENT)
|
||||
|
||||
else:
|
||||
self.server.stats("", "Reset job")
|
||||
job.reset(all)
|
||||
self.send_head()
|
||||
|
||||
else: # job not found
|
||||
self.send_head(http.client.NO_CONTENT)
|
||||
else: # invalid url
|
||||
self.send_head(http.client.NO_CONTENT)
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
elif self.path == "/slave":
|
||||
|
@ -16,14 +16,23 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
import shutil
|
||||
from netrender.utils import *
|
||||
|
||||
src_folder = os.path.split(__file__)[0]
|
||||
|
||||
def get(handler):
|
||||
def output(text):
|
||||
handler.wfile.write(bytes(text, encoding='utf8'))
|
||||
|
||||
def head(title):
|
||||
output("<html><head>")
|
||||
output("<script src='/html/netrender.js' type='text/javascript'></script>")
|
||||
output("<title>")
|
||||
output(title)
|
||||
output("</title></head><body>")
|
||||
|
||||
def link(text, url):
|
||||
return "<a href='%s'>%s</a>" % (url, text)
|
||||
@ -50,12 +59,21 @@ def get(handler):
|
||||
def endTable():
|
||||
output("</table>")
|
||||
|
||||
if handler.path == "/html" or handler.path == "/":
|
||||
if handler.path == "/html/netrender.js":
|
||||
f = open(os.path.join(src_folder, "netrender.js"), 'rb')
|
||||
|
||||
handler.send_head(content = "text/javascript")
|
||||
shutil.copyfileobj(f, handler.wfile)
|
||||
|
||||
f.close()
|
||||
elif handler.path == "/html" or handler.path == "/":
|
||||
handler.send_head(content = "text/html")
|
||||
output("<html><head><title>NetRender</title></head><body>")
|
||||
head("NetRender")
|
||||
|
||||
output("<h2>Master</h2>")
|
||||
|
||||
|
||||
output("""<button title="remove all jobs" onclick="request('/clear', null);">CLEAR</button>""")
|
||||
|
||||
output("<h2>Slaves</h2>")
|
||||
|
||||
startTable()
|
||||
@ -70,6 +88,7 @@ def get(handler):
|
||||
|
||||
startTable()
|
||||
headerTable(
|
||||
" ",
|
||||
"name",
|
||||
"category",
|
||||
"priority",
|
||||
@ -79,6 +98,7 @@ def get(handler):
|
||||
"done",
|
||||
"dispatched",
|
||||
"error",
|
||||
" ",
|
||||
"first",
|
||||
"exception"
|
||||
)
|
||||
@ -88,6 +108,7 @@ def get(handler):
|
||||
for job in handler.server.jobs:
|
||||
results = job.framesStatus()
|
||||
rowTable(
|
||||
"""<button title="cancel job" onclick="request('/cancel_%s', null);">X</button>""" % job.id,
|
||||
link(job.name, "/html/job" + job.id),
|
||||
job.category if job.category else " ",
|
||||
job.priority,
|
||||
@ -97,6 +118,7 @@ def get(handler):
|
||||
results[DONE],
|
||||
results[DISPATCHED],
|
||||
results[ERROR],
|
||||
"""<button title="reset error frames" onclick="request('/reset_%s_0', null);">R</button>""" % job.id,
|
||||
handler.server.balancer.applyPriorities(job), handler.server.balancer.applyExceptions(job)
|
||||
)
|
||||
|
||||
@ -108,7 +130,7 @@ def get(handler):
|
||||
handler.send_head(content = "text/html")
|
||||
job_id = handler.path[9:]
|
||||
|
||||
output("<html><head><title>NetRender</title></head><body>")
|
||||
head("NetRender")
|
||||
|
||||
job = handler.server.getJobID(job_id)
|
||||
|
||||
|
26
release/scripts/io/netrender/netrender.js
Normal file
26
release/scripts/io/netrender/netrender.js
Normal file
@ -0,0 +1,26 @@
|
||||
function post_to_url(path, params, method) {
|
||||
method = method || "post"; // Set method to post by default, if not specified.
|
||||
|
||||
var form = document.createElement("form");
|
||||
form.setAttribute("method", method);
|
||||
form.setAttribute("action", path);
|
||||
|
||||
for(var key in params) {
|
||||
var hiddenField = document.createElement("input");
|
||||
hiddenField.setAttribute("type", "hidden");
|
||||
hiddenField.setAttribute("name", key);
|
||||
hiddenField.setAttribute("value", params[key]);
|
||||
|
||||
form.appendChild(hiddenField);
|
||||
}
|
||||
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
}
|
||||
|
||||
function request(url, data) {
|
||||
xmlhttp = new XMLHttpRequest();
|
||||
xmlhttp.open("POST", url, false);
|
||||
xmlhttp.send(data);
|
||||
window.location.reload()
|
||||
}
|
@ -299,7 +299,7 @@ class RENDER_OT_netclientcancel(bpy.types.Operator):
|
||||
if conn:
|
||||
job = netrender.jobs[netsettings.active_job_index]
|
||||
|
||||
conn.request("POST", "/cancel", headers={"job-id":job.id})
|
||||
conn.request("POST", cancelURL(job.id))
|
||||
|
||||
response = conn.getresponse()
|
||||
print( response.status, response.reason )
|
||||
|
@ -118,6 +118,9 @@ def logURL(job_id, frame_number):
|
||||
def renderURL(job_id, frame_number):
|
||||
return "/render_%s_%i.exr" % (job_id, frame_number)
|
||||
|
||||
def cancelURL(job_id):
|
||||
return "/cancel_%s" % (job_id)
|
||||
|
||||
def prefixPath(prefix_directory, file_path, prefix_path):
|
||||
if os.path.isabs(file_path):
|
||||
# if an absolute path, make sure path exists, if it doesn't, use relative local path
|
||||
|
Loading…
Reference in New Issue
Block a user