Gabungkan aplikasi RPS & Portofolio OBE (dashboard jadi bagian aplikasi)

Dashboard pemetaan statis kini dilayani aplikasi di /dashboard
(app/static/dashboard.html). Fitur lengkap Tahap 1-4 + dasbor monitoring,
menu global, filter semester, input nilai langsung, penggabungan nilai
team teaching, tabel bisa urut. Dockerfile berubah dari nginx statis ke
uvicorn/FastAPI: healthcheck, proxy-headers, volume /data (SQLite).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Power BI Dev
2026-07-18 12:05:28 +07:00
parent 3405dc21ff
commit 9be6bd03e3
42 changed files with 11366 additions and 53 deletions
+125 -48
View File
@@ -1,60 +1,137 @@
# OBE-Mapping — Dashboard Pemetaan CPMK
# Aplikasi Penyusunan RPS & Portofolio — Prodi Informatika UNTAN
Dashboard interaktif **one-page** untuk pemetaan capaian pembelajaran Kurikulum OBE
**Prodi Informatika (S-1) · Fakultas Teknik · Universitas Tanjungpura**.
Web app untuk dosen menyusun **RPS (APTIKOM 2024)** dan **Portofolio MK** dengan
keluaran .docx berformat identik template resmi, sekaligus mesin pengukuran
ketercapaian CPL/CPMK (Kurikulum OBE). Rancangan lengkap: `RANCANGAN.md`.
Sumber data: `Dokumen_9_RPS_Rumusan_Pemetaan_CPMK.docx` (BAB IX — RPS).
## Isi data
| Entitas | Jumlah |
|-----------|--------|
| CPL | 10 |
| CPMK | 34 |
| Mata Kuliah | 49 |
| Sub-CPMK | 549 |
## Fitur
- **Kartu ringkasan (KPI)** — total CPL / CPMK / MK / Sub-CPMK.
- **Diagram alur Sankey** CPL → CPMK → MK (SVG murni, offline).
- **Matriks pemetaan MK × CPL** interaktif (filter, sorot kolom).
- **Explorer bertingkat** CPL → CPMK → Sub-CPMK.
- **Pencarian Mata Kuliah** + modal detail CPMK & Sub-CPMK.
- **Analisis cakupan & deteksi celah** pemetaan.
- **Linked highlighting** lintas panel, **pencarian global**, **mode terang/gelap**,
**ekspor CSV/PDF**, **deep-link** (URL hash).
Seluruh data ter-_embed_ di dalam `Dashboard_Pemetaan_CPMK.html`**berjalan tanpa internet**
dan tanpa server backend.
## Struktur repo
## Menjalankan lokal
```bash
pip install -r requirements.txt
uvicorn app.main:app --reload
# buka http://localhost:8000
```
Dashboard_Pemetaan_CPMK.html # dashboard (file utama, semua data ter-embed)
Dockerfile # nginx menyajikan dashboard di "/"
README.md
Database SQLite dibuat otomatis di `data/app.db` (atau path di env `DB_PATH`).
Tahun ajaran aktif diatur lewat env `TAHUN_AJARAN` (default: "2026/2027 Ganjil").
## Memperbarui data kurikulum
Data CPL/CPMK/MK/Sub-CPMK di-seed dari dashboard pemetaan:
```bash
python tools/extract_seed.py # baca ../dashboard-deploy/index.html
python tools/extract_seed.py <path> # atau sumber lain
```
Re-seed tidak menyentuh isian RPS dosen (tersimpan terpisah di SQLite).
Dashboard Pemetaan CPMK (buatan user) ikut disajikan di rute **`/dashboard`**
dari salinan `app/static/dashboard.html`. Bila dashboard sumber diperbarui,
salin ulang dan re-seed sekaligus:
```bash
cp ../dashboard-deploy/index.html app/static/dashboard.html
python tools/extract_seed.py
```
## Deploy via Coolify
1. **New Resource → Application** dari repo Git ini (`OBE-Mapping`, branch `main`).
2. **Build Pack: Dockerfile** (otomatis terdeteksi dari `Dockerfile` di root).
3. **Port: 80**.
4. Set **Domain** sesuai kebutuhan, lalu **Deploy**.
Prasyarat: kode berada di repositori Git yang bisa diakses Coolify
(mis. GitHub private repo). `data/` di-gitignore — nilai mahasiswa tidak
pernah ikut ke repositori.
Setiap `git push` ke `main` akan memicu rebuild & redeploy otomatis bila webhook Coolify aktif.
1. Push repo ini ke GitHub (private), hubungkan ke Coolify:
**New Resource → Application → Private Repository**, Build Pack:
**Dockerfile**, Port **8000**.
2. Tambahkan **volume persisten** ke `/data` (wajib — tempat SQLite;
tanpa ini data hilang tiap redeploy).
3. Env (opsional, ada default): `TAHUN_AJARAN` (mis. `2026/2027 Ganjil`;
hanya fallback awal — tahun aktif selanjutnya diatur di `/metodologi`),
`FAKULTAS`, `PRODI` (kop dokumen .docx).
4. Deploy, buka domainnya → kunjungan pertama membuka `/setup` untuk
membuat akun kaprodi.
5. **Memindahkan data lokal ke server** (bila isian lokal mau dibawa):
unduh `/cadangan.db` dari instalasi lokal, lalu salin ke volume server
sebagai `/data/app.db` (`docker cp cadangan.db <container>:/data/app.db`
lalu restart), atau mulai bersih dari `/setup`.
6. Tombol PDF butuh LibreOffice — aktifkan baris `apt-get install
libreoffice-writer` di Dockerfile bila diperlukan (image +±700 MB);
tanpa itu pengguna diarahkan unduh .docx.
### Alternatif (tanpa Dockerfile)
Healthcheck sudah terpasang di Dockerfile (`/login`); uvicorn berjalan
dengan `--proxy-headers` agar cocok di belakang proxy Coolify.
Coolify juga bisa pakai **Static Site** build pack: salin/rename file menjadi `index.html`
dan arahkan _publish directory_ ke root repo.
## Status fitur
## Pengembangan lokal
Cukup buka `Dashboard_Pemetaan_CPMK.html` langsung di browser, atau jalankan server statis:
```bash
python -m http.server 8080
# buka http://localhost:8080/Dashboard_Pemetaan_CPMK.html
```
- [x] Tahap 1 — MVP RPS: beranda status 49 MK, form RPS (CPL/CPMK/Sub-CPMK
otomatis dari pemetaan, validasi bobot 100 %, cek cakupan Sub-CPMK),
unduh .docx **format resmi UNTAN** (template asli diisi langsung — logo,
merge, dan tata letak terjaga; + lampiran kisi-kisi asesmen), arsip versi
saat "selesai". Fakultas/prodi pada kop diatur env `FAKULTAS` / `PRODI`.
- [x] Tahap 2 — Portofolio + Pengukuran: input nilai per MK di `/nilai/<kode>`
(unggah Excel per mahasiswa dari template yang digenerate aplikasi, atau
ketik rata-rata → ditandai "bukti agregat"); mesin roll-up bagi rata
Sub-CPMK → CPMK → CPL (`app/hitung.py`); halaman `/rekap` (skor CPL/CPMK
prodi, status vs ambang, kelengkapan bukti, penyumbang terlemah);
`/metodologi` (dokumentasi rumus + pengaturan ambang/skala huruf, bisa
dicetak); form portofolio `/portofolio/<kode>` + unduh .docx (Cover,
Pengesahan, CPL, korelasi, rencana penilaian, matriks nilai mahasiswa,
evaluasi ketercapaian, statistik & simpulan — struktur mengikuti
`Contoh Portofolio MK 040126.xlsx`).
- [x] Tahap 3 — Penyempurnaan:
- **Tahun ajaran dinamis** — diatur di `/metodologi`; semua form & rekap
mengikuti tahun aktif, data tahun lama tetap tersimpan.
- **Duplikasi RPS antar tahun ajaran** — tombol "Salin dari <tahun>"
muncul di form RPS yang masih kosong; hasil salinan berstatus draft
dan tidak pernah menimpa isian tahun aktif.
- **Data SKS + semester per MK** (`seed/sks.json`, dari sheet
`14. Susunan MK`; perbarui: `python tools/extract_sks.py`) — dipakai
untuk prefill form RPS dan mengaktifkan **roll-up tertimbang SKS**
(opsi di `/metodologi`).
- **Riwayat lintas semester** (`/rekap/riwayat`) — matriks skor CPL ×
tahun ajaran + kelengkapan bukti, untuk melihat tren.
- **Cadangan** — `/cadangan.json` (seluruh isian, termasuk arsip &
pengaturan) dan `/cadangan.db` (file SQLite mentah).
- **Ekspor PDF** — `/rps/<kode>/unduh.pdf` & `/portofolio/<kode>/unduh.pdf`
via LibreOffice bila terpasang di server; bila tidak, pengguna diarahkan
unduh .docx (lihat catatan Dockerfile).
- [x] Tahap 4 — Akun & privasi nilai (14 Jul 2026):
- **Login dengan NIP** (username = NIP, password awal = NIP; hash PBKDF2,
cookie sesi HttpOnly). Kunjungan pertama saat belum ada akun membuka
`/setup` untuk membuat akun kaprodi. "Reset password" di `/admin`
mengembalikan password ke NIP.
- **Dua peran** — *kaprodi*: kelola akun & reset password (`/admin`),
penugasan MK per dosen, pengaturan prodi, cadangan; *dosen*: mengedit
RPS/portofolio dan mengakses nilai hanya pada MK yang ditugaskan
(RPS/porto MK lain tetap terbuka baca; unduhan portofolio yang memuat
nilai mahasiswa ikut dibatasi). Nama penyimpan (`updated_by`) otomatis
dari akun login.
- **Impor daftar mahasiswa** — kaprodi mengunggah satu Excel kontrak
semester (NPM, Nama, Kode MK, Kelas; template dari `/admin`); daftar ini
mengisi otomatis template nilai tiap MK.
- [x] Dasbor monitoring (`/pantau`, 18 Jul 2026): grafik ketercapaian CPL &
CPMK semester berjalan vs ambang (SVG tanpa library, warna mengikuti
status), kelengkapan proses dokumen RPS → Nilai → Portofolio, tren skor
CPL lintas tahun ajaran (sparkline, tampil bila ≥ 2 tahun berdata), dan
daftar "perlu perhatian": CPL di bawah ambang + penyumbang terlemahnya,
serta MK yang belum setor nilai lengkap dengan pengampunya.
- [x] Kerapian navigasi & team teaching (18 Jul 2026):
- **Menu global** di semua halaman (base.html) menggantikan tautan
ad-hoc per halaman; halaman aktif ditandai; Cadangan pindah ke `/admin`.
- **Filter semester di beranda** (kolom Smt dari `seed/sks.json`) dengan
KPI yang menghitung ulang sesuai filter + persentase berwarna
(hijau ≥ 75 %, kuning 4074 %, merah < 40 %).
- **Semua tabel bisa diurut** klik header naik/turun (`static/tabel.js`;
tabel di dalam form dilewati, baris total tetap di bawah).
- **Team teaching nilai**: unggahan Excel **menggabung** per sel — tiap
dosen mengunggah bagiannya (kolom Sub-CPMK sebelum/sesudah UTS atau
baris mahasiswa kelasnya) tanpa menimpa dosen lain; riwayat unggahan
tercatat per file+dosen; tombol "Mulai Ulang" menghapus total; mode
rata-rata ditolak bila data per-mahasiswa sudah ada. Halaman nilai
dirapikan: satu metodologi, cara agregat dilipat sebagai alternatif.
- **Input nilai langsung di aplikasi** (cara utama): tabel mahasiswa ×
Sub-CPMK yang bisa diketik, terisi otomatis dari impor kaprodi + nilai
tersimpan; menyimpan mengganti seluruh isi tabel dengan yang tampil.
Unggah Excel tetap tersedia (dilipat) untuk nilai yang sudah direkap
atau team teaching yang mengisi terpisah.