|
|
|
|
|
"""Handles saving and loading interview history to/from Firestore.""" |
|
|
|
|
|
import firebase_admin |
|
|
from firebase_admin import firestore |
|
|
import datetime |
|
|
import json |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
db = firestore.client() |
|
|
print("Firestore client for history initialized successfully in interview_history.") |
|
|
FIRESTORE_AVAILABLE = True |
|
|
except Exception as e: |
|
|
print(f"Error initializing Firestore client for history in interview_history: {e}") |
|
|
db = None |
|
|
FIRESTORE_AVAILABLE = False |
|
|
|
|
|
def save_interview_history(user_id, interview_data): |
|
|
""" |
|
|
Saves the mock interview results to Firestore under the user's document. |
|
|
""" |
|
|
if not FIRESTORE_AVAILABLE or not db: |
|
|
print("Firestore client not available in interview_history. Cannot save history.") |
|
|
return False |
|
|
if not user_id: |
|
|
print("User ID is required in interview_history to save history.") |
|
|
return False |
|
|
|
|
|
try: |
|
|
user_ref = db.collection('users').document(user_id) |
|
|
history_ref = user_ref.collection('interview_history') |
|
|
history_ref.add(interview_data) |
|
|
print(f"Interview history saved for user {user_id} in interview_history") |
|
|
return True |
|
|
except Exception as e: |
|
|
print(f"Error saving interview history for user {user_id} in interview_history: {e}") |
|
|
return False |
|
|
|
|
|
def load_interview_history(user_id, limit=5): |
|
|
""" |
|
|
Loads the mock interview history for a specific user from Firestore. |
|
|
""" |
|
|
if not FIRESTORE_AVAILABLE or not db: |
|
|
print("Firestore client not available in interview_history. Cannot load history.") |
|
|
return [] |
|
|
if not user_id: |
|
|
print("User ID is required in interview_history to load history.") |
|
|
return [] |
|
|
|
|
|
try: |
|
|
history_ref = db.collection('users').document(user_id).collection('interview_history') |
|
|
docs = history_ref.order_by('timestamp', direction=firestore.Query.DESCENDING).limit(limit).stream() |
|
|
|
|
|
history_list = [] |
|
|
for doc in docs: |
|
|
interview_record = doc.to_dict() |
|
|
history_list.append(interview_record) |
|
|
|
|
|
print(f"Loaded {len(history_list)} interview records for user {user_id} in interview_history") |
|
|
return history_list |
|
|
except Exception as e: |
|
|
print(f"Error loading interview history for user {user_id} in interview_history: {e}") |
|
|
return [] |
|
|
|
|
|
|
|
|
def load_user_history(user_id_state): |
|
|
"""Function to load and format interview history for display in the UI.""" |
|
|
if not FIRESTORE_AVAILABLE: |
|
|
return "History feature is not available (Firestore not initialized)." |
|
|
if not user_id_state: |
|
|
return "Please log in to view your interview history." |
|
|
|
|
|
try: |
|
|
history_list = load_interview_history(user_id_state, limit=5) |
|
|
|
|
|
if not history_list: |
|
|
return "No interview history found." |
|
|
|
|
|
output_text = "**Your Recent Mock Interviews:**\n\n" |
|
|
for idx, record in enumerate(history_list): |
|
|
timestamp = record.get('timestamp', 'Unknown Time') |
|
|
try: |
|
|
if 'Z' in timestamp: |
|
|
dt = datetime.datetime.fromisoformat(timestamp.replace('Z', '+00:00')) |
|
|
else: |
|
|
dt = datetime.datetime.fromisoformat(timestamp) |
|
|
formatted_time = dt.strftime("%Y-%m-%d %H:%M:%S") |
|
|
except Exception as e: |
|
|
print(f"Error parsing timestamp {timestamp} in load_user_history: {e}") |
|
|
formatted_time = timestamp |
|
|
|
|
|
roles = ", ".join(record.get('selected_roles', ['N/A'])) |
|
|
avg_rating = record.get('average_rating', 'N/A') |
|
|
output_text += f"--- **Interview #{len(history_list) - idx} ({formatted_time})** ---\n" |
|
|
output_text += f"**Roles Applied:** {roles}\n" |
|
|
output_text += f"**Average Rating:** {avg_rating:.2f}\n\n" |
|
|
|
|
|
interactions = record.get('interactions', {}) |
|
|
if interactions: |
|
|
output_text += "**Interview Snippets:**\n" |
|
|
count = 0 |
|
|
for q_key, a_val in list(interactions.items())[:3]: |
|
|
q_display = q_key.split(':', 1)[1].strip() if ':' in q_key else q_key |
|
|
a_display = a_val.split(':', 1)[1].strip() if ':' in a_val else a_val |
|
|
output_text += f"- **Q:** {q_display[:100]}{'...' if len(q_display) > 100 else ''}\n" |
|
|
output_text += f" **A:** {a_display[:100]}{'...' if len(a_display) > 100 else ''}\n" |
|
|
count += 1 |
|
|
if count >= 3: |
|
|
break |
|
|
if len(interactions) > 3: |
|
|
output_text += f"... (and {len(interactions) - 3} more questions)\n" |
|
|
else: |
|
|
output_text += "**Details:** Not available.\n" |
|
|
output_text += "\n---\n\n" |
|
|
|
|
|
return output_text |
|
|
except Exception as e: |
|
|
error_msg = f"Error loading interview history in load_user_history: {str(e)}" |
|
|
print(error_msg) |
|
|
return error_msg |