9be6bd03e3
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>
138 lines
7.4 KiB
Markdown
138 lines
7.4 KiB
Markdown
# Aplikasi Penyusunan RPS & Portofolio — Prodi Informatika UNTAN
|
||
|
||
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`.
|
||
|
||
## Menjalankan lokal
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
uvicorn app.main:app --reload
|
||
# buka http://localhost:8000
|
||
```
|
||
|
||
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
|
||
|
||
Prasyarat: kode berada di repositori Git yang bisa diakses Coolify
|
||
(mis. GitHub private repo). `data/` di-gitignore — nilai mahasiswa tidak
|
||
pernah ikut ke repositori.
|
||
|
||
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.
|
||
|
||
Healthcheck sudah terpasang di Dockerfile (`/login`); uvicorn berjalan
|
||
dengan `--proxy-headers` agar cocok di belakang proxy Coolify.
|
||
|
||
## Status fitur
|
||
|
||
- [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.
|