|
|
|
|
@ -7,19 +7,52 @@ from config import VIDEOS_PER_PAGE, DASHBOARD_PER_PAGE
|
|
|
|
|
|
|
|
|
|
web = Blueprint("web", __name__)
|
|
|
|
|
|
|
|
|
|
from datetime import date, datetime, timedelta
|
|
|
|
|
def _parse_dates(timeframe: str, start_str: str | None, end_str: str | None):
|
|
|
|
|
"""Return (start, end) as date objects or (None, None). End inclusive by day."""
|
|
|
|
|
today = date.today()
|
|
|
|
|
if timeframe == "week":
|
|
|
|
|
# This week = last 7 days ending today
|
|
|
|
|
return (today - timedelta(days=6)), today
|
|
|
|
|
if timeframe == "month":
|
|
|
|
|
# Last 30 days
|
|
|
|
|
return (today - timedelta(days=29)), today
|
|
|
|
|
if timeframe == "year":
|
|
|
|
|
# Last 365 days
|
|
|
|
|
return (today - timedelta(days=364)), today
|
|
|
|
|
if timeframe == "custom":
|
|
|
|
|
try:
|
|
|
|
|
s = datetime.strptime(start_str, "%Y-%m-%d").date() if start_str else None
|
|
|
|
|
e = datetime.strptime(end_str, "%Y-%m-%d").date() if end_str else None
|
|
|
|
|
if s and e and s > e: s, e = e, s
|
|
|
|
|
return s, e
|
|
|
|
|
except ValueError:
|
|
|
|
|
return None, None
|
|
|
|
|
# "all" or unknown → no filter
|
|
|
|
|
return None, None
|
|
|
|
|
|
|
|
|
|
@web.route("/")
|
|
|
|
|
def dashboard():
|
|
|
|
|
cache = build_cache()
|
|
|
|
|
# ---- read filters ----
|
|
|
|
|
query = request.args.get("q", "").lower().strip()
|
|
|
|
|
sort = request.args.get("sort", "total_size")
|
|
|
|
|
dir_ = request.args.get("dir", "desc")
|
|
|
|
|
timeframe = request.args.get("timeframe", "all")
|
|
|
|
|
start_str = request.args.get("start")
|
|
|
|
|
end_str = request.args.get("end")
|
|
|
|
|
reverse = (dir_ == "desc")
|
|
|
|
|
|
|
|
|
|
start, end = _parse_dates(timeframe, start_str, end_str)
|
|
|
|
|
|
|
|
|
|
# ---- build cache over timeframe ----
|
|
|
|
|
cache = build_cache(start=start, end=end)
|
|
|
|
|
items = list(cache["storage_usage"].items())
|
|
|
|
|
|
|
|
|
|
# ---- search ----
|
|
|
|
|
if query:
|
|
|
|
|
items = [e for e in items if query in e[0].split("::")[0].lower()]
|
|
|
|
|
|
|
|
|
|
# ---- sort ----
|
|
|
|
|
def k_user(x): return x[0].split("::")[0].lower()
|
|
|
|
|
def k_platform(x): return x[0].split("::")[1].lower()
|
|
|
|
|
def k_total(x): return x[1]["total_size"]
|
|
|
|
|
@ -35,10 +68,11 @@ def dashboard():
|
|
|
|
|
}
|
|
|
|
|
items.sort(key=key_map.get(sort, k_total), reverse=reverse)
|
|
|
|
|
|
|
|
|
|
# ---- paginate ----
|
|
|
|
|
page = max(1, int(request.args.get("page", 1)))
|
|
|
|
|
total_pages = max(1, math.ceil(len(items) / DASHBOARD_PER_PAGE))
|
|
|
|
|
start = (page - 1) * DASHBOARD_PER_PAGE
|
|
|
|
|
paginated = items[start:start + DASHBOARD_PER_PAGE]
|
|
|
|
|
start_idx = (page - 1) * DASHBOARD_PER_PAGE
|
|
|
|
|
paginated = items[start_idx:start_idx + DASHBOARD_PER_PAGE]
|
|
|
|
|
|
|
|
|
|
return render_template(
|
|
|
|
|
"main.html",
|
|
|
|
|
@ -48,7 +82,10 @@ def dashboard():
|
|
|
|
|
total_pages=total_pages,
|
|
|
|
|
query=query,
|
|
|
|
|
sort=sort,
|
|
|
|
|
dir=dir_
|
|
|
|
|
dir=dir_,
|
|
|
|
|
timeframe=timeframe,
|
|
|
|
|
start_date=start_str,
|
|
|
|
|
end_date=end_str
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
@web.route("/refresh")
|
|
|
|
|
|