diff --git a/lnbits/core/crud.py b/lnbits/core/crud.py index a51c958f..cd8f5c53 100644 --- a/lnbits/core/crud.py +++ b/lnbits/core/crud.py @@ -8,13 +8,7 @@ from loguru import logger from lnbits import bolt11 from lnbits.db import COCKROACH, POSTGRES, Connection -from lnbits.settings import ( - AdminSettings, - EditableSetings, - SuperSettings, - readonly_variables, - settings, -) +from lnbits.settings import AdminSettings, EditableSetings, SuperSettings, settings from . import db from .models import BalanceCheck, Payment, User, Wallet @@ -580,7 +574,8 @@ async def get_super_settings() -> Optional[SuperSettings]: row = await db.fetchone("SELECT * FROM settings") if not row: return None - return SuperSettings(**row) + editable_settings = json.loads(row["editable_settings"]) + return SuperSettings(**{"super_user": row["super_user"], **editable_settings}) async def get_admin_settings(is_super_user: bool = False) -> Optional[AdminSettings]: @@ -602,43 +597,14 @@ async def delete_admin_settings(): async def update_admin_settings(data: EditableSetings): - q, values = get_q_and_values(data) - await db.execute(f"UPDATE settings SET {q}", (values,)) # type: ignore - - -def get_q_and_values(data): - keys = [] - values = [] - for key, value in data.items(): - setattr(settings, key, value) - keys.append(f"{key} = ?") - if type(value) == list: - value = ",".join(value) - values.append(value) - return ", ".join(keys), values + await db.execute(f"UPDATE settings SET editable_settings = ?", (json.dumps(data),)) # type: ignore async def create_admin_settings(): account = await create_account() settings.super_user = account.id - keys = [] - values = "" - for key, value in settings.dict(exclude_none=True).items(): - if not key in readonly_variables: - keys.append(key) - if type(value) == list: - joined = ",".join(value) - values += f"'{joined}'" - if type(value) == int or type(value) == float: - values += str(value) - if type(value) == bool: - values += "true" if value else "false" - if type(value) == str: - value = value.replace("'", "") - values += f"'{value}'" - values += "," - q = ", ".join(keys) - v = values.rstrip(",") - sql = f"INSERT INTO settings ({q}) VALUES ({v})" - await db.execute(sql) + editable_settings = EditableSetings.from_dict(settings.dict()) + + sql = f"INSERT INTO settings (super_user, editable_settings) VALUES (?, ?)" + await db.execute(sql, (settings.super_user, json.dumps(editable_settings.dict()))) diff --git a/lnbits/core/migrations.py b/lnbits/core/migrations.py index 463871dc..e4fee2ae 100644 --- a/lnbits/core/migrations.py +++ b/lnbits/core/migrations.py @@ -195,64 +195,7 @@ async def m006_create_admin_settings_table(db): """ CREATE TABLE IF NOT EXISTS settings ( super_user TEXT, - lnbits_admin_extensions TEXT, - lnbits_admin_users TEXT, - lnbits_allowed_users TEXT, - lnbits_disabled_extensions TEXT, - lnbits_site_title TEXT, - lnbits_site_tagline TEXT, - lnbits_site_description TEXT, - lnbits_default_wallet_name TEXT, - lnbits_theme_options TEXT, - lnbits_custom_logo TEXT, - lnbits_ad_space TEXT, - lnbits_ad_space_title TEXT, - lnbits_ad_space_enabled BOOLEAN, - lnbits_force_https TEXT, - lnbits_reserve_fee_min TEXT, - lnbits_reserve_fee_percent TEXT, - lnbits_service_fee TEXT, - lnbits_hide_api TEXT, - lnbits_denomination TEXT, - lnbits_backend_wallet_class TEXT, - lnbits_endpoint TEXT, - lnbits_key TEXT, - fake_wallet_secret TEXT, - cliche_endpoint TEXT, - corelightning_rpc TEXT, - eclair_url TEXT, - eclair_pass TEXT, - lnd_cert TEXT, - lnd_admin_macaroon TEXT, - lnd_invoice_macaroon TEXT, - lnd_rest_endpoint TEXT, - lnd_rest_cert TEXT, - lnd_rest_macaroon TEXT, - lnd_rest_macaroon_encrypted TEXT, - lnd_grpc_endpoint TEXT, - lnd_grpc_cert TEXT, - lnd_grpc_port INTEGER, - lnd_grpc_admin_macaroon TEXT, - lnd_grpc_invoice_macaroon TEXT, - lnd_grpc_macaroon TEXT, - lnd_grpc_macaroon_encrypted TEXT, - lnpay_api_endpoint TEXT, - lnpay_api_key TEXT, - lnpay_wallet_key TEXT, - lntxbot_api_endpoint TEXT, - lntxbot_key TEXT, - opennode_api_endpoint TEXT, - opennode_key TEXT, - spark_url TEXT, - spark_token TEXT, - boltz_network TEXT, - boltz_url TEXT, - boltz_mempool_space_url TEXT, - boltz_mempool_space_url_ws TEXT, - lntips_api_endpoint TEXT, - lntips_api_key TEXT, - lntips_admin_key TEXT, - lntips_invoice_key TEXT + editable_settings TEXT NOT NULL DEFAULT '{}' ); """ ) diff --git a/lnbits/settings.py b/lnbits/settings.py index fe74d823..6ecba509 100644 --- a/lnbits/settings.py +++ b/lnbits/settings.py @@ -1,4 +1,5 @@ import importlib +import inspect import json import subprocess from os import path @@ -197,6 +198,12 @@ class EditableSetings( def validate_editable_settings(cls, val): return super().validate(cls, val) + @classmethod + def from_dict(cls, d: dict): + return cls( + **{k: v for k, v in d.items() if k in inspect.signature(cls).parameters} + ) + class ReadOnlySettings(LNbitsSetings): lnbits_admin_ui: bool = Field(default=False)