- Add Fava URL, ledger slug, and timeout settings to super admin Settings dialog - Reinitialize Fava client when settings are updated via services.py - Add settingsLoaded flag to prevent race conditions where wrong toolbar buttons appeared before isSuperUser was determined - Remove premature Vue mount() call from permissions.js that caused "Cannot read properties of undefined (reading 'user')" error 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
from .crud import (
|
|
create_castle_settings,
|
|
create_user_wallet_settings,
|
|
get_castle_settings,
|
|
get_or_create_user_account,
|
|
get_user_wallet_settings,
|
|
update_castle_settings,
|
|
update_user_wallet_settings,
|
|
)
|
|
from .models import AccountType, CastleSettings, UserWalletSettings
|
|
|
|
|
|
async def get_settings(user_id: str) -> CastleSettings:
|
|
settings = await get_castle_settings(user_id)
|
|
if not settings:
|
|
settings = await create_castle_settings(user_id, CastleSettings())
|
|
return settings
|
|
|
|
|
|
async def update_settings(user_id: str, data: CastleSettings) -> CastleSettings:
|
|
from loguru import logger
|
|
|
|
from .fava_client import init_fava_client
|
|
|
|
settings = await get_castle_settings(user_id)
|
|
if not settings:
|
|
settings = await create_castle_settings(user_id, data)
|
|
else:
|
|
settings = await update_castle_settings(user_id, data)
|
|
|
|
# Reinitialize Fava client with new settings
|
|
try:
|
|
init_fava_client(
|
|
fava_url=settings.fava_url,
|
|
ledger_slug=settings.fava_ledger_slug,
|
|
timeout=settings.fava_timeout,
|
|
)
|
|
logger.info(
|
|
f"Fava client reinitialized: {settings.fava_url}/{settings.fava_ledger_slug}"
|
|
)
|
|
except Exception as e:
|
|
logger.error(f"Failed to reinitialize Fava client: {e}")
|
|
|
|
return settings
|
|
|
|
|
|
async def get_user_wallet(user_id: str) -> UserWalletSettings:
|
|
settings = await get_user_wallet_settings(user_id)
|
|
if not settings:
|
|
settings = await create_user_wallet_settings(user_id, UserWalletSettings())
|
|
return settings
|
|
|
|
|
|
async def update_user_wallet(
|
|
user_id: str, data: UserWalletSettings
|
|
) -> UserWalletSettings:
|
|
from loguru import logger
|
|
|
|
logger.info(f"[WALLET UPDATE] Starting update_user_wallet for user {user_id[:8]}")
|
|
|
|
settings = await get_user_wallet_settings(user_id)
|
|
if not settings:
|
|
logger.info(f"[WALLET UPDATE] Creating new wallet settings for user {user_id[:8]}")
|
|
settings = await create_user_wallet_settings(user_id, data)
|
|
else:
|
|
logger.info(f"[WALLET UPDATE] Updating existing wallet settings for user {user_id[:8]}")
|
|
settings = await update_user_wallet_settings(user_id, data)
|
|
|
|
# Proactively create core user accounts when wallet is configured
|
|
# This ensures all users have a consistent account structure from the start
|
|
logger.info(f"[WALLET UPDATE] Creating LIABILITY account for user {user_id[:8]}")
|
|
await get_or_create_user_account(
|
|
user_id, AccountType.LIABILITY, "Accounts Payable"
|
|
)
|
|
logger.info(f"[WALLET UPDATE] Creating ASSET account for user {user_id[:8]}")
|
|
await get_or_create_user_account(
|
|
user_id, AccountType.ASSET, "Accounts Receivable"
|
|
)
|
|
logger.info(f"[WALLET UPDATE] Completed update_user_wallet for user {user_id[:8]}")
|
|
|
|
return settings
|