from pydantic import BaseModel from typing import Optional, List class JobRoleCreate(BaseModel): title: str description: str department: Optional[str] = None class JobRoleUpdate(BaseModel): title: Optional[str] = None description: Optional[str] = None department: Optional[str] = None class JobRoleResponse(BaseModel): id: str title: str description: str department: Optional[str] = None created_at: str class QuestionCreate(BaseModel): role_id: Optional[str] = None topic_id: Optional[str] = None interview_type: str = "resume" question: str difficulty: str = "medium" category: Optional[str] = None expected_answer: Optional[str] = None class QuestionUpdate(BaseModel): question: Optional[str] = None difficulty: Optional[str] = None category: Optional[str] = None expected_answer: Optional[str] = None class QuestionResponse(BaseModel): id: str role_id: Optional[str] = None topic_id: Optional[str] = None interview_type: str = "resume" question: str difficulty: str category: Optional[str] = None created_at: str class TopicCreate(BaseModel): name: str description: Optional[str] = None class TopicUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None class TopicPublishUpdate(BaseModel): is_published: bool timer_enabled: Optional[bool] = None timer_seconds: Optional[int] = None class TopicResponse(BaseModel): id: str name: str description: Optional[str] = None created_at: str class RoleRequirementCreate(BaseModel): role_id: str skill: str level: str = "intermediate" class GroupTestCreate(BaseModel): name: str description: Optional[str] = None topic_ids: List[str] time_limit_minutes: Optional[int] = None max_attempts: int = 1 class GroupTestUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None topic_ids: Optional[List[str]] = None time_limit_minutes: Optional[int] = None max_attempts: Optional[int] = None class GroupTestPublishUpdate(BaseModel): is_published: bool class LinkTopicSessionRequest(BaseModel): topic_id: str session_id: str class RoleRequirementResponse(BaseModel): id: str role_id: str skill: str level: str # ── Chatbot (legacy) ────────────────────────────────────────────────────────── class ChatbotQueryRequest(BaseModel): query: str jd_id: Optional[str] = None class ChatbotExportRequest(BaseModel): rows: List[dict] topic_columns: List[dict] group_test_name: str class ChatbotStudentUpdate(BaseModel): user_id: str reg_no: Optional[str] = None name: Optional[str] = None # ── Structured Student Filter ───────────────────────────────────────────────── class StudentFilterRequest(BaseModel): group_test_ids: Optional[List[str]] = None # None = all tests jd_id: Optional[str] = None start_date: Optional[str] = None # "YYYY-MM-DD" end_date: Optional[str] = None # "YYYY-MM-DD" top_k: Optional[int] = None min_score: Optional[float] = None sort_fields: List[str] = ["time"] # ordered priority: "time"|"score"|"duration" sort_orders: List[str] = ["desc"] # matching orders: "asc"|"desc" class StudentFilterExportRequest(BaseModel): rows: List[dict] topic_columns: List[dict] group_test_name: str