* studio: persist personalization (profile + theme) server-side Profile name/nickname/avatar and appearance (theme) were stored only in the browser's localStorage, so every browser or device that connected to the same Studio started from defaults and forgot the user's personalization. Persist them server-side (single-account, stored as one JSON blob in app_settings) so they follow the account: - utils/personalization_settings.py + GET/PUT /api/settings/personalization, with validation (theme/shape enums, avatar must be an image data URL capped at 512 KB) and a 'saved' flag. - Frontend usePersonalizationSync (mounted in the root layout when signed in) hydrates the profile + theme stores from the server when a blob exists, and otherwise migrates the existing local settings up once so nothing is lost; later changes are written through, debounced. Writers keep using the local stores unchanged. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix/adjust personalization sync for PR #6516 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix Studio personalization sync edge cases * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: wasimysaid <wasimysdev@gmail.com>
20 lines
677 B
Python
20 lines
677 B
Python
# SPDX-License-Identifier: AGPL-3.0-only
|
|
# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0
|
|
|
|
from __future__ import annotations
|
|
|
|
PERSONALIZATION_SETTING_KEY = "personalization"
|
|
PERSONALIZATION_VERSION = 1
|
|
MAX_AVATAR_DATA_URL_BYTES = 512 * 1024
|
|
|
|
|
|
def get_personalization() -> dict:
|
|
from storage.studio_db import get_app_setting
|
|
stored = get_app_setting(PERSONALIZATION_SETTING_KEY, None)
|
|
return stored if isinstance(stored, dict) else {}
|
|
|
|
|
|
def set_personalization(data: dict) -> dict:
|
|
from storage.studio_db import upsert_app_settings
|
|
upsert_app_settings({PERSONALIZATION_SETTING_KEY: data})
|
|
return data
|