feat: Store and fetch setting from browser when using single-user mode

This commit is contained in:
Hanmo 2024-08-07 14:48:47 +08:00
parent 2a02546e20
commit e78f9cc1b6
2 changed files with 43 additions and 33 deletions

View File

@ -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)

View File

@ -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) {