Param2121's picture
Refactor: Move project to root of repository
3abfc90
Raw
History Blame Contribute Delete
2.89 kB
from datetime import datetime
from typing import Optional, List
from enum import Enum
from sqlmodel import SQLModel, Field, Relationship
from uuid import UUID, uuid4
from pydantic import EmailStr
class UserRole(str, Enum):
ADMIN = "admin"
USER = "user"
class InterviewStatus(str, Enum):
PENDING = "pending"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
class DifficultyLevel(str, Enum):
EASY = "easy"
MEDIUM = "medium"
HARD = "hard"
class InterviewStyle(str, Enum):
VISUAL = "visual" # e.g., friendly, seeing the interviewer
PROFESSIONAL = "professional"
HR = "hr"
TECHNICAL = "technical"
class User(SQLModel, table=True):
id: Optional[UUID] = Field(default_factory=uuid4, primary_key=True)
email: EmailStr = Field(index=True, unique=True)
hashed_password: str
role: UserRole = Field(default=UserRole.USER)
sessions: List["InterviewSession"] = Relationship(back_populates="user")
class InterviewSession(SQLModel, table=True):
id: Optional[UUID] = Field(default_factory=uuid4, primary_key=True)
user_id: UUID = Field(foreign_key="user.id")
job_role: str
difficulty_level: DifficultyLevel = Field(default=DifficultyLevel.MEDIUM)
interview_style: InterviewStyle = Field(default=InterviewStyle.PROFESSIONAL)
target_company: Optional[str] = None
status: InterviewStatus = Field(default=InterviewStatus.PENDING)
created_at: datetime = Field(default_factory=datetime.utcnow)
final_analysis_report: Optional[str] = Field(default=None, description="JSON or text summary of the interview")
user: User = Relationship(back_populates="sessions")
questions: List["Question"] = Relationship(back_populates="session")
class Question(SQLModel, table=True):
id: Optional[UUID] = Field(default_factory=uuid4, primary_key=True)
session_id: UUID = Field(foreign_key="interviewsession.id")
content: str
topic: Optional[str] = None
difficulty: Optional[str] = None
order: int
session: InterviewSession = Relationship(back_populates="questions")
response: Optional["Response"] = Relationship(back_populates="question")
class Response(SQLModel, table=True):
id: Optional[UUID] = Field(default_factory=uuid4, primary_key=True)
question_id: UUID = Field(foreign_key="question.id")
audio_url: Optional[str] = None
transcript: Optional[str] = None
sentiment_score: Optional[float] = None
question: Question = Relationship(back_populates="response")
feedback: Optional["Feedback"] = Relationship(back_populates="response")
class Feedback(SQLModel, table=True):
id: Optional[UUID] = Field(default_factory=uuid4, primary_key=True)
response_id: UUID = Field(foreign_key="response.id")
content: str
score: Optional[int] = None
response: Response = Relationship(back_populates="feedback")