""" Core Configuration for Workers - ServiceManagerWeb Configuración compartida entre workers usando Pydantic Settings """ from functools import lru_cache from typing import List, Optional from pydantic import Field, field_validator from pydantic_settings import BaseSettings import os class WorkerSettings(BaseSettings): """Configuración para workers Celery.""" # =================================== # GENERAL # =================================== ENVIRONMENT: str = Field(default="development", env="ENVIRONMENT") DEBUG: bool = Field(default=False, env="DEBUG") # =================================== # DATABASE # =================================== DATABASE_URL: str = Field(..., env="DATABASE_URL") # =================================== # CELERY & REDIS # =================================== CELERY_BROKER_URL: str = Field(..., env="CELERY_BROKER_URL") CELERY_RESULT_BACKEND: str = Field(..., env="CELERY_RESULT_BACKEND") REDIS_URL: str = Field(..., env="REDIS_URL") # =================================== # EMAIL SETTINGS # =================================== SMTP_HOST: str = Field(default="localhost", env="SMTP_HOST") SMTP_PORT: int = Field(default=587, env="SMTP_PORT") SMTP_USER: Optional[str] = Field(default=None, env="SMTP_USER") SMTP_PASSWORD: Optional[str] = Field(default=None, env="SMTP_PASSWORD") SMTP_USE_TLS: bool = Field(default=True, env="SMTP_USE_TLS") SMTP_USE_SSL: bool = Field(default=False, env="SMTP_USE_SSL") DEFAULT_FROM_EMAIL: str = Field(default="noreply@servicemanager.local", env="DEFAULT_FROM_EMAIL") DEFAULT_FROM_NAME: str = Field(default="ServiceManager", env="DEFAULT_FROM_NAME") # Email retry settings EMAIL_MAX_RETRIES: int = Field(default=3, env="EMAIL_MAX_RETRIES") EMAIL_RETRY_DELAY: int = Field(default=60, env="EMAIL_RETRY_DELAY") # seconds # =================================== # FILE PROCESSING # =================================== UPLOAD_PATH: str = Field(default="/app/uploads", env="UPLOAD_PATH") MAX_UPLOAD_SIZE_MB: int = Field(default=10, env="MAX_UPLOAD_SIZE_MB") # =================================== # SLA SETTINGS # =================================== SLA_CHECK_ENABLED: bool = Field(default=True, env="SLA_CHECK_ENABLED") SLA_WARNING_THRESHOLD: float = Field(default=0.8, env="SLA_WARNING_THRESHOLD") # 80% of SLA time # =================================== # LOGGING # =================================== LOG_LEVEL: str = Field(default="INFO", env="LOG_LEVEL") LOG_FORMAT: str = Field(default="json", env="LOG_FORMAT") LOG_FILE: Optional[str] = Field(default=None, env="LOG_FILE") # =================================== # MONITORING # =================================== SENTRY_DSN: Optional[str] = Field(default=None, env="SENTRY_DSN") PROMETHEUS_PORT: int = Field(default=8888, env="PROMETHEUS_PORT") # =================================== # TASK SETTINGS # =================================== TASK_TIME_LIMIT: int = Field(default=300, env="TASK_TIME_LIMIT") # 5 minutes TASK_SOFT_TIME_LIMIT: int = Field(default=240, env="TASK_SOFT_TIME_LIMIT") # 4 minutes # =================================== # MAINTENANCE SETTINGS # =================================== LOG_RETENTION_DAYS: int = Field(default=30, env="LOG_RETENTION_DAYS") ATTACHMENT_RETENTION_DAYS: int = Field(default=90, env="ATTACHMENT_RETENTION_DAYS") # =================================== # NOTIFICATION SETTINGS # =================================== NOTIFICATION_BATCH_SIZE: int = Field(default=100, env="NOTIFICATION_BATCH_SIZE") DIGEST_ENABLED: bool = Field(default=True, env="DIGEST_ENABLED") model_config = { "env_file": ".env", "env_file_encoding": "utf-8", "case_sensitive": True } def is_production(self) -> bool: """Check if environment is production.""" return self.ENVIRONMENT.lower() == "production" def is_development(self) -> bool: """Check if environment is development.""" return self.ENVIRONMENT.lower() == "development" @lru_cache() def get_settings() -> WorkerSettings: """ Get cached settings instance. Using lru_cache to create a singleton pattern for settings. """ return WorkerSettings()