Merge branch 'fitur/peringatan-komponen-tanpa-subcpmk' into main
This commit is contained in:
+19
@@ -327,6 +327,19 @@ def _normalisasi_komponen(tersimpan: list[dict]) -> list[dict]:
|
|||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def _komponen_tanpa_sub(rps_data: dict) -> list[str]:
|
||||||
|
"""Nama komponen RPS bagian G yang bobotnya sudah diisi tapi belum ada
|
||||||
|
Sub-CPMK dicentang. Komponen begini masih ikut dihitung ke total 100% di
|
||||||
|
bagian G (jadi mudah lolos tanpa disadari), tapi disaring habis oleh
|
||||||
|
_komponen_daftar() — tidak akan pernah muncul di halaman Nilai."""
|
||||||
|
out = []
|
||||||
|
for k in _normalisasi_komponen(rps_data.get("komponen", [])):
|
||||||
|
bobot_terisi = str(k.get("bobot") or "").strip() not in ("", "0", "0.0")
|
||||||
|
if bobot_terisi and not k.get("subs"):
|
||||||
|
out.append(k["nama"])
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
def minggu_default() -> list[dict]:
|
def minggu_default() -> list[dict]:
|
||||||
rows = []
|
rows = []
|
||||||
for w in range(1, 17):
|
for w in range(1, 17):
|
||||||
@@ -456,6 +469,7 @@ def form_rps(request: Request, kode: str, pesan: str = ""):
|
|||||||
f.setdefault("referensi_teks", "\n".join(f.get("referensi", [])))
|
f.setdefault("referensi_teks", "\n".join(f.get("referensi", [])))
|
||||||
f["komponen"] = _normalisasi_komponen(f.get("komponen", []))
|
f["komponen"] = _normalisasi_komponen(f.get("komponen", []))
|
||||||
ctx_status = tersimpan
|
ctx_status = tersimpan
|
||||||
|
komponen_tanpa_sub = _komponen_tanpa_sub(f)
|
||||||
else:
|
else:
|
||||||
f = form_kosong()
|
f = form_kosong()
|
||||||
# prefill SKS & semester dari data kurikulum (sheet '14. Susunan MK')
|
# prefill SKS & semester dari data kurikulum (sheet '14. Susunan MK')
|
||||||
@@ -465,6 +479,7 @@ def form_rps(request: Request, kode: str, pesan: str = ""):
|
|||||||
if info.get("semester"):
|
if info.get("semester"):
|
||||||
f["identitas"]["semester"] = str(info["semester"])
|
f["identitas"]["semester"] = str(info["semester"])
|
||||||
ctx_status = {"status": "", "updated_at": "", "updated_by": ""}
|
ctx_status = {"status": "", "updated_at": "", "updated_by": ""}
|
||||||
|
komponen_tanpa_sub = [] # form belum pernah disimpan — bobot masih bawaan default
|
||||||
peta = _terapkan_override_sub(peta, f)
|
peta = _terapkan_override_sub(peta, f)
|
||||||
return render(
|
return render(
|
||||||
request, "form_rps.html",
|
request, "form_rps.html",
|
||||||
@@ -473,6 +488,7 @@ def form_rps(request: Request, kode: str, pesan: str = ""):
|
|||||||
"tahun": db.tahun_aktif(), "pesan": pesan,
|
"tahun": db.tahun_aktif(), "pesan": pesan,
|
||||||
"boleh_edit": boleh_rps(request.state.user, kode),
|
"boleh_edit": boleh_rps(request.state.user, kode),
|
||||||
"tahun_lain": db.tahun_rps_lain(kode) if not tersimpan else [],
|
"tahun_lain": db.tahun_rps_lain(kode) if not tersimpan else [],
|
||||||
|
"komponen_tanpa_sub": komponen_tanpa_sub,
|
||||||
"sub_uraian": {s["kode"]: s["uraian"] for s in peta["subs"]}},
|
"sub_uraian": {s["kode"]: s["uraian"] for s in peta["subs"]}},
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -946,6 +962,8 @@ def _konteks_nilai(request, kode, pesan="", peringatan=None):
|
|||||||
terdaftar = db.mahasiswa_mk(kode)
|
terdaftar = db.mahasiswa_mk(kode)
|
||||||
grid = _grid_mahasiswa(tersimpan, terdaftar, kelas_dosen)
|
grid = _grid_mahasiswa(tersimpan, terdaftar, kelas_dosen)
|
||||||
komponen_daftar = _komponen_daftar(kode)
|
komponen_daftar = _komponen_daftar(kode)
|
||||||
|
rps_cek = db.ambil_rps(kode)
|
||||||
|
komponen_tanpa_sub = _komponen_tanpa_sub(rps_cek["data"]) if rps_cek else []
|
||||||
sesi_semua = (tersimpan["data"].get("sesi") or {}) if tersimpan else {}
|
sesi_semua = (tersimpan["data"].get("sesi") or {}) if tersimpan else {}
|
||||||
bobot_komponen, bobot_sub_rincian = _rincian_bobot(kode)
|
bobot_komponen, bobot_sub_rincian = _rincian_bobot(kode)
|
||||||
# Nilai Akhir dihitung hanya dari Sub-CPMK yang sudah ternilai (lihat
|
# Nilai Akhir dihitung hanya dari Sub-CPMK yang sudah ternilai (lihat
|
||||||
@@ -983,6 +1001,7 @@ def _konteks_nilai(request, kode, pesan="", peringatan=None):
|
|||||||
"grid": grid, "kelas_dosen": kelas_dosen, "tidak_lengkap": tidak_lengkap,
|
"grid": grid, "kelas_dosen": kelas_dosen, "tidak_lengkap": tidak_lengkap,
|
||||||
"dikatrol": dikatrol,
|
"dikatrol": dikatrol,
|
||||||
"komponen_daftar": komponen_daftar,
|
"komponen_daftar": komponen_daftar,
|
||||||
|
"komponen_tanpa_sub": komponen_tanpa_sub,
|
||||||
"tabel_komponen": _tabel_komponen(grid, komponen_daftar, sesi_semua) if komponen_daftar else [],
|
"tabel_komponen": _tabel_komponen(grid, komponen_daftar, sesi_semua) if komponen_daftar else [],
|
||||||
"bobot_komponen": bobot_komponen, "bobot_sub_rincian": bobot_sub_rincian,
|
"bobot_komponen": bobot_komponen, "bobot_sub_rincian": bobot_sub_rincian,
|
||||||
"tabel_poin": _tabel_poin(grid, bobot_sub_rincian) if bobot_sub_rincian else [],
|
"tabel_poin": _tabel_poin(grid, bobot_sub_rincian) if bobot_sub_rincian else [],
|
||||||
|
|||||||
@@ -17,6 +17,13 @@
|
|||||||
{% if pesan %}<div class="info">{{ pesan }}</div>{% endif %}
|
{% if pesan %}<div class="info">{{ pesan }}</div>{% endif %}
|
||||||
{% for w in peringatan %}<div class="peringatan">{{ w }}</div>{% endfor %}
|
{% for w in peringatan %}<div class="peringatan">{{ w }}</div>{% endfor %}
|
||||||
|
|
||||||
|
{% if komponen_tanpa_sub %}
|
||||||
|
<div class="peringatan">RPS MK ini sudah punya bobot untuk <b>{{ komponen_tanpa_sub|join(', ') }}</b>,
|
||||||
|
tapi belum ada Sub-CPMK yang dicentang di bagian G — makanya komponen itu
|
||||||
|
{% if not komponen_daftar %}tidak muncul sama sekali{% else %}belum ikut muncul{% endif %}
|
||||||
|
di "Isi per Komponen" di bawah. <a href="/rps/{{ peta.kode }}">Buka RPS →</a> lalu centang Sub-CPMK-nya.</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if komponen_daftar %}
|
{% if komponen_daftar %}
|
||||||
<h2 class="bagian">ISI PER KOMPONEN</h2>
|
<h2 class="bagian">ISI PER KOMPONEN</h2>
|
||||||
<table class="grid" style="max-width:760px">
|
<table class="grid" style="max-width:760px">
|
||||||
|
|||||||
@@ -178,6 +178,12 @@
|
|||||||
komponen yang tidak dipakai MK ini (opsional), tapi total seluruh komponen yang diisi harus
|
komponen yang tidak dipakai MK ini (opsional), tapi total seluruh komponen yang diisi harus
|
||||||
tepat 100%. Centang Sub-CPMK yang dinilai tiap komponen; setiap Sub-CPMK harus tercakup minimal
|
tepat 100%. Centang Sub-CPMK yang dinilai tiap komponen; setiap Sub-CPMK harus tercakup minimal
|
||||||
satu komponen agar CPMK/CPL-nya terukur.</p>
|
satu komponen agar CPMK/CPL-nya terukur.</p>
|
||||||
|
{% if komponen_tanpa_sub %}
|
||||||
|
<div class="peringatan">Bobot sudah terisi tapi <b>belum ada Sub-CPMK dicentang</b> untuk:
|
||||||
|
{{ komponen_tanpa_sub|join(', ') }}. Komponen begini ikut dihitung ke total 100% di bawah,
|
||||||
|
tapi <b>tidak akan muncul</b> di halaman Input Nilai — centang minimal satu Sub-CPMK di
|
||||||
|
tiap baris sebelum menyimpan.</div>
|
||||||
|
{% endif %}
|
||||||
<div class="gulir">
|
<div class="gulir">
|
||||||
<table class="grid">
|
<table class="grid">
|
||||||
<thead>
|
<thead>
|
||||||
|
|||||||
Reference in New Issue
Block a user