Commit Graph

23 Commits

Author SHA1 Message Date
Jakub Zych
e1f9807701 test: cover open questions and grading against Postgres 2026-11-09 17:54:13 +01:00
Jakub Zych
80ea79ee3e feat: grade open answers through a grader registry in the background
- graders registry collected at boot from every HasGraders plugin,
  manual first; a duplicate or reserved code fails boot
- grading job on queue quizzes_grading with three attempts; a stale
  or reviewed answer is never touched; the last failure marks it failed
- learning answers enqueue at once, tests at close; a grade
  recalculates a finished attempt and fires AnswerGradedEvent after
  commit
2026-11-09 17:51:55 +01:00
Jakub Zych
297780cb8e feat: add open questions with a pending grading state
- migration: open question type, rubric, max_length, quiz grader and
  the grading and review columns of attempt answers
- open answers are checked, stored as pending and never scored on
  answer; a changed text resets the grading state
- student JSON gains text, grading_status, grader_feedback,
  review_comment, max_length, needs_review and open_answers; the
  rubric is never serialized
2026-11-09 17:48:11 +01:00
Jakub Zych
ef38b81fd9 fix: close expired test attempts at the attempt limit 2026-11-09 15:30:51 +01:00
Jakub Zych
9c29bfd9cf docs: describe the owner quiz tools 2026-11-09 14:34:41 +01:00
Jakub Zych
c6d8d1a973 feat: edit quiz questions over MCP
- quizzes_create_question, update_question, delete_question and
  reorder_questions on /api/v1/quizzes/{slug}/questions
- update_question replaces answers by id (kept, created, deleted), so
  answer ids stored in past attempts stay valid; foreign ids are refused
- classes.CheckQuestion holds the importer's per-question rules, shared
  with the manage routes; attempt scores are never touched (D-16)
2026-11-09 14:33:56 +01:00
Jakub Zych
4a60eda425 feat: create, publish, import and report on quizzes over MCP
- quizzes_create_quiz, update_quiz, delete_quiz (confirm repeats the
  slug), publish, unpublish, import_quiz (the existing import route) and
  quiz_stats on new manage routes
- stats close expired open test attempts first, then report per student
  over completed whole-quiz attempts and per question over every
  completed attempt
- input is checked before the database; TestManageAPIAgainstDatabase is
  written and skipped under -short
2026-11-09 14:30:31 +01:00
Jakub Zych
e615cc88db feat: list and show quizzes over MCP for their owner
- quizzes_list_quizzes and quizzes_show_quiz bound to GET /api/v1/quizzes
  and /api/v1/quizzes/{slug} behind user.api_token, the per-user
  golem15.quizzes.manage throttle, a scope and the access_quizzes permission
- the permission is grantable through pact.HasFrontendPermissions
- owner JSON shapes with solutions in manage_json.go, never used by a
  student route
2026-11-09 14:25:07 +01:00
Jakub Zych
174be3bcbd docs: describe test mode 2026-11-09 14:10:25 +01:00
Jakub Zych
8405daf6a4 test: cover test mode against Postgres 2026-11-09 14:10:25 +01:00
Jakub Zych
487d573208 feat: enforce attempt limits, time limits and one-way tests
- Service.Start resumes an open test attempt, closes expired ones at
  their deadline and refuses a start past max_attempts under an
  advisory lock; StartAttempt stays as a wrapper
- answers to a test are accepted until the deadline plus
  golem15.quizzes.test.grace_seconds; one_way answers are final
- a test covers the whole quiz and keeps a stable per-attempt order
- 409 bodies carry a code; list and attempt rows carry attempts_left,
  question_types and seconds_left; import accepts the test keys
2026-11-09 14:07:37 +01:00
Jakub Zych
6c6ecae9d8 feat: add test mode to quizzes and withhold its solutions
- mode, navigation and max_attempts columns with Go-side defaults
- classes.Withheld gates every solution field of the answer feedback
  and the attempt result while a test attempt is open
- a test's quiz detail lists no questions before the attempt starts
- admin fields and lang keys for the three settings
2026-11-09 14:03:34 +01:00
Jakub Zych
67a83dba32 feat: plugin.yaml manifest for the SummerCMS marketplace v0.1.1 2026-10-29 23:19:31 +01:00
Jakub Zych
362dc02786 chore: pin v0.1.0 release dependencies v0.1.0 2026-10-07 11:18:06 +02:00
Jakub Zych
032f2da17f feat: serve quizzes:import over HTTP behind the shared user API token
POST /api/v1/quizzes/import runs behind golem15.user's user.api_token with
the write scope and the golem15.quizzes.access_quizzes permission.
2026-10-04 23:15:01 +02:00
Jakub Zych
a5be13c2be fix: include answer_text of self_check questions in the quiz payload 2026-10-02 14:44:15 +02:00
Jakub Zych
2945a286d4 docs: describe the quizzes plugin, its API and the import format 2026-10-02 14:21:58 +02:00
Jakub Zych
d05bee4e50 feat: add the quizzes:import command for JSON quiz files 2026-10-02 14:20:33 +02:00
Jakub Zych
793cc4aac0 feat: add admin controllers, permissions and navigation for quizzes and attempts 2026-10-02 14:17:43 +02:00
Jakub Zych
effe640549 feat: serve the quiz API under /_quizzes/api/v1 behind jwt.auth 2026-10-02 14:13:30 +02:00
Jakub Zych
4d4da5dc14 feat: score single, multiple and self-check answers with configurable partial credit and penalty 2026-10-02 14:05:41 +02:00
Jakub Zych
ed167d8450 feat: add quiz, question, answer and attempt models with migrations 2026-10-02 14:04:36 +02:00
Jakub Zych
a01a75d49b chore: scaffold the plugin with summer make:plugin 2026-10-02 13:57:17 +02:00