48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
from datetime import date, timedelta
|
|
from flask import Blueprint, render_template, redirect, url_for, flash
|
|
|
|
from app import db
|
|
from src.models import Article, Issue
|
|
|
|
dashboard_bp = Blueprint("dashboard", __name__)
|
|
|
|
|
|
@dashboard_bp.route("/")
|
|
def index():
|
|
today = date.today()
|
|
week_start = today - timedelta(days=today.weekday())
|
|
week_end = week_start + timedelta(days=6)
|
|
|
|
articles_this_week = Article.query.filter(
|
|
Article.pub_date >= str(week_start),
|
|
Article.pub_date < str(week_end + timedelta(days=1)),
|
|
).count()
|
|
|
|
total_articles = Article.query.count()
|
|
total_issues = Issue.query.count()
|
|
latest_issue = Issue.query.order_by(Issue.created_at.desc()).first()
|
|
|
|
from flask import current_app
|
|
scheduler_mgr = current_app.config.get("SCHEDULER_MANAGER")
|
|
scheduler_status = scheduler_mgr.get_status() if scheduler_mgr else {"running": False}
|
|
|
|
return render_template(
|
|
"dashboard.html",
|
|
articles_this_week=articles_this_week,
|
|
total_articles=total_articles,
|
|
total_issues=total_issues,
|
|
latest_issue=latest_issue,
|
|
scheduler_status=scheduler_status,
|
|
)
|
|
|
|
|
|
@dashboard_bp.route("/fetch-now", methods=["POST"])
|
|
def fetch_now():
|
|
from src.fetcher import fetch_and_cache_articles
|
|
result = fetch_and_cache_articles()
|
|
if result.get("error"):
|
|
flash(f"Fetch error: {result['error']}", "error")
|
|
else:
|
|
flash(f"Fetched {result['new']} new articles, {result['skipped']} skipped.")
|
|
return redirect(url_for("dashboard.index"))
|