first
This commit is contained in:
126
backend/app/core/config.py
Normal file
126
backend/app/core/config.py
Normal file
@@ -0,0 +1,126 @@
|
||||
"""
|
||||
Tool_OCR - Configuration Management
|
||||
Loads environment variables and provides centralized configuration
|
||||
"""
|
||||
|
||||
from typing import List
|
||||
from pydantic_settings import BaseSettings
|
||||
from pydantic import Field
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
"""Application settings loaded from environment variables"""
|
||||
|
||||
# ===== Database Configuration =====
|
||||
mysql_host: str = Field(default="mysql.theaken.com")
|
||||
mysql_port: int = Field(default=33306)
|
||||
mysql_user: str = Field(default="A060")
|
||||
mysql_password: str = Field(default="")
|
||||
mysql_database: str = Field(default="db_A060")
|
||||
|
||||
@property
|
||||
def database_url(self) -> str:
|
||||
"""Construct SQLAlchemy database URL"""
|
||||
return (
|
||||
f"mysql+pymysql://{self.mysql_user}:{self.mysql_password}"
|
||||
f"@{self.mysql_host}:{self.mysql_port}/{self.mysql_database}"
|
||||
)
|
||||
|
||||
# ===== Application Configuration =====
|
||||
backend_port: int = Field(default=12010)
|
||||
frontend_port: int = Field(default=12011)
|
||||
secret_key: str = Field(default="your-secret-key-change-this")
|
||||
algorithm: str = Field(default="HS256")
|
||||
access_token_expire_minutes: int = Field(default=1440) # 24 hours
|
||||
|
||||
# ===== OCR Configuration =====
|
||||
paddleocr_model_dir: str = Field(default="./models/paddleocr")
|
||||
ocr_languages: str = Field(default="ch,en,japan,korean")
|
||||
ocr_confidence_threshold: float = Field(default=0.5)
|
||||
max_ocr_workers: int = Field(default=4)
|
||||
|
||||
@property
|
||||
def ocr_languages_list(self) -> List[str]:
|
||||
"""Get OCR languages as list"""
|
||||
return [lang.strip() for lang in self.ocr_languages.split(",")]
|
||||
|
||||
# ===== File Upload Configuration =====
|
||||
max_upload_size: int = Field(default=52428800) # 50MB
|
||||
allowed_extensions: str = Field(default="png,jpg,jpeg,pdf,bmp,tiff,doc,docx,ppt,pptx")
|
||||
upload_dir: str = Field(default="./uploads")
|
||||
temp_dir: str = Field(default="./uploads/temp")
|
||||
processed_dir: str = Field(default="./uploads/processed")
|
||||
images_dir: str = Field(default="./uploads/images")
|
||||
|
||||
@property
|
||||
def allowed_extensions_list(self) -> List[str]:
|
||||
"""Get allowed extensions as list"""
|
||||
return [ext.strip() for ext in self.allowed_extensions.split(",")]
|
||||
|
||||
# ===== Export Configuration =====
|
||||
storage_dir: str = Field(default="./storage")
|
||||
markdown_dir: str = Field(default="./storage/markdown")
|
||||
json_dir: str = Field(default="./storage/json")
|
||||
exports_dir: str = Field(default="./storage/exports")
|
||||
|
||||
# ===== PDF Generation Configuration =====
|
||||
pandoc_path: str = Field(default="/opt/homebrew/bin/pandoc")
|
||||
font_dir: str = Field(default="/System/Library/Fonts")
|
||||
pdf_page_size: str = Field(default="A4")
|
||||
pdf_margin_top: int = Field(default=20)
|
||||
pdf_margin_bottom: int = Field(default=20)
|
||||
pdf_margin_left: int = Field(default=20)
|
||||
pdf_margin_right: int = Field(default=20)
|
||||
|
||||
# ===== Translation Configuration (Reserved) =====
|
||||
enable_translation: bool = Field(default=False)
|
||||
translation_engine: str = Field(default="offline")
|
||||
argostranslate_models_dir: str = Field(default="./models/argostranslate")
|
||||
|
||||
# ===== Background Tasks Configuration =====
|
||||
task_queue_type: str = Field(default="memory")
|
||||
redis_url: str = Field(default="redis://localhost:6379/0")
|
||||
|
||||
# ===== CORS Configuration =====
|
||||
cors_origins: str = Field(default="http://localhost:12011,http://127.0.0.1:12011")
|
||||
|
||||
@property
|
||||
def cors_origins_list(self) -> List[str]:
|
||||
"""Get CORS origins as list"""
|
||||
return [origin.strip() for origin in self.cors_origins.split(",")]
|
||||
|
||||
# ===== Logging Configuration =====
|
||||
log_level: str = Field(default="INFO")
|
||||
log_file: str = Field(default="./logs/app.log")
|
||||
|
||||
class Config:
|
||||
# Look for .env in project root (one level up from backend/)
|
||||
env_file = str(Path(__file__).resolve().parent.parent.parent.parent / ".env")
|
||||
env_file_encoding = "utf-8"
|
||||
case_sensitive = False
|
||||
|
||||
def ensure_directories(self):
|
||||
"""Create all necessary directories if they don't exist"""
|
||||
dirs = [
|
||||
self.upload_dir,
|
||||
self.temp_dir,
|
||||
self.processed_dir,
|
||||
self.images_dir,
|
||||
self.storage_dir,
|
||||
self.markdown_dir,
|
||||
self.json_dir,
|
||||
self.exports_dir,
|
||||
self.paddleocr_model_dir,
|
||||
Path(self.log_file).parent,
|
||||
]
|
||||
|
||||
if self.enable_translation and self.translation_engine == "offline":
|
||||
dirs.append(self.argostranslate_models_dir)
|
||||
|
||||
for dir_path in dirs:
|
||||
Path(dir_path).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
# Global settings instance
|
||||
settings = Settings()
|
||||
Reference in New Issue
Block a user