|
|
import os |
|
|
import platform |
|
|
import secrets |
|
|
from dotenv import load_dotenv |
|
|
|
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
def get_system_encoding(): |
|
|
"""Get the system's preferred encoding with UTF-8 fallback.""" |
|
|
try: |
|
|
|
|
|
import locale |
|
|
preferred_encoding = locale.getpreferredencoding(False) |
|
|
|
|
|
|
|
|
if preferred_encoding.lower() not in ['utf-8', 'utf8', 'utf_8']: |
|
|
|
|
|
if platform.system() == 'Windows': |
|
|
try: |
|
|
os.environ['PYTHONIOENCODING'] = 'utf-8' |
|
|
preferred_encoding = 'utf-8' |
|
|
except: |
|
|
preferred_encoding = 'utf-8' |
|
|
else: |
|
|
preferred_encoding = 'utf-8' |
|
|
|
|
|
return preferred_encoding |
|
|
except: |
|
|
return 'utf-8' |
|
|
|
|
|
class Config: |
|
|
"""Base configuration class.""" |
|
|
|
|
|
|
|
|
DEFAULT_ENCODING = get_system_encoding() |
|
|
|
|
|
|
|
|
SUPABASE_URL = os.environ.get('SUPABASE_URL') or '' |
|
|
SUPABASE_KEY = os.environ.get('SUPABASE_KEY') or '' |
|
|
|
|
|
|
|
|
CLIENT_ID = os.environ.get('CLIENT_ID') or '' |
|
|
CLIENT_SECRET = os.environ.get('CLIENT_SECRET') or '' |
|
|
REDIRECT_URL = os.environ.get('REDIRECT_URL') or '' |
|
|
|
|
|
|
|
|
|
|
|
HUGGING_KEY = os.environ.get('hugging_key') or os.environ.get('HUGGING_KEY') or '' |
|
|
|
|
|
|
|
|
JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY') or os.environ.get('SECRET_KEY') or secrets.token_hex(32) |
|
|
|
|
|
|
|
|
DATABASE_URL = os.environ.get('DATABASE_URL') or '' |
|
|
|
|
|
|
|
|
SECRET_KEY = os.environ.get('SECRET_KEY') or secrets.token_hex(32) |
|
|
DEBUG = os.environ.get('DEBUG', 'False').lower() == 'true' |
|
|
|
|
|
|
|
|
SCHEDULER_ENABLED = os.environ.get('SCHEDULER_ENABLED', 'True').lower() == 'true' |
|
|
|
|
|
|
|
|
FORCE_UTF8 = os.environ.get('FORCE_UTF8', 'True').lower() == 'true' |
|
|
UNICODE_LOGGING = os.environ.get('UNICODE_LOGGING', 'True').lower() == 'true' |
|
|
|
|
|
|
|
|
ENVIRONMENT = os.environ.get('ENVIRONMENT', 'development').lower() |
|
|
IS_WINDOWS = platform.system() == 'Windows' |
|
|
IS_DOCKER = os.environ.get('DOCKER_CONTAINER', '').lower() == 'true' |
|
|
|
|
|
|
|
|
if FORCE_UTF8: |
|
|
os.environ['PYTHONIOENCODING'] = 'utf-8' |
|
|
os.environ['PYTHONUTF8'] = '1' |
|
|
|
|
|
|
|
|
LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO' if ENVIRONMENT == 'production' else 'DEBUG') |
|
|
UNICODE_SAFE_LOGGING = UNICODE_LOGGING and not IS_WINDOWS |
|
|
|
|
|
|
|
|
CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://localhost:6379/0') |
|
|
CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://localhost:6379/0') |
|
|
|
|
|
|
|
|
@classmethod |
|
|
def validate_config(cls): |
|
|
"""Validate that all required config values are set.""" |
|
|
required_vars = ['SUPABASE_URL', 'SUPABASE_KEY', 'JWT_SECRET_KEY'] |
|
|
missing_vars = [] |
|
|
|
|
|
for var in required_vars: |
|
|
if not getattr(cls, var, None) or getattr(cls, var) == 'your-secret-key-change-in-production': |
|
|
missing_vars.append(var) |
|
|
|
|
|
if missing_vars: |
|
|
raise ValueError(f"Missing required environment variables: {', '.join(missing_vars)}. Please check your .env file.") |
|
|
|
|
|
|
|
|
Config.validate_config() |