TIF_E41253310/Backend/app/schemas/models.py

168 lines
3.9 KiB
Python

"""
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}