Commit Graph

29 Commits

Author SHA1 Message Date
Jakub Zych
76546d5d50 docs: describe open questions, graders and the review queue
- open type, grading states and student labels, provisional scores
- grader contract (HasGraders, Input with the untrusted answer, Result,
  retries, the reserved manual code, the grading queue)
- the three events, the student-tool rules, review routes and tools,
  the Do oceny screen and the import fields; plugin.yaml regenerated
2026-11-09 18:40:22 +01:00
Jakub Zych
9688b4d552 feat: carry open questions and the grader through import and the quiz tools
- import document, manage routes and MCP question tools take rubric and
  max_length; open questions refuse answers, max_length is 1..20000 and
  both apply to open questions only
- quizzes take a grader; the manage routes refuse a code the registry
  does not know, the import accepts any well-formed code
- quiz stats report unreviewed open answers and their average points
- import_quiz warns that replace deletes the grades and reviews
2026-11-09 18:36:20 +01:00
Jakub Zych
2ad4e8b1ec feat: review open answers in the admin and pick a grader per quiz
- Do oceny admin screen (golem15.quizzes.reviews) over the open answers,
  with a read-only context partial, score and comment virtual fields saved
  through SetScore, confirm and regrade record actions, bulk confirm
- open question type, rubric and max_length in the question form; grader
  dropdown on the quiz form from the grader registry
- Review model with quiz, status and student filters
2026-11-09 18:31:19 +01:00
Jakub Zych
1ce1ebee16 test: cover the review queue against Postgres
TestReviewsAgainstDatabase (skipped under -short): permission matrix,
queue filters and pages, detail, confirm, set_score with the student's
review_comment, bulk confirm with AttemptReviewed, regrade through the
grader and the recalculation of finished attempts.
2026-11-09 18:09:02 +01:00
Jakub Zych
692a647650 feat: set scores, confirm in bulk and regrade open answers over MCP
- SetScore (0..points in 0.5 steps, comment shown to the student),
  ConfirmBulk per quiz or attempt and Regrade through the quiz's grader
- close() announces an attempt reviewed while it was open
- quizzes_review_set_score, quizzes_review_confirm_bulk,
  quizzes_review_regrade; 409 already_reviewed and grader_manual
2026-11-09 18:06:02 +01:00
Jakub Zych
2fa8aa4178 feat: list, show and confirm open answers over MCP
- classes/review.go: review queue, detail and Confirm, shared by MCP and
  the admin screen; AnswerReviewed and AttemptReviewed after commit
- /api/v1/quiz-reviews routes behind the quizzes permission
- quizzes_review_list, quizzes_review_show, quizzes_review_confirm
2026-11-09 18:02:35 +01:00
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