Hirely-Backend / backend /reset_test_assignment.py
NaikPranav11's picture
Initial clean deployment
1207440
Raw
History Blame Contribute Delete
6.77 kB
"""
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.")