SMART_AI_RESUME / utils /database.py
parthib07's picture
Upload 531 files
d7d3dff verified
from sqlalchemy import create_engine, Column, Integer, String, Text, DateTime, func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import datetime
import json
# Create the base class for declarative models
Base = declarative_base()
# Define the Resume model
class Resume(Base):
__tablename__ = 'resumes'
id = Column(Integer, primary_key=True)
user_id = Column(String(100))
job_role = Column(String(100))
content = Column(Text)
created_at = Column(DateTime, default=datetime.datetime.utcnow)
updated_at = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)
# Define the Analysis model
class Analysis(Base):
__tablename__ = 'analyses'
id = Column(Integer, primary_key=True)
resume_id = Column(Integer)
analysis_data = Column(Text) # Store JSON data
created_at = Column(DateTime, default=datetime.datetime.utcnow)
class AIAnalysis(Base):
__tablename__ = 'ai_analyses'
id = Column(Integer, primary_key=True)
resume_id = Column(Integer)
model_used = Column(String(100))
resume_score = Column(Integer)
job_role = Column(String(100))
created_at = Column(DateTime, default=datetime.datetime.utcnow)
class DatabaseManager:
def __init__(self, db_path='resume_data.db'):
self.engine = create_engine(f'sqlite:///{db_path}')
Base.metadata.create_all(self.engine)
Session = sessionmaker(bind=self.engine)
self.session = Session()
def save_resume(self, user_id, job_role, content):
resume = Resume(
user_id=user_id,
job_role=job_role,
content=content
)
self.session.add(resume)
self.session.commit()
return resume.id
def get_resume(self, resume_id):
return self.session.query(Resume).filter(Resume.id == resume_id).first()
def get_user_resumes(self, user_id):
return self.session.query(Resume).filter(Resume.user_id == user_id).all()
def save_analysis(self, resume_id, analysis_data):
analysis = Analysis(
resume_id=resume_id,
analysis_data=analysis_data
)
self.session.add(analysis)
self.session.commit()
return analysis.id
def get_analysis(self, analysis_id):
return self.session.query(Analysis).filter(Analysis.id == analysis_id).first()
def get_resume_analyses(self, resume_id):
return self.session.query(Analysis).filter(Analysis.resume_id == resume_id).all()
def close(self):
self.session.close()
def get_database_connection():
"""Get a connection to the database"""
engine = create_engine('sqlite:///resume_data.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
return Session()
def save_resume_data(resume_data):
"""Save resume data to the database"""
session = get_database_connection()
try:
# Convert resume_data to JSON string
resume_json = json.dumps(resume_data)
# Create a new Resume object
resume = Resume(
user_id="anonymous", # We don't have user authentication yet
job_role=resume_data.get('target_role', 'Unknown'),
content=resume_json
)
session.add(resume)
session.commit()
return resume.id
except Exception as e:
session.rollback()
raise e
finally:
session.close()
def save_ai_analysis_data(resume_id, analysis_data):
"""Save AI analysis data to the database"""
session = get_database_connection()
try:
# Create a new AIAnalysis object
ai_analysis = AIAnalysis(
resume_id=resume_id,
model_used=analysis_data.get('model_used', 'Unknown'),
resume_score=analysis_data.get('resume_score', 0),
job_role=analysis_data.get('job_role', 'Unknown')
)
session.add(ai_analysis)
session.commit()
return ai_analysis.id
except Exception as e:
session.rollback()
raise e
finally:
session.close()
def get_ai_analysis_statistics():
"""Get statistics about AI analyses"""
session = get_database_connection()
try:
# Get total number of analyses
total_analyses = session.query(func.count(AIAnalysis.id)).scalar() or 0
# Get average resume score
average_score = session.query(func.avg(AIAnalysis.resume_score)).scalar() or 0
# Get model usage distribution
model_usage_query = session.query(
AIAnalysis.model_used,
func.count(AIAnalysis.id)
).group_by(AIAnalysis.model_used).all()
model_usage = {model: count for model, count in model_usage_query}
# Get job role distribution
job_roles_query = session.query(
AIAnalysis.job_role,
func.count(AIAnalysis.id)
).group_by(AIAnalysis.job_role).all()
job_roles = {role: count for role, count in job_roles_query}
return {
'total_analyses': total_analyses,
'average_score': float(average_score),
'model_usage': model_usage,
'job_roles': job_roles
}
except Exception as e:
print(f"Error getting AI analysis statistics: {e}")
return None
finally:
session.close()