Fix CLI argument handling for all commands
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
affd2fc116
commit
197181f6f9
1 changed files with 15 additions and 12 deletions
|
|
@ -44,7 +44,7 @@ def reset_password(email: str, new_password: str):
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
def list_users():
|
def list_users(args=None):
|
||||||
db = SessionLocal()
|
db = SessionLocal()
|
||||||
try:
|
try:
|
||||||
users = db.query(User).order_by(User.id).all()
|
users = db.query(User).order_by(User.id).all()
|
||||||
|
|
@ -119,7 +119,7 @@ def delete_user(email: str):
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
def stats():
|
def stats(args=None):
|
||||||
from app.models.quiz import Quiz
|
from app.models.quiz import Quiz
|
||||||
from app.models.question import Question
|
from app.models.question import Question
|
||||||
from app.models.attempt import QuizAttempt
|
from app.models.attempt import QuizAttempt
|
||||||
|
|
@ -160,28 +160,31 @@ def stats():
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
def list_courses():
|
def list_courses(args=None):
|
||||||
from app.models.course import Course, CourseEnrollment
|
from app.models.course import Course, CourseEnrollment
|
||||||
|
from sqlalchemy import func
|
||||||
db = SessionLocal()
|
db = SessionLocal()
|
||||||
try:
|
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()
|
courses = db.query(Course).order_by(Course.id).all()
|
||||||
print(f"{'ID':<5} {'Title':<35} {'Status':<12} {'Creator':<20} {'Enrolled':<10}")
|
print(f"{'ID':<5} {'Title':<35} {'Status':<12} {'Creator':<20} {'Enrolled':<10}")
|
||||||
print("-" * 82)
|
print("-" * 82)
|
||||||
for c in courses:
|
for c in courses:
|
||||||
creator = db.query(User).filter(User.id == c.user_id).first()
|
creator = db.query(User).filter(User.id == c.user_id).first()
|
||||||
name = creator.name if creator else "?"
|
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)")
|
print(f"\n{len(courses)} course(s)")
|
||||||
finally:
|
finally:
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
def list_quizzes(show_all=False):
|
def list_quizzes(args=None):
|
||||||
from app.models.quiz import Quiz
|
from app.models.quiz import Quiz
|
||||||
db = SessionLocal()
|
db = SessionLocal()
|
||||||
try:
|
try:
|
||||||
q = db.query(Quiz)
|
q = db.query(Quiz)
|
||||||
if not show_all:
|
if not (args and "--all" in args):
|
||||||
q = q.filter(Quiz.deleted_at.is_(None))
|
q = q.filter(Quiz.deleted_at.is_(None))
|
||||||
quizzes = q.order_by(Quiz.id).all()
|
quizzes = q.order_by(Quiz.id).all()
|
||||||
print(f"{'ID':<5} {'Title':<35} {'Qs':<5} {'Mode':<10} {'Type':<10} {'Status':<10}")
|
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()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
def list_docs():
|
def list_docs(args=None):
|
||||||
from app.models.pdf_document import PDFDocument
|
from app.models.pdf_document import PDFDocument
|
||||||
db = SessionLocal()
|
db = SessionLocal()
|
||||||
try:
|
try:
|
||||||
|
|
@ -214,7 +217,7 @@ def list_docs():
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
def fix_stuck_docs():
|
def fix_stuck_docs(args=None):
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from app.models.pdf_document import PDFDocument
|
from app.models.pdf_document import PDFDocument
|
||||||
db = SessionLocal()
|
db = SessionLocal()
|
||||||
|
|
@ -261,7 +264,7 @@ def reprocess_doc(doc_id: str):
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
def cleanup_redis():
|
def cleanup_redis(args=None):
|
||||||
from app.config import settings
|
from app.config import settings
|
||||||
import redis as redis_lib
|
import redis as redis_lib
|
||||||
r = redis_lib.from_url(settings.REDIS_URL, decode_responses=True)
|
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")
|
print(f"Cleaned {expired} orphaned keys out of {len(keys) + len(session_keys)} total")
|
||||||
|
|
||||||
|
|
||||||
def export_users():
|
def export_users(args=None):
|
||||||
db = SessionLocal()
|
db = SessionLocal()
|
||||||
try:
|
try:
|
||||||
users = db.query(User).order_by(User.id).all()
|
users = db.query(User).order_by(User.id).all()
|
||||||
|
|
@ -303,7 +306,7 @@ COMMANDS = {
|
||||||
"delete-user": (lambda args: delete_user(args[0]), 1),
|
"delete-user": (lambda args: delete_user(args[0]), 1),
|
||||||
"stats": (stats, 0),
|
"stats": (stats, 0),
|
||||||
"list-courses": (list_courses, 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),
|
"list-docs": (list_docs, 0),
|
||||||
"fix-stuck-docs": (fix_stuck_docs, 0),
|
"fix-stuck-docs": (fix_stuck_docs, 0),
|
||||||
"reprocess-doc": (lambda args: reprocess_doc(args[0]), 1),
|
"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)}")
|
print(f"Error: '{cmd}' requires {min_args} argument(s), got {len(rest)}")
|
||||||
sys.exit(1)
|
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:
|
if result is False:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue