Spaces:
Runtime error
Runtime error
| """ | |
| Reset a test assignment so it can be taken again | |
| """ | |
| from models import get_db, TestResult, Test, Candidate | |
| from datetime import datetime, timedelta | |
| def reset_test_result(test_result_id): | |
| """Reset a specific test result""" | |
| db = next(get_db()) | |
| try: | |
| test_result = db.query(TestResult).filter(TestResult.id == test_result_id).first() | |
| if not test_result: | |
| print(f"β Test result with ID {test_result_id} not found") | |
| return | |
| # Get test and candidate info | |
| test = db.query(Test).filter(Test.id == test_result.test_id).first() | |
| candidate = db.query(Candidate).filter(Candidate.id == test_result.candidate_id).first() | |
| print("\n" + "="*80) | |
| print("π RESETTING TEST ASSIGNMENT") | |
| print("="*80) | |
| print(f"\nTest: {test.title if test else 'Unknown'}") | |
| print(f"Candidate: {candidate.full_name if candidate else 'Unknown'} ({candidate.email if candidate else 'Unknown'})") | |
| print(f"Current Status: {test_result.status}") | |
| if test_result.status == "completed": | |
| print(f"Score: {test_result.score}%") | |
| print(f"Completed: {test_result.completed_at}") | |
| # Reset the test result | |
| test_result.status = "assigned" | |
| test_result.started_at = None | |
| test_result.completed_at = None | |
| test_result.score = None | |
| test_result.correct_answers = None | |
| test_result.total_questions_answered = None | |
| test_result.time_taken_minutes = None | |
| test_result.answers = None | |
| test_result.question_scores = None | |
| test_result.passed = None | |
| test_result.assigned_at = datetime.utcnow() | |
| test_result.expires_at = datetime.utcnow() + timedelta(days=7) | |
| db.commit() | |
| db.refresh(test_result) | |
| print("\nβ Test assignment reset successfully!") | |
| print(f"New Status: {test_result.status}") | |
| print(f"Expires: {test_result.expires_at}") | |
| if candidate: | |
| test_link = f"http://localhost:5173/take-test/{test_result.id}?email={candidate.email}" | |
| print("\n" + "="*80) | |
| print("π TEST LINK:") | |
| print("="*80) | |
| print(f"\n {test_link}\n") | |
| print("="*80 + "\n") | |
| except Exception as e: | |
| print(f"β Error: {e}") | |
| import traceback | |
| traceback.print_exc() | |
| db.rollback() | |
| finally: | |
| db.close() | |
| def list_completed_tests(): | |
| """List all completed test assignments that can be reset""" | |
| db = next(get_db()) | |
| try: | |
| completed = db.query(TestResult).filter(TestResult.status == "completed").all() | |
| if not completed: | |
| print("\nβ No completed tests found") | |
| return | |
| print("\n" + "="*80) | |
| print("π COMPLETED TEST ASSIGNMENTS (Can be reset)") | |
| print("="*80 + "\n") | |
| for result in completed: | |
| test = db.query(Test).filter(Test.id == result.test_id).first() | |
| candidate = db.query(Candidate).filter(Candidate.id == result.candidate_id).first() | |
| print(f"Test Result ID: {result.id}") | |
| print(f"Test: {test.title if test else 'Unknown'}") | |
| print(f"Candidate: {candidate.full_name if candidate else 'Unknown'} ({candidate.email if candidate else 'Unknown'})") | |
| print(f"Score: {result.score}%" if result.score else "Score: N/A") | |
| print(f"Completed: {result.completed_at.strftime('%Y-%m-%d %H:%M:%S') if result.completed_at else 'N/A'}") | |
| print(f"\nTo reset: python reset_test_assignment.py {result.id}") | |
| print("-"*80 + "\n") | |
| except Exception as e: | |
| print(f"β Error: {e}") | |
| import traceback | |
| traceback.print_exc() | |
| finally: | |
| db.close() | |
| def reset_all_for_candidate(candidate_email): | |
| """Reset all test assignments for a specific candidate""" | |
| db = next(get_db()) | |
| try: | |
| candidate = db.query(Candidate).filter(Candidate.email == candidate_email).first() | |
| if not candidate: | |
| print(f"β Candidate with email {candidate_email} not found") | |
| return | |
| test_results = db.query(TestResult).filter( | |
| TestResult.candidate_id == candidate.id, | |
| TestResult.status == "completed" | |
| ).all() | |
| if not test_results: | |
| print(f"β No completed tests found for {candidate.full_name}") | |
| return | |
| print(f"\nπ Resetting {len(test_results)} test(s) for {candidate.full_name}") | |
| print("="*80) | |
| for result in test_results: | |
| test = db.query(Test).filter(Test.id == result.test_id).first() | |
| print(f"\nResetting: {test.title if test else 'Unknown'}") | |
| result.status = "assigned" | |
| result.started_at = None | |
| result.completed_at = None | |
| result.score = None | |
| result.correct_answers = None | |
| result.total_questions_answered = None | |
| result.time_taken_minutes = None | |
| result.answers = None | |
| result.question_scores = None | |
| result.passed = None | |
| result.assigned_at = datetime.utcnow() | |
| result.expires_at = datetime.utcnow() + timedelta(days=7) | |
| db.commit() | |
| print("\nβ All tests reset successfully!") | |
| print(f"\nCandidate can now retake all {len(test_results)} test(s)\n") | |
| except Exception as e: | |
| print(f"β Error: {e}") | |
| import traceback | |
| traceback.print_exc() | |
| db.rollback() | |
| finally: | |
| db.close() | |
| if __name__ == "__main__": | |
| import sys | |
| if len(sys.argv) < 2: | |
| print("\nUsage:") | |
| print(" python reset_test_assignment.py <test_result_id> - Reset specific test") | |
| print(" python reset_test_assignment.py list - List completed tests") | |
| print(" python reset_test_assignment.py email <email> - Reset all tests for candidate") | |
| print("\nExamples:") | |
| print(" python reset_test_assignment.py 1") | |
| print(" python reset_test_assignment.py list") | |
| print(" python reset_test_assignment.py email jonasferrao21@gmail.com") | |
| sys.exit(1) | |
| if sys.argv[1] == "list": | |
| list_completed_tests() | |
| elif sys.argv[1] == "email" and len(sys.argv) > 2: | |
| reset_all_for_candidate(sys.argv[2]) | |
| else: | |
| try: | |
| test_result_id = int(sys.argv[1]) | |
| reset_test_result(test_result_id) | |
| except ValueError: | |
| print("β Invalid test result ID. Must be a number.") | |