5d7ab16733
- Portofolio: section "Analisis Proses Asesmen" (dropdown tertutup default) — distribusi huruf mutu, kelompok capaian (mean ± SD), Sub-CPMK terlemah/terkuat, kesenjangan rencana vs realisasi, mahasiswa berisiko, tren lintas tahun ajaran - Portofolio: Nomor Dokumen & Tanggal Terbit terisi otomatis; placeholder contoh di Realisasi Pembelajaran dan Kendala & Tindak Lanjut; tombol "Isi Otomatis" merangkai draf Simpulan dari analisis + realisasi + kendala - Nilai: tabel Kelompok Capaian (Atas/Tengah/Bawah, shading warna) dipindah ke dropdown "Detail Tambahan" bersama Skala Poin/Rincian Bobot/Hasil Ketercapaian; tabel utama tak lagi ada scroll vertikal internal - Nilai: riwayat pengisian dicatat terstruktur (waktu, dosen, aksi, komponen), tanpa batas 8 entri, dengan ringkasan per komponen + dropdown Log Lengkap — mendukung akuntabilitas team teaching - Fix bug data: seed kurikulum menyimpan 'cpl' CPMK sebagai string tunggal, bukan list, sehingga pecah per huruf saat di-join() di tabel Hasil Ketercapaian/Rekap (mis. "CPL-03" -> "C, P, L, -, 0, 3"); dinormalisasi di db.py (runtime) dan tools/extract_seed.py (agar re-seed berikutnya benar) - Hover tooltip deskripsi lengkap di kode Sub-CPMK/CPMK/CPL (halaman Nilai dan Rekap CPL/CPMK) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Ekstrak data kurikulum (CPL, CPMK, MK, Sub-CPMK, matriks) yang ter-embed di
|
|
dashboard pemetaan, lalu simpan sebagai seed/kurikulum.json.
|
|
|
|
Jalankan ulang bila data dashboard diperbarui:
|
|
python tools/extract_seed.py [path_index_html]
|
|
"""
|
|
import json
|
|
import pathlib
|
|
import sys
|
|
|
|
BASE = pathlib.Path(__file__).resolve().parent.parent
|
|
DEFAULT_SRC = BASE.parent / "dashboard-deploy" / "index.html"
|
|
OUT = BASE / "seed" / "kurikulum.json"
|
|
|
|
|
|
def main() -> None:
|
|
src = pathlib.Path(sys.argv[1]) if len(sys.argv) > 1 else DEFAULT_SRC
|
|
html = src.read_text(encoding="utf-8")
|
|
i = html.find('{"cpl"')
|
|
if i < 0:
|
|
raise SystemExit(f"Blok JSON kurikulum tidak ditemukan di {src}")
|
|
data, _ = json.JSONDecoder().raw_decode(html[i:])
|
|
|
|
# sumber dashboard menyimpan 'cpl' CPMK sebagai string tunggal ("CPL-03")
|
|
# untuk CPMK yang cuma mendukung 1 CPL — normalisasi jadi list di sini
|
|
# supaya konsisten dengan pemakai lain (rollup, template |join).
|
|
for v in data.get("cpmk", {}).values():
|
|
if isinstance(v.get("cpl"), str):
|
|
v["cpl"] = [v["cpl"]]
|
|
|
|
OUT.parent.mkdir(parents=True, exist_ok=True)
|
|
OUT.write_text(json.dumps(data, ensure_ascii=False, indent=1), encoding="utf-8")
|
|
|
|
n_sub = sum(
|
|
len(c["subs"]) for mk in data["sub"].values() for c in mk["cpmks"].values()
|
|
)
|
|
print(
|
|
f"[OK] {OUT.name}: {len(data['cpl'])} CPL, {len(data['cpmk'])} CPMK, "
|
|
f"{len(data['mk'])} MK, {n_sub} Sub-CPMK (sumber: {src})"
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|