From 91ef4158b775051822469778cf544500adc700bf Mon Sep 17 00:00:00 2001 From: FrederikBaerentsen Date: Sat, 6 Dec 2025 21:04:04 +0100 Subject: [PATCH] fix(env): settings are not locked after save anymore --- bricktracker/app.py | 16 +++++++++++++++- bricktracker/views/admin/admin.py | 24 +++++++++++++----------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/bricktracker/app.py b/bricktracker/app.py index 228ec6b..3d56b18 100644 --- a/bricktracker/app.py +++ b/bricktracker/app.py @@ -41,10 +41,24 @@ from bricktracker.views.wish import wish_page def load_env_file() -> None: - """Load .env file into os.environ with priority: data/.env > .env (root)""" + """Load .env file into os.environ with priority: data/.env > .env (root) + + Also stores which BK_ variables were set via Docker environment (before loading .env) + so we can detect locked variables in the admin panel. + """ + import json + data_env = Path('data/.env') root_env = Path('.env') + # Store which BK_ variables were already in environment BEFORE loading .env + # These are "locked" (set via Docker's environment: directive) + docker_env_vars = {k: v for k, v in os.environ.items() if k.startswith('BK_')} + + # Store this in a way the admin panel can access it + # We'll use an environment variable to store the JSON list of locked var names + os.environ['_BK_DOCKER_ENV_VARS'] = json.dumps(list(docker_env_vars.keys())) + env_file = None if data_env.exists(): env_file = data_env diff --git a/bricktracker/views/admin/admin.py b/bricktracker/views/admin/admin.py index f3dbd99..41a60bd 100644 --- a/bricktracker/views/admin/admin.py +++ b/bricktracker/views/admin/admin.py @@ -32,6 +32,7 @@ admin_page = Blueprint('admin', __name__, url_prefix='/admin') def get_env_values(): """Get current environment values, using defaults from config when not set""" + import json from pathlib import Path env_values = {} @@ -39,6 +40,15 @@ def get_env_values(): env_explicit_values = {} # Track which values are explicitly set env_locked_values = {} # Track which values are set via Docker environment (locked) + # Get list of variables that were set via Docker environment (before .env was loaded) + # This was stored by load_env_file() in app.py + docker_env_vars = set() + if '_BK_DOCKER_ENV_VARS' in os.environ: + try: + docker_env_vars = set(json.loads(os.environ['_BK_DOCKER_ENV_VARS'])) + except (json.JSONDecodeError, TypeError): + pass + # Read .env file if it exists (check both locations) env_file = None if Path('data/.env').exists(): @@ -76,17 +86,9 @@ def get_env_values(): # For int/other types, keep the original default value config_defaults[env_name] = default_value - # Check if value is set via Docker environment and overrides .env file - # A variable is "locked" if: - # 1. It's set in os.environ (Docker environment), AND - # 2. Either it's NOT in .env file, OR the value differs from .env file - is_locked = False - if env_name in os.environ: - env_value = os.environ[env_name] - file_value = env_from_file.get(env_name) - # Locked if not in file, or values differ - if file_value is None or env_value != file_value: - is_locked = True + # Check if value is set via Docker environment directive + # A variable is "locked" if it was in os.environ BEFORE our app loaded .env + is_locked = env_name in docker_env_vars env_locked_values[env_name] = is_locked # Check if value is explicitly set in .env file or environment