""" 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 - Reset specific test") print(" python reset_test_assignment.py list - List completed tests") print(" python reset_test_assignment.py 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.")