100 lines
3.2 KiB
Python
100 lines
3.2 KiB
Python
"""
|
|
Router untuk Import Data Alumni dari CSV/Excel
|
|
Mendukung semua kolom tracer study 2019-2025
|
|
|
|
File ini adalah router utama yang mendelegasikan ke import_service.py
|
|
"""
|
|
|
|
from fastapi import APIRouter, UploadFile, File, HTTPException, Depends, Form
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy import func
|
|
|
|
from app.config.database import get_db
|
|
from app.services.import_service import import_data
|
|
from app.models.alumni import Alumni
|
|
from app.models.models import TracerResponse, Kompetensi, Pekerjaan
|
|
|
|
router = APIRouter(prefix="", tags=["Import Data"])
|
|
|
|
|
|
@router.post("/import-full")
|
|
async def import_full(
|
|
tahun: str = Form(...),
|
|
file: UploadFile = File(...),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""
|
|
Import CSV dengan SEMUA kolom tracer study.
|
|
Data akan disimpan ke tabel: alumni, pekerjaan, kompetensi, tracer_responses
|
|
"""
|
|
try:
|
|
content = await file.read()
|
|
result = import_data(tahun, content, file.filename, db)
|
|
|
|
if result["status"] == "error":
|
|
raise HTTPException(status_code=400, detail=result["message"])
|
|
|
|
return result
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
db.rollback()
|
|
import traceback
|
|
print(f"Import error: {traceback.format_exc()}")
|
|
raise HTTPException(status_code=400, detail=f"Error: {str(e)}")
|
|
|
|
|
|
@router.get("/stats")
|
|
async def get_import_stats(db: Session = Depends(get_db)):
|
|
"""Ambil statistik data alumni di database"""
|
|
total_alumni = db.query(Alumni).count()
|
|
total_pekerjaan = db.query(Pekerjaan).count()
|
|
total_kompetensi = db.query(Kompetensi).count()
|
|
total_tracer = db.query(TracerResponse).count()
|
|
|
|
prodi_stats = db.query(
|
|
Alumni.kode_prodi,
|
|
func.count(Alumni.id).label('count')
|
|
).group_by(Alumni.kode_prodi).all()
|
|
|
|
tahun_stats = db.query(
|
|
Alumni.tahun_lulus,
|
|
func.count(Alumni.id).label('count')
|
|
).group_by(Alumni.tahun_lulus).order_by(Alumni.tahun_lulus.desc()).all()
|
|
|
|
return {
|
|
"total_alumni": total_alumni,
|
|
"total_pekerjaan": total_pekerjaan,
|
|
"total_kompetensi": total_kompetensi,
|
|
"total_tracer_responses": total_tracer,
|
|
"by_prodi": [{"prodi": p, "count": c} for p, c in prodi_stats],
|
|
"by_tahun": [{"tahun": t, "count": c} for t, c in tahun_stats]
|
|
}
|
|
|
|
|
|
@router.get("/template")
|
|
async def download_template():
|
|
"""Download template CSV untuk import data"""
|
|
import csv
|
|
from fastapi.responses import StreamingResponse
|
|
import io
|
|
|
|
template_data = [
|
|
["nimhsmsmh", "nmmhsmsmh", "kdpstmsmh", "tahun_lulus", "F8", "F5b", "F5c", "F1101", "F5a1", "F5a2", "F1761", "F1763", "F1765", "F1767", "F1769", "F1771", "F1773"],
|
|
["A001", "Nama Alumni 1", "57401", "2024", "1", "PT ABC", "Software Engineer", "3", "Jawa Timur", "Jember", "4", "4", "3", "4", "4", "4", "3"],
|
|
["A002", "Nama Alumni 2", "56401", "2024", "2", "", "", "", "", "", "3", "3", "3", "3", "3", "3", "3"]
|
|
]
|
|
|
|
output = io.StringIO()
|
|
writer = csv.writer(output, delimiter=';')
|
|
for row in template_data:
|
|
writer.writerow(row)
|
|
|
|
output.seek(0)
|
|
return StreamingResponse(
|
|
output,
|
|
media_type='text/csv',
|
|
headers={'Content-Disposition': 'attachment; filename=template_import_alumni.csv'}
|
|
)
|