4 Commits

Author SHA1 Message Date
Power BI Dev e31f8e57dd Merge branch 'fix/rps-docx-baris-salah-sasaran' into main 2026-08-09 21:56:12 +07:00
Power BI Dev 374bdb5565 Perbaiki isi RPS unduhan yang nyasar ke baris salah (Peta CPL, Deskripsi, dst)
build_rps() mengisi blok naratif (Peta CPL-CPMK, Deskripsi Singkat MK,
Bahan Kajian, Pustaka, Media, Dosen Pengampu, MK Prasyarat) lewat
t.cell(18, 2) dst -- indeks baris tetap sesuai template asli (39 baris).
Tapi baris-baris itu dieksekusi SETELAH daftar CPL/CPMK/Sub-CPMK
digandakan & baris contohnya dibuang -- jumlah baris yang disisipkan
beda-beda tiap MK (tergantung berapa CPL/CPMK/Sub-CPMK-nya), jadi
t.cell(18, 2) di tabel yang sudah berubah itu tidak lagi menunjuk baris
"Peta CPL-CPMK" yang dimaksud. Teks jadi nyasar ke sel/baris lain,
termasuk kolom sempit -- terlihat sebagai puluhan halaman teks terpotong
huruf demi huruf.

Pola yang benar sudah dipakai untuk tabel mingguan (trs[31], trs[33],
dst -- referensi elemen XML baris asli yang dibekukan di awal, tak
ikut bergeser). Terapkan pola sama (helper cell()) untuk blok naratif
yang kelewat.

Diverifikasi: label & isi sekarang sejajar benar (baris "Peta CPL - CP
MK" berisi peta CPMK->CPL, bukan lagi nama dosen pengampu), dokumen
turun dari puluhan halaman rusak jadi 2 halaman rapi untuk bagian ini.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-09 21:42:01 +07:00
Power BI Dev de65ca99e6 Merge branch 'ubah/teks-peringatan-subcpmk-komponen' into main 2026-08-09 20:58:45 +07:00
Power BI Dev adf2918e85 Ubah teks peringatan Sub-CPMK-komponen: fokus ke "belum ditautkan"
Framing lama ("RPS sudah punya bobot untuk X, tapi belum ada Sub-CPMK
dicentang") terkesan seperti pengisian sengaja yang cuma kurang
langkah terakhir. Padahal akar masalahnya sering kali bobot bawaan
aplikasi (KOMPONEN_DEFAULT) yang belum pernah disentuh dosen sama
sekali — reframing ke "Sub-CPMK belum ditautkan ke komponen penilaian"
lebih jujur ke kondisi sebenarnya.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-09 20:56:18 +07:00
3 changed files with 22 additions and 15 deletions
+15 -8
View File
@@ -130,6 +130,13 @@ def build_rps(d: dict) -> bytes:
trs = [r._tr for r in t.rows] # indeks baris template asli trs = [r._tr for r in t.rows] # indeks baris template asli
def cell(idx, col):
"""Ambil sel dari baris ASLI template lewat trs[idx] (referensi XML
beku), bukan t.cell(idx, col) yang ikut bergeser tiap kali baris
CPL/CPMK/Sub-CPMK digandakan/dibuang di atasnya — pakai t.cell()
langsung untuk baris di bawah blok itu akan salah sasaran."""
return _Row(trs[idx], t).cells[col]
def isi_daftar(proto_idx, hapus_idx, items, kolom_kode=2, kolom_isi=5): def isi_daftar(proto_idx, hapus_idx, items, kolom_kode=2, kolom_isi=5):
"""Isi blok daftar (CPL/CPMK/Sub-CPMK): prototipe digandakan per item.""" """Isi blok daftar (CPL/CPMK/Sub-CPMK): prototipe digandakan per item."""
proto = trs[proto_idx] proto = trs[proto_idx]
@@ -153,17 +160,17 @@ def build_rps(d: dict) -> bytes:
f"{c['kode']}{', '.join(c.get('cpl', [])) or '-'}" f"{c['kode']}{', '.join(c.get('cpl', [])) or '-'}"
for c in d.get("cpmk", []) for c in d.get("cpmk", [])
) )
_set_text(t.cell(18, 2), peta_txt) _set_text(cell(18, 2), peta_txt)
_set_text(t.cell(19, 2), d.get("deskripsi", "")) _set_text(cell(19, 2), d.get("deskripsi", ""))
_set_text(t.cell(20, 2), d.get("bahan_kajian", "")) _set_text(cell(20, 2), d.get("bahan_kajian", ""))
utama = d.get("referensi", []) utama = d.get("referensi", [])
pendukung = d.get("referensi_pendukung", []) pendukung = d.get("referensi_pendukung", [])
_set_text(t.cell(22, 2), "\n".join(f"{i}. {r}" for i, r in enumerate(utama, 1))) _set_text(cell(22, 2), "\n".join(f"{i}. {r}" for i, r in enumerate(utama, 1)))
_set_text(t.cell(24, 2), "\n".join(f"{i}. {r}" for i, r in enumerate(pendukung, 1))) _set_text(cell(24, 2), "\n".join(f"{i}. {r}" for i, r in enumerate(pendukung, 1)))
_set_text(t.cell(25, 2), d.get("media", "")) _set_text(cell(25, 2), d.get("media", ""))
_set_text(t.cell(26, 2), ident.get("pengampu", "")) _set_text(cell(26, 2), ident.get("pengampu", ""))
_set_text(t.cell(27, 2), ident.get("prasyarat") or "") _set_text(cell(27, 2), ident.get("prasyarat") or "")
# ── tabel mingguan ── # ── tabel mingguan ──
proto_norm, proto_uts, proto_uas = trs[31], trs[33], trs[37] proto_norm, proto_uts, proto_uas = trs[31], trs[33], trs[37]
+3 -3
View File
@@ -18,9 +18,9 @@
{% for w in peringatan %}<div class="peringatan">{{ w }}</div>{% endfor %} {% for w in peringatan %}<div class="peringatan">{{ w }}</div>{% endfor %}
{% if komponen_tanpa_sub %} {% if komponen_tanpa_sub %}
<div class="peringatan">RPS MK ini sudah punya bobot untuk <b>{{ komponen_tanpa_sub|join(', ') }}</b>, <div class="peringatan"><b>Sub-CPMK belum ditautkan ke komponen penilaian</b> untuk
tapi belum ada Sub-CPMK yang dicentang di bagian G — makanya komponen itu {{ komponen_tanpa_sub|join(', ') }} — segera isi di RPS bagian G. Selama belum ditautkan,
{% if not komponen_daftar %}tidak muncul sama sekali{% else %}belum ikut muncul{% endif %} 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 &rarr;</a> lalu centang Sub-CPMK-nya.</div> di "Isi per Komponen" di bawah. <a href="/rps/{{ peta.kode }}">Buka RPS &rarr;</a> lalu centang Sub-CPMK-nya.</div>
{% endif %} {% endif %}
+4 -4
View File
@@ -179,10 +179,10 @@
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 %} {% if komponen_tanpa_sub %}
<div class="peringatan">Bobot sudah terisi tapi <b>belum ada Sub-CPMK dicentang</b> untuk: <div class="peringatan"><b>Sub-CPMK belum ditautkan ke komponen penilaian</b> — segera centang
{{ komponen_tanpa_sub|join(', ') }}. Komponen begini ikut dihitung ke total 100% di bawah, minimal satu Sub-CPMK untuk: {{ komponen_tanpa_sub|join(', ') }}. Tanpa tautan ini, komponen
tapi <b>tidak akan muncul</b> di halaman Input Nilai — centang minimal satu Sub-CPMK di tersebut <b>tidak akan muncul</b> di halaman Input Nilai meski bobotnya sudah dihitung ke
tiap baris sebelum menyimpan.</div> total 100% di bawah.</div>
{% endif %} {% endif %}
<div class="gulir"> <div class="gulir">
<table class="grid"> <table class="grid">