diff --git a/backend/app/cli.py b/backend/app/cli.py index f5e4e49..085c01b 100644 --- a/backend/app/cli.py +++ b/backend/app/cli.py @@ -44,7 +44,7 @@ def reset_password(email: str, new_password: str): db.close() -def list_users(): +def list_users(args=None): db = SessionLocal() try: users = db.query(User).order_by(User.id).all() @@ -119,7 +119,7 @@ def delete_user(email: str): db.close() -def stats(): +def stats(args=None): from app.models.quiz import Quiz from app.models.question import Question from app.models.attempt import QuizAttempt @@ -160,28 +160,31 @@ def stats(): db.close() -def list_courses(): +def list_courses(args=None): from app.models.course import Course, CourseEnrollment + from sqlalchemy import func db = SessionLocal() try: + counts = dict(db.query(CourseEnrollment.course_id, func.count()).group_by(CourseEnrollment.course_id).all()) courses = db.query(Course).order_by(Course.id).all() print(f"{'ID':<5} {'Title':<35} {'Status':<12} {'Creator':<20} {'Enrolled':<10}") print("-" * 82) for c in courses: creator = db.query(User).filter(User.id == c.user_id).first() name = creator.name if creator else "?" - print(f"{c.id:<5} {(c.title or '-')[:34]:<35} {c.status:<12} {name[:19]:<20} {c.enrolled_count or 0:<10}") + enrolled = counts.get(c.id, 0) + print(f"{c.id:<5} {(c.title or '-')[:34]:<35} {c.status:<12} {name[:19]:<20} {enrolled:<10}") print(f"\n{len(courses)} course(s)") finally: db.close() -def list_quizzes(show_all=False): +def list_quizzes(args=None): from app.models.quiz import Quiz db = SessionLocal() try: q = db.query(Quiz) - if not show_all: + if not (args and "--all" in args): q = q.filter(Quiz.deleted_at.is_(None)) quizzes = q.order_by(Quiz.id).all() print(f"{'ID':<5} {'Title':<35} {'Qs':<5} {'Mode':<10} {'Type':<10} {'Status':<10}") @@ -195,7 +198,7 @@ def list_quizzes(show_all=False): db.close() -def list_docs(): +def list_docs(args=None): from app.models.pdf_document import PDFDocument db = SessionLocal() try: @@ -214,7 +217,7 @@ def list_docs(): db.close() -def fix_stuck_docs(): +def fix_stuck_docs(args=None): from datetime import datetime, timedelta from app.models.pdf_document import PDFDocument db = SessionLocal() @@ -261,7 +264,7 @@ def reprocess_doc(doc_id: str): db.close() -def cleanup_redis(): +def cleanup_redis(args=None): from app.config import settings import redis as redis_lib r = redis_lib.from_url(settings.REDIS_URL, decode_responses=True) @@ -281,7 +284,7 @@ def cleanup_redis(): print(f"Cleaned {expired} orphaned keys out of {len(keys) + len(session_keys)} total") -def export_users(): +def export_users(args=None): db = SessionLocal() try: users = db.query(User).order_by(User.id).all() @@ -303,7 +306,7 @@ COMMANDS = { "delete-user": (lambda args: delete_user(args[0]), 1), "stats": (stats, 0), "list-courses": (list_courses, 0), - "list-quizzes": (lambda args: list_quizzes("--all" in args), 0), + "list-quizzes": (list_quizzes, 0), "list-docs": (list_docs, 0), "fix-stuck-docs": (fix_stuck_docs, 0), "reprocess-doc": (lambda args: reprocess_doc(args[0]), 1), @@ -331,6 +334,6 @@ if __name__ == "__main__": print(f"Error: '{cmd}' requires {min_args} argument(s), got {len(rest)}") sys.exit(1) - result = fn(rest) if min_args > 0 else fn() + result = fn(rest) if min_args > 0 else fn(rest) if result is False: sys.exit(1)