Skip to content

Commit 231fe6d

Browse files
committed
Repair malformed storage path settings
1 parent 9e43c92 commit 231fe6d

2 files changed

Lines changed: 37 additions & 17 deletions

File tree

‎backend/services/settings.py‎

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
serialize_stem_options,
2323
settings_default_selection,
2424
)
25-
from backend.services.storage import resolve_storage_paths
25+
from backend.services.storage import resolve_storage_paths, storage_path_from_setting
2626

2727
DEFAULT_TEMP_MAX_AGE_HOURS = 24
2828
DEFAULT_EXPORT_BUNDLE_MAX_AGE_DAYS = 7
@@ -45,6 +45,10 @@ def _resolve_storage_directory(raw_value: str) -> str:
4545
return str(Path(cleaned).expanduser().resolve())
4646

4747

48+
def _storage_directory_or_default(value: Any, default: Path) -> str:
49+
return str(storage_path_from_setting(value, default))
50+
51+
4852
def get_or_create_settings(session: Session, runtime_settings: RuntimeSettings) -> AppSettings:
4953
settings = session.get(AppSettings, 1)
5054
if settings is None:
@@ -80,16 +84,22 @@ def get_or_create_settings(session: Session, runtime_settings: RuntimeSettings)
8084
def _backfill_settings(settings: AppSettings, runtime_settings: RuntimeSettings) -> bool:
8185
changed = False
8286
defaults = {
83-
"uploads_directory": str(runtime_settings.uploads_dir.resolve()),
84-
"outputs_directory": str(runtime_settings.output_dir.resolve()),
85-
"exports_directory": str(runtime_settings.exports_dir.resolve()),
86-
"temp_directory": str(runtime_settings.temp_dir.resolve()),
87-
"model_cache_directory": str(runtime_settings.model_cache_dir.resolve()),
87+
"uploads_directory": runtime_settings.uploads_dir,
88+
"outputs_directory": runtime_settings.output_dir,
89+
"exports_directory": runtime_settings.exports_dir,
90+
"temp_directory": runtime_settings.temp_dir,
91+
"model_cache_directory": runtime_settings.model_cache_dir,
8892
"temp_max_age_hours": DEFAULT_TEMP_MAX_AGE_HOURS,
8993
"export_bundle_max_age_days": DEFAULT_EXPORT_BUNDLE_MAX_AGE_DAYS,
9094
}
9195
for field_name, value in defaults.items():
92-
if getattr(settings, field_name) is None:
96+
if field_name.endswith("_directory"):
97+
normalized = _storage_directory_or_default(getattr(settings, field_name), value)
98+
if getattr(settings, field_name) == normalized:
99+
continue
100+
setattr(settings, field_name, normalized)
101+
changed = True
102+
elif getattr(settings, field_name) is None:
93103
setattr(settings, field_name, value)
94104
changed = True
95105
if not isinstance(settings.default_stem_selection, dict):
@@ -117,11 +127,14 @@ def serialize_settings(settings: AppSettings, runtime_settings: RuntimeSettings)
117127
default_selection = settings_default_selection(settings)
118128
storage = StorageSettingsResponse(
119129
database_path=str(runtime_settings.database_path.expanduser().resolve()),
120-
uploads_directory=settings.uploads_directory or "",
121-
outputs_directory=settings.outputs_directory,
122-
exports_directory=settings.exports_directory or "",
123-
temp_directory=settings.temp_directory or "",
124-
model_cache_directory=settings.model_cache_directory,
130+
uploads_directory=_storage_directory_or_default(settings.uploads_directory, runtime_settings.uploads_dir),
131+
outputs_directory=_storage_directory_or_default(settings.outputs_directory, runtime_settings.output_dir),
132+
exports_directory=_storage_directory_or_default(settings.exports_directory, runtime_settings.exports_dir),
133+
temp_directory=_storage_directory_or_default(settings.temp_directory, runtime_settings.temp_dir),
134+
model_cache_directory=_storage_directory_or_default(
135+
settings.model_cache_directory,
136+
runtime_settings.model_cache_dir,
137+
),
125138
)
126139
return SettingsResponse(
127140
storage=storage,

‎backend/services/storage.py‎

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import shutil
44
from dataclasses import dataclass
55
from datetime import datetime, timedelta
6+
from os import PathLike
67
from pathlib import Path
8+
from typing import Any
79

810
from sqlalchemy.orm import Session
911

@@ -74,12 +76,17 @@ def ensure_directories(self) -> None:
7476
raise ValueError(f"Export bundle folder is not writable or could not be created: {self.export_bundles_dir}") from error
7577

7678

79+
def storage_path_from_setting(value: Any, default: Path) -> Path:
80+
candidate = value if isinstance(value, (str, PathLike)) and str(value).strip() else default
81+
return Path(candidate).expanduser().resolve()
82+
83+
7784
def configured_storage_paths(runtime_settings: RuntimeSettings, settings: AppSettings) -> StoragePaths:
78-
uploads_dir = Path(settings.uploads_directory or runtime_settings.uploads_dir).expanduser().resolve()
79-
outputs_dir = Path(settings.outputs_directory or runtime_settings.output_dir).expanduser().resolve()
80-
exports_dir = Path(settings.exports_directory or runtime_settings.exports_dir).expanduser().resolve()
81-
temp_dir = Path(settings.temp_directory or runtime_settings.temp_dir).expanduser().resolve()
82-
model_cache_dir = Path(settings.model_cache_directory or runtime_settings.model_cache_dir).expanduser().resolve()
85+
uploads_dir = storage_path_from_setting(settings.uploads_directory, runtime_settings.uploads_dir)
86+
outputs_dir = storage_path_from_setting(settings.outputs_directory, runtime_settings.output_dir)
87+
exports_dir = storage_path_from_setting(settings.exports_directory, runtime_settings.exports_dir)
88+
temp_dir = storage_path_from_setting(settings.temp_directory, runtime_settings.temp_dir)
89+
model_cache_dir = storage_path_from_setting(settings.model_cache_directory, runtime_settings.model_cache_dir)
8390
return StoragePaths(
8491
database_path=runtime_settings.database_path.expanduser().resolve(),
8592
uploads_dir=uploads_dir,

0 commit comments

Comments
 (0)