Files
IT_Ticket_System/config/config.py
T
2026-03-26 13:18:09 -04:00

78 lines
3.1 KiB
Python

import os
from dotenv import load_dotenv
load_dotenv()
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-secret-key-change-in-production'
SQLALCHEMY_DATABASE_URI = (
f"mysql+pymysql://{os.environ.get('DB_USER', 'root')}:"
f"{os.environ.get('DB_PASSWORD', '')}@"
f"{os.environ.get('DB_HOST', 'localhost')}:"
f"{os.environ.get('DB_PORT', '3306')}/"
f"{os.environ.get('DB_NAME', 'it_tickets')}"
)
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_recycle': 300,
'pool_pre_ping': True,
}
# Mail
MAIL_SERVER = os.environ.get('MAIL_SERVER', 'localhost')
MAIL_PORT = int(os.environ.get('MAIL_PORT', 587))
MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', 'True').lower() == 'true'
MAIL_USE_SSL = os.environ.get('MAIL_USE_SSL', 'False').lower() == 'true'
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
MAIL_DEFAULT_SENDER = os.environ.get('MAIL_DEFAULT_SENDER', 'IT Helpdesk <noreply@yourdomain.com>')
# IT Department
IT_DEPT_EMAIL = os.environ.get('IT_DEPT_EMAIL', 'it@yourdomain.com')
APP_BASE_URL = os.environ.get('APP_BASE_URL', 'http://localhost:5000')
# Uploads
# UPLOAD_FOLDER must be an absolute path so that save (os.path.join) and
# serve (send_from_directory) always resolve to the same directory regardless
# of the process CWD. The default anchors to the project root via __file__.
_project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
_raw_upload = os.environ.get('UPLOAD_FOLDER', '')
UPLOAD_FOLDER = (
_raw_upload if (_raw_upload and os.path.isabs(_raw_upload))
else os.path.join(_project_root, 'app', 'static', 'uploads')
)
MAX_CONTENT_LENGTH = int(os.environ.get('MAX_CONTENT_LENGTH', 16 * 1024 * 1024))
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'pdf', 'doc', 'docx', 'txt', 'zip', 'log'}
# Anthropic AI
ANTHROPIC_API_KEY = os.environ.get('ANTHROPIC_API_KEY', '')
# Rate limiting storage.
# The `limits` library (used by Flask-Limiter) does not support MySQL as a
# storage backend — its only supported schemes are memory://, redis://, and
# memcached://. Since gunicorn.conf.py enforces a single worker process
# (workers = 1, worker_class = eventlet), in-process memory is both correct
# and sufficient — there is no other worker to share counters with, and a
# counter reset on restart is an acceptable trade-off versus adding Redis.
# To switch to Redis when it becomes available: set RATELIMIT_STORAGE_URI=redis://...
RATELIMIT_STORAGE_URI = os.environ.get('RATELIMIT_STORAGE_URI', 'memory://')
# Admin
ADMIN_EMAIL = os.environ.get('ADMIN_EMAIL', 'admin@yourdomain.com')
ADMIN_PASSWORD = os.environ.get('ADMIN_PASSWORD', 'Admin@123!')
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_ECHO = False
class ProductionConfig(Config):
DEBUG = False
config = {
'development': DevelopmentConfig,
'production': ProductionConfig,
'default': ProductionConfig
}