/ dashboard / config.py
config.py
 1  """
 2  Dashboard Configuration
 3  
 4  Loads settings from environment variables and defines constants.
 5  """
 6  
 7  import os
 8  from pathlib import Path
 9  from dotenv import load_dotenv
10  
11  load_dotenv()
12  
13  # Database
14  # Get absolute path to project root (parent of dashboard directory)
15  _PROJECT_ROOT = Path(__file__).resolve().parent.parent
16  _db_path = os.getenv("DATABASE_PATH", "./db/sites.db")
17  # Convert relative paths to absolute (relative to project root)
18  if not os.path.isabs(_db_path):
19      DATABASE_PATH = str(_PROJECT_ROOT / _db_path)
20  else:
21      DATABASE_PATH = _db_path
22  
23  # Dashboard
24  DASHBOARD_PORT = int(os.getenv("DASHBOARD_PORT", "8501"))
25  DASHBOARD_TITLE = "333 Method Analytics"
26  REFRESH_INTERVAL = int(os.getenv("DASHBOARD_REFRESH_INTERVAL", "300"))  # seconds (5 minutes)
27  
28  # Cache (increased to 30 minutes for better performance)
29  # Background precompute job keeps data fresh
30  CACHE_TTL = int(os.getenv("DASHBOARD_CACHE_TTL", "1800"))  # seconds (30 minutes)
31  
32  # Pagination
33  PAGE_SIZE = int(os.getenv("DASHBOARD_PAGE_SIZE", "50"))
34  
35  # Timezone
36  TIMEZONE = os.getenv("DASHBOARD_TIMEZONE", "Australia/Sydney")
37  
38  # Colors
39  GRADE_COLORS = {
40      'A+': '#2ECC71', 'A': '#27AE60', 'A-': '#52C41A',
41      'B+': '#3498DB', 'B': '#2980B9', 'B-': '#1F77B4',
42      'C+': '#F1C40F', 'C': '#F39C12', 'C-': '#E8B600',
43      'D+': '#E67E22', 'D': '#D35400', 'D-': '#C0392B', 'F': '#E74C3C'
44  }
45  
46  STATUS_COLORS = {
47      'found': '#3498DB',  # Blue
48      'assets_captured': '#9B59B6',  # Purple
49      'scored': '#E67E22',  # Orange
50      'rescored': '#E74C3C',  # Red
51      'enriched': '#1ABC9C',  # Turquoise
52      'proposals_drafted': '#2ECC71',  # Green
53      'outreach_sent': '#27AE60',  # Dark Green
54      'high_score': '#52C41A',  # Bright Green (completed - scored well)
55      'failing': '#C0392B',  # Dark Red (needs human review)
56      'ignore': '#95A5A6'  # Gray
57  }
58  
59  CHANNEL_COLORS = {
60      'sms': '#3498DB',
61      'email': '#2ECC71',
62      'form': '#9B59B6',
63      'x': '#1DA1F2',
64      'linkedin': '#0A66C2'
65  }
66  
67  # Rate Limit Thresholds
68  RESEND_BOUNCE_ALERT = 5.0  # Alert if bounce rate >5%
69  RESEND_BOUNCE_CRITICAL = 10.0  # Critical if bounce rate >10%
70  RESEND_COMPLAINT_ALERT = 0.1  # Alert if complaint rate >0.1%
71  RESEND_COMPLAINT_CRITICAL = 0.5  # Critical if complaint rate >0.5%
72  RATE_LIMIT_WARNING = 80  # Warn when >80% of quota used
73  
74  # Database Connection Helper
75  def get_db_connection():
76      """Get a connection to the SQLite database"""
77      import sqlite3
78      return sqlite3.connect(DATABASE_PATH)