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:
@@ -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 40–74 %, 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.
|
||||
|
||||
Reference in New Issue
Block a user