""" Schemas untuk Tabel Baru - PRD Section 24 """ from pydantic import BaseModel from typing import Optional, List from datetime import datetime # ============== PEKERJAAN ============== class PekerjaanBase(BaseModel): alumni_id: int status_pekerjaan: Optional[str] = None jenis_perusahaan: Optional[str] = None nama_perusahaan: Optional[str] = None jabatan: Optional[str] = None tingkatan_tempat_kerja: Optional[str] = None provinsi: Optional[str] = None kabupaten_kota: Optional[str] = None teks_pekerjaan: Optional[str] = None class PekerjaanCreate(PekerjaanBase): pass class PekerjaanUpdate(BaseModel): status_pekerjaan: Optional[str] = None jenis_perusahaan: Optional[str] = None nama_perusahaan: Optional[str] = None jabatan: Optional[str] = None tingkatan_tempat_kerja: Optional[str] = None provinsi: Optional[str] = None kabupaten_kota: Optional[str] = None teks_pekerjaan: Optional[str] = None class PekerjaanResponse(PekerjaanBase): id: int created_at: Optional[datetime] = None class Config: from_attributes = True # ============== KOMPETENSI ============== class KompetensiBase(BaseModel): alumni_id: int etika_lulus: Optional[int] = None keahlian_lulus: Optional[int] = None bahasa_inggris_lulus: Optional[int] = None teknologi_informasi_lulus: Optional[int] = None komunikasi_lulus: Optional[int] = None kerja_sama_lulus: Optional[int] = None pengembangan_diri_lulus: Optional[int] = None class KompetensiCreate(KompetensiBase): pass class KompetensiUpdate(BaseModel): etika_lulus: Optional[int] = None keahlian_lulus: Optional[int] = None bahasa_inggris_lulus: Optional[int] = None teknologi_informasi_lulus: Optional[int] = None komunikasi_lulus: Optional[int] = None kerja_sama_lulus: Optional[int] = None pengembangan_diri_lulus: Optional[int] = None class KompetensiResponse(KompetensiBase): id: int created_at: Optional[datetime] = None class Config: from_attributes = True # ============== CLUSTERING RESULT ============== class ClusteringResultBase(BaseModel): alumni_id: int model_version: Optional[str] = None k: int cluster: int kategori: str # C0, C1, C2, C3 profile_match: bool = False matched_keyword: Optional[str] = None class ClusteringResultCreate(ClusteringResultBase): pass class ClusteringResultResponse(ClusteringResultBase): id: int created_at: Optional[datetime] = None class Config: from_attributes = True # ============== MODEL EVALUATION ============== class ModelEvaluationBase(BaseModel): model_version: str k: int inertia: float silhouette_score: float class ModelEvaluationCreate(ModelEvaluationBase): pass class ModelEvaluationResponse(ModelEvaluationBase): id: int created_at: Optional[datetime] = None class Config: from_attributes = True # ============== KEYWORD DICTIONARY ============== class KeywordDictionaryBase(BaseModel): kode_prodi: str # TIF, MIF, TKK keyword: str kategori_keyword: Optional[str] = None aktif: bool = True class KeywordDictionaryCreate(KeywordDictionaryBase): pass class KeywordDictionaryUpdate(BaseModel): keyword: Optional[str] = None kategori_keyword: Optional[str] = None aktif: Optional[bool] = None class KeywordDictionaryResponse(KeywordDictionaryBase): id: int created_at: Optional[datetime] = None class Config: from_attributes = True # ============== BULK IMPORT ============== class BulkAlumniCreate(BaseModel): """Untuk import bulk alumni dari file Excel""" alumni_list: List[dict] class BulkClusteringResult(BaseModel): """Untuk save hasil clustering""" model_version: str k: int inertia: float silhouette_score: float results: List[dict] # List of {alumni_id, cluster, kategori, profile_match, matched_keyword}