2026-08-08 11:57:08 +07:00
|
|
|
[alembic]
|
|
|
|
|
script_location = migrations
|
|
|
|
|
prepend_sys_path = .
|
|
|
|
|
# sqlalchemy.url DIISI runtime dari env DATABASE_URL (lihat migrations/env.py)
|
|
|
|
|
sqlalchemy.url =
|
|
|
|
|
|
|
|
|
|
[loggers]
|
|
|
|
|
keys = root,sqlalchemy,alembic
|
|
|
|
|
|
|
|
|
|
[handlers]
|
|
|
|
|
keys = console
|
|
|
|
|
|
|
|
|
|
[formatters]
|
|
|
|
|
keys = generic
|
|
|
|
|
|
|
|
|
|
[logger_root]
|
|
|
|
|
level = WARN
|
|
|
|
|
handlers = console
|
|
|
|
|
qualname =
|
|
|
|
|
|
|
|
|
|
[logger_sqlalchemy]
|
|
|
|
|
level = WARN
|
|
|
|
|
handlers =
|
|
|
|
|
qualname = sqlalchemy.engine
|
|
|
|
|
|
|
|
|
|
[logger_alembic]
|
feat(quiz): strict focus-loss anti-cheat + audit attempt
Kebijakan strict: kehilangan fokus saat kuis aktif langsung mengakhiri kuis
dengan penalti, satu attempt per kuis tercatat audit, pembahasan disembunyikan
saat focus_lost, badge pelanggaran muncul di laporan guru.
Backend:
- tabel quiz_attempts (migration 0002) + endpoint POST /quiz-attempts/submit
idempotent dengan unique constraint (satu attempt per token+lesson, 409
untuk duplikat), bounded termination_reason
- models/repositories/storage: QuizAttempt + record/query pelanggaran untuk
laporan guru (progress)
Frontend:
- quiz-integrity.ts: policy hub (isFocusLossEvent, terminateQuiz,
shouldShowQuizReview) + attempt_id via crypto.randomUUID()
- lesson.svelte.ts: finalisasi idempotent; sendBeacon untuk exit path yang
bisa suspend (focus_lost/page_unload), fetch keepalive untuk reason lain
- QuizTab.svelte: summary menyembunyikan pembahasan saat focus_lost
- progress/+page.svelte: badge pelanggaran focus_lost di laporan guru
- APP_VERSION 26 -> 27
Tests & docs:
- 204 backend test pass (unit host + integrasi container, DB elemes_test)
- 107 frontend test pass, svelte-check 0 error
- docs/12-quiz-integrity.md (baru), docs/07-quiz-authoring.md + README FAQ
anti-cheat diperbarui
2026-08-11 20:55:39 +07:00
|
|
|
# WARN = hanya warning/error yang tampil (output CLI rapi).
|
|
|
|
|
# Set ke INFO bila ingin melihat baris progres "Running upgrade X -> Y".
|
|
|
|
|
level = WARN
|
2026-08-08 11:57:08 +07:00
|
|
|
handlers =
|
|
|
|
|
qualname = alembic
|
|
|
|
|
|
|
|
|
|
[handler_console]
|
|
|
|
|
class = StreamHandler
|
|
|
|
|
args = (sys.stderr,)
|
|
|
|
|
level = NOTSET
|
|
|
|
|
formatter = generic
|
|
|
|
|
|
|
|
|
|
[formatter_generic]
|
|
|
|
|
format = %(levelname)-5.5s [%(name)s] %(message)s
|
|
|
|
|
datefmt = %H:%M:%S
|