resumebuilder / models.py
sakthi07's picture
pushing to hugging face
ab028ac
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
import uuid
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
db = SQLAlchemy()
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
email = db.Column(db.String(255), unique=True, nullable=False)
password_hash = db.Column(db.String(255), nullable=False)
name = db.Column(db.String(255), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
is_admin = db.Column(db.Boolean, default=False, nullable=False)
role = db.Column(db.String(50), default='User', nullable=False)
# Profile sections
introduction = relationship("Introduction", back_populates="user", uselist=False, cascade="all, delete-orphan")
profile_summary = relationship("ProfileSummary", back_populates="user", uselist=False, cascade="all, delete-orphan")
work_experiences = relationship("WorkExperience", back_populates="user", cascade="all, delete-orphan")
projects = relationship("Project", back_populates="user", cascade="all, delete-orphan")
educations = relationship("Education", back_populates="user", cascade="all, delete-orphan")
skills = relationship("Skill", back_populates="user", cascade="all, delete-orphan")
achievements = relationship("Achievement", back_populates="user", cascade="all, delete-orphan")
section_order = relationship("ProfileSectionOrder", back_populates="user", uselist=False, cascade="all, delete-orphan")
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
# Check if it's a bcrypt hash (starts with $2a$, $2b$, etc.)
if self.password_hash.startswith('$2'):
import bcrypt
return bcrypt.checkpw(password.encode('utf-8'), self.password_hash.encode('utf-8'))
else:
# Use Werkzeug's check_password_hash for other hash types
return check_password_hash(self.password_hash, password)
def get_id(self):
return str(self.id)
def __repr__(self):
return f'<User {self.email}>'
class Introduction(db.Model):
__tablename__ = 'introductions'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=False)
name = db.Column(db.String(255), nullable=False)
email = db.Column(db.String(255), nullable=False)
phone = db.Column(db.String(50), nullable=False)
linkedin = db.Column(db.String(255))
github = db.Column(db.String(255))
website = db.Column(db.String(255))
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="introduction")
class ProfileSummary(db.Model):
__tablename__ = 'profile_summaries'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=False)
summary = db.Column(db.Text)
ai_generated = db.Column(db.Boolean, default=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="profile_summary")
class WorkExperience(db.Model):
__tablename__ = 'work_experiences'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=False)
organization = db.Column(db.String(255), nullable=False)
title = db.Column(db.String(255), nullable=False)
start_month = db.Column(db.Integer, nullable=False) # 1-12
start_year = db.Column(db.Integer, nullable=False)
end_month = db.Column(db.Integer) # NULL if present
end_year = db.Column(db.Integer) # NULL if present
remarks = db.Column(db.Text)
order = db.Column(db.Integer, default=0)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="work_experiences")
class Project(db.Model):
__tablename__ = 'projects'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=False)
organization = db.Column(db.String(255))
title = db.Column(db.String(255), nullable=False)
start_month = db.Column(db.Integer, nullable=False) # 1-12
start_year = db.Column(db.Integer, nullable=False)
end_month = db.Column(db.Integer) # NULL if present
end_year = db.Column(db.Integer) # NULL if present
remarks = db.Column(db.Text)
order = db.Column(db.Integer, default=0)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="projects")
class Education(db.Model):
__tablename__ = 'educations'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=False)
organization = db.Column(db.String(255), nullable=False)
title = db.Column(db.String(255), nullable=False)
start_month = db.Column(db.Integer, nullable=False) # 1-12
start_year = db.Column(db.Integer, nullable=False)
end_month = db.Column(db.Integer) # NULL if present
end_year = db.Column(db.Integer) # NULL if present
remarks = db.Column(db.Text)
order = db.Column(db.Integer, default=0)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="educations")
class Skill(db.Model):
__tablename__ = 'skills'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=False)
skill = db.Column(db.String(255), nullable=False)
order = db.Column(db.Integer, default=0)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
user = relationship("User", back_populates="skills")
class Achievement(db.Model):
__tablename__ = 'achievements'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=False)
achievement = db.Column(db.String(255), nullable=False)
order = db.Column(db.Integer, default=0)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
user = relationship("User", back_populates="achievements")
class ProfileSectionOrder(db.Model):
__tablename__ = 'profile_section_orders'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=False, unique=True)
section_order = db.Column(db.JSON, nullable=False) # Stores order as JSON array
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User", back_populates="section_order")