|
|
from typing import List, Optional
|
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
from pydantic import Field
|
|
|
import os
|
|
|
import logging
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
|
"""
|
|
|
Application configuration via environment variables.
|
|
|
"""
|
|
|
model_config = SettingsConfigDict(
|
|
|
env_file=".env",
|
|
|
env_file_encoding="utf-8",
|
|
|
extra="ignore"
|
|
|
)
|
|
|
|
|
|
|
|
|
APP_ENV: str = Field(default="development")
|
|
|
LOG_LEVEL: str = Field(default="INFO")
|
|
|
LOG_FILE: str = Field(default="/tmp/nursing_validator.log")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ADMIN_PASSWORD: str = Field(default="change_me_admin")
|
|
|
NURSE_PASSWORD: str = Field(default="change_me_nurse")
|
|
|
CLINICIAN_PASSWORD: str = Field(default="change_me_clinician")
|
|
|
|
|
|
|
|
|
USE_DATABASE: bool = Field(default=True)
|
|
|
DB_TYPE: str = Field(default="sqlite")
|
|
|
SQLITE_DB_PATH: str = Field(default="nursing_validator.db")
|
|
|
|
|
|
|
|
|
DB_HOST: str = Field(default="localhost")
|
|
|
DB_PORT: str = Field(default="5432")
|
|
|
DB_NAME: str = Field(default="nursing_validator")
|
|
|
DB_USER: str = Field(default="nursing_admin")
|
|
|
DB_PASSWORD: str = Field(default="nursing_password")
|
|
|
DB_POOL_MIN: int = Field(default=2)
|
|
|
DB_POOL_MAX: int = Field(default=20)
|
|
|
|
|
|
|
|
|
VECTOR_DB_PATH: str = Field(default="chroma_db_fons")
|
|
|
LOCAL_DB_PATH: str = Field(default="/tmp/chroma_db_fons_fast")
|
|
|
EMBEDDING_MODEL: str = Field(default="text-embedding-ada-002")
|
|
|
|
|
|
|
|
|
AZURE_OPENAI_ENDPOINT: Optional[str] = Field(default=None)
|
|
|
AZURE_OPENAI_API_KEY: Optional[str] = Field(default=None)
|
|
|
AZURE_OPENAI_API_VERSION: Optional[str] = Field(default="2023-05-15")
|
|
|
AZURE_OPENAI_DEPLOYMENT: Optional[str] = Field(default=None)
|
|
|
|
|
|
|
|
|
STREAMLIT_SERVER_HEADLESS: bool = Field(default=True)
|
|
|
STREAMLIT_SERVER_ENABLE_CORS: bool = Field(default=False)
|
|
|
|
|
|
def is_production(self) -> bool:
|
|
|
return self.APP_ENV.lower() == "production"
|
|
|
|
|
|
def check_security(self):
|
|
|
"""Warn if using default insecure passwords."""
|
|
|
defaults = ["change_me_admin", "change_me_nurse", "change_me_clinician"]
|
|
|
if self.ADMIN_PASSWORD in defaults or \
|
|
|
self.NURSE_PASSWORD in defaults or \
|
|
|
self.CLINICIAN_PASSWORD in defaults:
|
|
|
logger.warning(
|
|
|
"SECURITY WARNING: Default passwords are in use. "
|
|
|
"Set ADMIN_PASSWORD, NURSE_PASSWORD, and CLINICIAN_PASSWORD in .env."
|
|
|
)
|
|
|
|
|
|
|
|
|
settings = Settings()
|
|
|
settings.check_security()
|
|
|
|