Refactored and redesigned dashboards.
This commit is contained in:
@@ -4,13 +4,12 @@ from flask import Flask, render_template, request
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from .logger_setup import logger as log
|
||||
from .database import (
|
||||
get_overall_summary,
|
||||
get_subreddit_summary,
|
||||
get_all_scanned_subreddits,
|
||||
get_deep_dive_details,
|
||||
get_daily_summary_for_subreddit,
|
||||
get_weekly_summary_for_subreddit,
|
||||
get_overall_image_view_summary
|
||||
get_overall_daily_summary, # Now correctly imported
|
||||
get_overall_weekly_summary # Now correctly imported
|
||||
)
|
||||
|
||||
app = Flask(__name__, template_folder='../templates')
|
||||
@@ -31,21 +30,64 @@ def format_market_cap(mc):
|
||||
|
||||
@app.context_processor
|
||||
def inject_subreddits():
|
||||
"""Makes the list of all scanned subreddits available to every template."""
|
||||
subreddits = get_all_scanned_subreddits()
|
||||
return dict(subreddits=subreddits)
|
||||
"""Makes the list of all subreddits available to every template for the navbar."""
|
||||
return dict(all_subreddits=get_all_scanned_subreddits())
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
"""The handler for the main dashboard page."""
|
||||
tickers = get_overall_summary(limit=10)
|
||||
return render_template("index.html", tickers=tickers)
|
||||
def overall_dashboard():
|
||||
"""Handler for the main, overall dashboard."""
|
||||
view_type = request.args.get('view', 'daily')
|
||||
|
||||
is_image_mode = request.args.get('image') == 'true'
|
||||
|
||||
if view_type == 'weekly':
|
||||
tickers, start, end = get_overall_weekly_summary()
|
||||
date_string = f"{start.strftime('%b %d')} - {end.strftime('%b %d, %Y')}"
|
||||
subtitle = "All Subreddits - Top 10 Weekly"
|
||||
else: # Default to daily
|
||||
tickers = get_overall_daily_summary()
|
||||
date_string = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
||||
subtitle = "All Subreddits - Top 10 Daily"
|
||||
|
||||
return render_template(
|
||||
"dashboard_view.html",
|
||||
title="Overall Dashboard",
|
||||
subtitle=subtitle,
|
||||
date_string=date_string,
|
||||
tickers=tickers,
|
||||
view_type=view_type,
|
||||
subreddit_name=None,
|
||||
is_image_mode=is_image_mode
|
||||
)
|
||||
|
||||
@app.route("/subreddit/<name>")
|
||||
def subreddit_dashboard(name):
|
||||
"""A dynamic route for per-subreddit dashboards."""
|
||||
tickers = get_subreddit_summary(name, limit=10)
|
||||
return render_template("subreddit.html", tickers=tickers, subreddit_name=name)
|
||||
"""Handler for per-subreddit dashboards."""
|
||||
view_type = request.args.get('view', 'daily')
|
||||
|
||||
is_image_mode = request.args.get('image') == 'true'
|
||||
|
||||
if view_type == 'weekly':
|
||||
today = datetime.now(timezone.utc)
|
||||
target_date = today - timedelta(days=7) # Default to last week
|
||||
tickers, start, end = get_weekly_summary_for_subreddit(name, target_date)
|
||||
date_string = f"{start.strftime('%b %d')} - {end.strftime('%b %d, %Y')}"
|
||||
subtitle = f"r/{name} - Top 10 Weekly"
|
||||
else: # Default to daily
|
||||
tickers = get_daily_summary_for_subreddit(name)
|
||||
date_string = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
||||
subtitle = f"r/{name} - Top 10 Daily"
|
||||
|
||||
return render_template(
|
||||
"dashboard_view.html",
|
||||
title=f"r/{name} Dashboard",
|
||||
subtitle=subtitle,
|
||||
date_string=date_string,
|
||||
tickers=tickers,
|
||||
view_type=view_type,
|
||||
subreddit_name=name,
|
||||
is_image_mode=is_image_mode
|
||||
)
|
||||
|
||||
@app.route("/deep-dive/<symbol>")
|
||||
def deep_dive(symbol):
|
||||
@@ -54,63 +96,6 @@ def deep_dive(symbol):
|
||||
posts = get_deep_dive_details(symbol)
|
||||
return render_template("deep_dive.html", posts=posts, symbol=symbol)
|
||||
|
||||
@app.route("/image/daily/<name>")
|
||||
def daily_image_view(name):
|
||||
"""The handler for the image-style dashboard."""
|
||||
tickers = get_daily_summary_for_subreddit(name)
|
||||
current_date = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
||||
return render_template(
|
||||
"daily_image_view.html",
|
||||
tickers=tickers,
|
||||
subreddit_name=name,
|
||||
current_date=current_date
|
||||
)
|
||||
|
||||
@app.route("/image/weekly/<name>")
|
||||
def weekly_image_view(name):
|
||||
"""
|
||||
The handler for the WEEKLY image-style dashboard.
|
||||
Accepts an optional 'date' query parameter in YYYY-MM-DD format.
|
||||
"""
|
||||
# Get the date from the URL query string, e.g., ?date=2025-07-21
|
||||
date_str = request.args.get('date')
|
||||
target_date = None
|
||||
|
||||
if date_str:
|
||||
try:
|
||||
# Convert the string to a datetime object
|
||||
target_date = datetime.strptime(date_str, "%Y-%m-%d").replace(tzinfo=timezone.utc)
|
||||
except ValueError:
|
||||
return "Invalid date format. Please use YYYY-MM-DD.", 400
|
||||
else:
|
||||
# If no date is provided, default to showing LAST week
|
||||
today = datetime.now(timezone.utc)
|
||||
target_date = today - timedelta(days=7)
|
||||
|
||||
# The query now returns the results and the date objects used
|
||||
tickers, start_of_week, end_of_week = get_weekly_summary_for_subreddit(name, target_date)
|
||||
|
||||
# Format the date range for the title
|
||||
date_range_str = f"{start_of_week.strftime('%b %d')} - {end_of_week.strftime('%b %d, %Y')}"
|
||||
|
||||
return render_template(
|
||||
"weekly_image_view.html",
|
||||
tickers=tickers,
|
||||
subreddit_name=name,
|
||||
date_range=date_range_str
|
||||
)
|
||||
|
||||
@app.route("/image/overall")
|
||||
def overall_image_view():
|
||||
"""The handler for the overall image-style dashboard."""
|
||||
tickers = get_overall_image_view_summary()
|
||||
current_date = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
||||
return render_template(
|
||||
"overall_image_view.html",
|
||||
tickers=tickers,
|
||||
current_date=current_date
|
||||
)
|
||||
|
||||
def start_dashboard():
|
||||
"""The main function called by the 'rstat-dashboard' command."""
|
||||
log.info("Starting Flask server...")
|
||||
|
@@ -311,6 +311,49 @@ def get_overall_image_view_summary():
|
||||
conn.close()
|
||||
return results
|
||||
|
||||
def get_overall_daily_summary():
|
||||
"""
|
||||
Gets the top tickers across all subreddits from the LAST 24 HOURS.
|
||||
(This is a copy of get_overall_summary, renamed for clarity).
|
||||
"""
|
||||
conn = get_db_connection()
|
||||
one_day_ago = datetime.now(timezone.utc) - timedelta(days=1)
|
||||
one_day_ago_timestamp = int(one_day_ago.timestamp())
|
||||
query = """
|
||||
SELECT t.symbol, t.market_cap, t.closing_price, COUNT(m.id) as total_mentions,
|
||||
SUM(CASE WHEN m.mention_sentiment > 0.1 THEN 1 ELSE 0 END) as bullish_mentions,
|
||||
SUM(CASE WHEN m.mention_sentiment < -0.1 THEN 1 ELSE 0 END) as bearish_mentions
|
||||
FROM mentions m JOIN tickers t ON m.ticker_id = t.id
|
||||
WHERE m.mention_timestamp >= ?
|
||||
GROUP BY t.symbol, t.market_cap, t.closing_price
|
||||
ORDER BY total_mentions DESC LIMIT 10;
|
||||
"""
|
||||
results = conn.execute(query, (one_day_ago_timestamp,)).fetchall()
|
||||
conn.close()
|
||||
return results
|
||||
|
||||
def get_overall_weekly_summary():
|
||||
"""
|
||||
Gets the top tickers across all subreddits for the LAST 7 DAYS.
|
||||
"""
|
||||
conn = get_db_connection()
|
||||
today = datetime.now(timezone.utc)
|
||||
start_of_week, end_of_week = get_week_start_end(today - timedelta(days=7)) # Get last week's boundaries
|
||||
start_timestamp = int(start_of_week.timestamp())
|
||||
end_timestamp = int(end_of_week.timestamp())
|
||||
query = """
|
||||
SELECT t.symbol, t.market_cap, t.closing_price, COUNT(m.id) as total_mentions,
|
||||
SUM(CASE WHEN m.mention_sentiment > 0.1 THEN 1 ELSE 0 END) as bullish_mentions,
|
||||
SUM(CASE WHEN m.mention_sentiment < -0.1 THEN 1 ELSE 0 END) as bearish_mentions
|
||||
FROM mentions m JOIN tickers t ON m.ticker_id = t.id
|
||||
WHERE m.mention_timestamp BETWEEN ? AND ?
|
||||
GROUP BY t.symbol, t.market_cap, t.closing_price
|
||||
ORDER BY total_mentions DESC LIMIT 10;
|
||||
"""
|
||||
results = conn.execute(query, (start_timestamp, end_timestamp)).fetchall()
|
||||
conn.close()
|
||||
return results, start_of_week, end_of_week
|
||||
|
||||
def get_deep_dive_details(ticker_symbol):
|
||||
""" Gets all analyzed posts that mention a specific ticker. """
|
||||
conn = get_db_connection()
|
||||
|
Reference in New Issue
Block a user