the beginning of the idiots

This commit is contained in:
2025-10-24 14:51:13 -05:00
parent 0b377030c6
commit cb06217ef7
123 changed files with 10279 additions and 0 deletions

View File

@@ -0,0 +1,123 @@
"""
Database models for the application
"""
from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
import enum
Base = declarative_base()
class Tenant(Base):
"""Tenant model for multi-tenant support"""
__tablename__ = "tenants"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(255), unique=True, index=True, nullable=False)
subdomain = Column(String(255), unique=True, index=True, nullable=False)
is_active = Column(Boolean, default=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
users = relationship("User", back_populates="tenant")
job_postings = relationship("JobPosting", back_populates="tenant")
class UserRole(enum.Enum):
"""User roles in the system"""
JOB_SEEKER = "job_seeker"
JOB_PROVIDER = "job_provider"
ADMIN = "admin"
MODERATOR = "moderator"
class User(Base):
"""User model"""
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
email = Column(String(255), unique=True, index=True, nullable=False)
username = Column(String(255), unique=True, index=True, nullable=False)
hashed_password = Column(String(255), nullable=False)
role = Column(String(50), nullable=False) # job_seeker, job_provider, admin, moderator
is_active = Column(Boolean, default=True)
is_verified = Column(Boolean, default=False)
tenant_id = Column(Integer, ForeignKey("tenants.id"), nullable=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
tenant = relationship("Tenant", back_populates="users")
resumes = relationship("Resume", back_populates="user")
applications = relationship("Application", back_populates="user")
job_postings = relationship("JobPosting", back_populates="created_by_user")
class Resume(Base):
"""Resume model for job seekers"""
__tablename__ = "resumes"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
title = Column(String(255), nullable=False)
content = Column(Text, nullable=False) # JSON or structured text
is_active = Column(Boolean, default=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
user = relationship("User", back_populates="resumes")
class JobPosting(Base):
"""Job posting model for job providers"""
__tablename__ = "job_postings"
id = Column(Integer, primary_key=True, index=True)
tenant_id = Column(Integer, ForeignKey("tenants.id"), nullable=False)
created_by_user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
title = Column(String(255), nullable=False)
description = Column(Text, nullable=False)
requirements = Column(Text, nullable=False)
location = Column(String(255))
salary_min = Column(Integer) # in cents
salary_max = Column(Integer) # in cents
is_active = Column(Boolean, default=True)
is_remote = Column(Boolean, default=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
tenant = relationship("Tenant", back_populates="job_postings")
created_by_user = relationship("User", back_populates="job_postings")
applications = relationship("Application", back_populates="job_posting")
class ApplicationStatus(enum.Enum):
"""Status of job applications"""
SUBMITTED = "submitted"
REVIEWED = "reviewed"
INTERVIEW = "interview"
OFFER = "offer"
REJECTED = "rejected"
class Application(Base):
"""Job application model"""
__tablename__ = "applications"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
job_posting_id = Column(Integer, ForeignKey("job_postings.id"), nullable=False)
resume_id = Column(Integer, ForeignKey("resumes.id"), nullable=False)
cover_letter = Column(Text)
status = Column(String(50), default=ApplicationStatus.SUBMITTED.value)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
user = relationship("User", back_populates="applications")
job_posting = relationship("JobPosting", back_populates="applications")
resume = relationship("Resume", back_populates="application")