#!/usr/bin/env python3 """ euni_report.py — přehled stavu stahování z databáze EUNI. python euni_report.py # souhrnný přehled python euni_report.py --chyby # vypíše materiály ve stavu chyba python euni_report.py --soukroma # vypíše přeskočená (soukromá) videa """ import argparse import sys for _s in (sys.stdout, sys.stderr): try: _s.reconfigure(errors="backslashreplace") except Exception: pass import euni_db as edb CARA = "─" * 56 def lidsky(n): for j, u in [(1e9, "GB"), (1e6, "MB"), (1e3, "kB")]: if n >= j: return f"{n/j:.1f} {u}" return f"{n} B" def main(): p = argparse.ArgumentParser() p.add_argument("--chyby", action="store_true", help="vypiš materiály ve stavu chyba") p.add_argument("--soukroma", action="store_true", help="vypiš přeskočená videa") a = p.parse_args() db = edb.get_db() print(CARA) print(f" EUNI — přehled ({edb.MONGO_URI})") print(CARA) print(f" Kurzů: {db.kurzy.count_documents({})}") kr = db.kurzy.aggregate([{"$group": {"_id": None, "k": {"$sum": "$kredity"}}}]) kr = next(kr, {}).get("k") or 0 print(f" Kreditů celkem (akreditované kurzy): {kr}") print(CARA) for druh in ("video", "dokument"): print(f" {druh.upper()}:") pipe = [{"$match": {"druh": druh}}, {"$group": {"_id": "$stav", "n": {"$sum": 1}, "b": {"$sum": {"$ifNull": ["$velikost_b", 0]}}}}] celkem = 0 for row in sorted(db.materialy.aggregate(pipe), key=lambda r: r["_id"]): vel = f" ({lidsky(row['b'])})" if row["b"] else "" print(f" {row['_id']:<11} {row['n']:>5}{vel}") celkem += row["n"] print(f" {'celkem':<11} {celkem:>5}") print(CARA) if a.chyby: print(" CHYBY:") for m in db.materialy.find({"stav": edb.CHYBA}): print(f" - [{m['druh']}] {m.get('kurz_nazev','')[:40]} | " f"{m.get('posledni_chyba','')[:60]}") print(f" {m['zdroj_url']}") if a.soukroma: print(" PŘESKOČENÁ VIDEA (soukromá/nedostupná):") for m in db.materialy.find({"stav": edb.PRESKOCENO}): print(f" - {m.get('kurz_nazev','')[:45]} | {m.get('duvod','')}") print(f" {m.get('watch_url') or m['zdroj_url']}") if __name__ == "__main__": main()