mirror of
https://git.datalinker.icu/comfyanonymous/ComfyUI
synced 2026-11-13 02:06:59 +08:00
feat: Store and fetch setting from browser when using single-user mode
This commit is contained in:
parent
2a02546e20
commit
e78f9cc1b6
@ -13,7 +13,7 @@ default_user = "default"
|
|||||||
users_file = os.path.join(user_directory, "users.json")
|
users_file = os.path.join(user_directory, "users.json")
|
||||||
|
|
||||||
|
|
||||||
class UserManager():
|
class UserManager:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
global user_directory
|
global user_directory
|
||||||
|
|
||||||
@ -21,8 +21,12 @@ class UserManager():
|
|||||||
if not os.path.exists(user_directory):
|
if not os.path.exists(user_directory):
|
||||||
os.mkdir(user_directory)
|
os.mkdir(user_directory)
|
||||||
if not args.multi_user:
|
if not args.multi_user:
|
||||||
print("****** User settings have been changed to be stored on the server instead of browser storage. ******")
|
print(
|
||||||
print("****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******")
|
"****** User settings have been changed to be stored on the server instead of browser storage. ******"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
"****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******"
|
||||||
|
)
|
||||||
|
|
||||||
if args.multi_user:
|
if args.multi_user:
|
||||||
if os.path.isfile(users_file):
|
if os.path.isfile(users_file):
|
||||||
@ -43,7 +47,9 @@ class UserManager():
|
|||||||
|
|
||||||
return user
|
return user
|
||||||
|
|
||||||
def get_request_user_filepath(self, request, file, type="userdata", create_dir=True):
|
def get_request_user_filepath(
|
||||||
|
self, request, file, type="userdata", create_dir=True
|
||||||
|
):
|
||||||
global user_directory
|
global user_directory
|
||||||
|
|
||||||
if type == "userdata":
|
if type == "userdata":
|
||||||
@ -75,7 +81,7 @@ class UserManager():
|
|||||||
name = name.strip()
|
name = name.strip()
|
||||||
if not name:
|
if not name:
|
||||||
raise ValueError("username not provided")
|
raise ValueError("username not provided")
|
||||||
user_id = re.sub("[^a-zA-Z0-9-_]+", '-', name)
|
user_id = re.sub("[^a-zA-Z0-9-_]+", "-", name)
|
||||||
user_id = user_id + "_" + str(uuid.uuid4())
|
user_id = user_id + "_" + str(uuid.uuid4())
|
||||||
|
|
||||||
self.users[user_id] = name
|
self.users[user_id] = name
|
||||||
@ -94,11 +100,12 @@ class UserManager():
|
|||||||
if args.multi_user:
|
if args.multi_user:
|
||||||
return web.json_response({"storage": "server", "users": self.users})
|
return web.json_response({"storage": "server", "users": self.users})
|
||||||
else:
|
else:
|
||||||
user_dir = self.get_request_user_filepath(request, None, create_dir=False)
|
user_dir = self.get_request_user_filepath(
|
||||||
return web.json_response({
|
request, None, create_dir=False
|
||||||
"storage": "server",
|
)
|
||||||
"migrated": os.path.exists(user_dir)
|
return web.json_response(
|
||||||
})
|
{"storage": "browser", "migrated": os.path.exists(user_dir)}
|
||||||
|
)
|
||||||
|
|
||||||
@routes.post("/users")
|
@routes.post("/users")
|
||||||
async def post_users(request):
|
async def post_users(request):
|
||||||
@ -112,40 +119,41 @@ class UserManager():
|
|||||||
|
|
||||||
@routes.get("/userdata")
|
@routes.get("/userdata")
|
||||||
async def listuserdata(request):
|
async def listuserdata(request):
|
||||||
directory = request.rel_url.query.get('dir', '')
|
directory = request.rel_url.query.get("dir", "")
|
||||||
if not directory:
|
if not directory:
|
||||||
return web.Response(status=400)
|
return web.Response(status=400)
|
||||||
|
|
||||||
path = self.get_request_user_filepath(request, directory)
|
path = self.get_request_user_filepath(request, directory)
|
||||||
if not path:
|
if not path:
|
||||||
return web.Response(status=403)
|
return web.Response(status=403)
|
||||||
|
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
return web.Response(status=404)
|
return web.Response(status=404)
|
||||||
|
|
||||||
recurse = request.rel_url.query.get('recurse', '').lower() == "true"
|
recurse = request.rel_url.query.get("recurse", "").lower() == "true"
|
||||||
results = glob.glob(os.path.join(
|
results = glob.glob(
|
||||||
glob.escape(path), '**/*'), recursive=recurse)
|
os.path.join(glob.escape(path), "**/*"), recursive=recurse
|
||||||
|
)
|
||||||
results = [os.path.relpath(x, path) for x in results if os.path.isfile(x)]
|
results = [os.path.relpath(x, path) for x in results if os.path.isfile(x)]
|
||||||
|
|
||||||
split_path = request.rel_url.query.get('split', '').lower() == "true"
|
split_path = request.rel_url.query.get("split", "").lower() == "true"
|
||||||
if split_path:
|
if split_path:
|
||||||
results = [[x] + x.split(os.sep) for x in results]
|
results = [[x] + x.split(os.sep) for x in results]
|
||||||
|
|
||||||
return web.json_response(results)
|
return web.json_response(results)
|
||||||
|
|
||||||
def get_user_data_path(request, check_exists = False, param = "file"):
|
def get_user_data_path(request, check_exists=False, param="file"):
|
||||||
file = request.match_info.get(param, None)
|
file = request.match_info.get(param, None)
|
||||||
if not file:
|
if not file:
|
||||||
return web.Response(status=400)
|
return web.Response(status=400)
|
||||||
|
|
||||||
path = self.get_request_user_filepath(request, file)
|
path = self.get_request_user_filepath(request, file)
|
||||||
if not path:
|
if not path:
|
||||||
return web.Response(status=403)
|
return web.Response(status=403)
|
||||||
|
|
||||||
if check_exists and not os.path.exists(path):
|
if check_exists and not os.path.exists(path):
|
||||||
return web.Response(status=404)
|
return web.Response(status=404)
|
||||||
|
|
||||||
return path
|
return path
|
||||||
|
|
||||||
@routes.get("/userdata/{file}")
|
@routes.get("/userdata/{file}")
|
||||||
@ -153,7 +161,7 @@ class UserManager():
|
|||||||
path = get_user_data_path(request, check_exists=True)
|
path = get_user_data_path(request, check_exists=True)
|
||||||
if not isinstance(path, str):
|
if not isinstance(path, str):
|
||||||
return path
|
return path
|
||||||
|
|
||||||
return web.FileResponse(path)
|
return web.FileResponse(path)
|
||||||
|
|
||||||
@routes.post("/userdata/{file}")
|
@routes.post("/userdata/{file}")
|
||||||
@ -161,7 +169,7 @@ class UserManager():
|
|||||||
path = get_user_data_path(request)
|
path = get_user_data_path(request)
|
||||||
if not isinstance(path, str):
|
if not isinstance(path, str):
|
||||||
return path
|
return path
|
||||||
|
|
||||||
overwrite = request.query["overwrite"] != "false"
|
overwrite = request.query["overwrite"] != "false"
|
||||||
if not overwrite and os.path.exists(path):
|
if not overwrite and os.path.exists(path):
|
||||||
return web.Response(status=409)
|
return web.Response(status=409)
|
||||||
@ -170,7 +178,7 @@ class UserManager():
|
|||||||
|
|
||||||
with open(path, "wb") as f:
|
with open(path, "wb") as f:
|
||||||
f.write(body)
|
f.write(body)
|
||||||
|
|
||||||
resp = os.path.relpath(path, self.get_request_user_filepath(request, None))
|
resp = os.path.relpath(path, self.get_request_user_filepath(request, None))
|
||||||
return web.json_response(resp)
|
return web.json_response(resp)
|
||||||
|
|
||||||
@ -181,7 +189,7 @@ class UserManager():
|
|||||||
return path
|
return path
|
||||||
|
|
||||||
os.remove(path)
|
os.remove(path)
|
||||||
|
|
||||||
return web.Response(status=204)
|
return web.Response(status=204)
|
||||||
|
|
||||||
@routes.post("/userdata/{file}/move/{dest}")
|
@routes.post("/userdata/{file}/move/{dest}")
|
||||||
@ -189,17 +197,17 @@ class UserManager():
|
|||||||
source = get_user_data_path(request, check_exists=True)
|
source = get_user_data_path(request, check_exists=True)
|
||||||
if not isinstance(source, str):
|
if not isinstance(source, str):
|
||||||
return source
|
return source
|
||||||
|
|
||||||
dest = get_user_data_path(request, check_exists=False, param="dest")
|
dest = get_user_data_path(request, check_exists=False, param="dest")
|
||||||
if not isinstance(source, str):
|
if not isinstance(source, str):
|
||||||
return dest
|
return dest
|
||||||
|
|
||||||
overwrite = request.query["overwrite"] != "false"
|
overwrite = request.query["overwrite"] != "false"
|
||||||
if not overwrite and os.path.exists(dest):
|
if not overwrite and os.path.exists(dest):
|
||||||
return web.Response(status=409)
|
return web.Response(status=409)
|
||||||
|
|
||||||
print(f"moving '{source}' -> '{dest}'")
|
print(f"moving '{source}' -> '{dest}'")
|
||||||
shutil.move(source, dest)
|
shutil.move(source, dest)
|
||||||
|
|
||||||
resp = os.path.relpath(dest, self.get_request_user_filepath(request, None))
|
resp = os.path.relpath(dest, self.get_request_user_filepath(request, None))
|
||||||
return web.json_response(resp)
|
return web.json_response(resp)
|
||||||
|
|||||||
@ -82,8 +82,8 @@ export class ComfySettingsDialog extends ComfyDialog {
|
|||||||
|
|
||||||
getSettingValue(id, defaultValue) {
|
getSettingValue(id, defaultValue) {
|
||||||
let value = this.settingsValues[this.getId(id)];
|
let value = this.settingsValues[this.getId(id)];
|
||||||
if(value != null) {
|
if (value != null) {
|
||||||
if(this.app.storageLocation === "browser") {
|
if (this.app.storageLocation === "browser") {
|
||||||
try {
|
try {
|
||||||
value = JSON.parse(value);
|
value = JSON.parse(value);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -105,7 +105,9 @@ export class ComfySettingsDialog extends ComfyDialog {
|
|||||||
}
|
}
|
||||||
this.#dispatchChange(id, value, oldValue);
|
this.#dispatchChange(id, value, oldValue);
|
||||||
|
|
||||||
await api.storeSetting(id, value);
|
if (this.app.storageLocation === "server") {
|
||||||
|
await api.storeSetting(id, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setSettingValue(id, value) {
|
setSettingValue(id, value) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user