feat: exam9 — назначение варианта как ДЗ + импорт нечётных в банк
Импорт 40 нечётных вариантов (v01, v03, ..., v79) в банк вопросов: - 400 questions с allow_html=1, source_type='экзамен 9', year=2025 - 540 options (single-choice) + correct_text (short_answer) - 40 tests (по 1 на вариант), title="Экзамен 9 — Вариант N" - exam9_variant_tests маппинг для назначения Назначение варианта как ДЗ на /exam9 (для учителей/админов): - Кнопка «Назначить как ДЗ» под заголовком варианта (только если test_id есть) - Модалка выбора классов + опциональный deadline - POST /api/assignments/bulk с test_id из exam9_variant_tests Поддержка HTML/SVG в вопросах банка через флаг questions.allow_html: - Миграция 003: ALTER TABLE questions ADD COLUMN allow_html - sessionController: SELECT возвращают allow_html и image - test-run.html: рендер q.text и opt.text как HTML при allow_html=1 - test-result.html: то же для explanation и opt.text - KaTeX: добавлены $...$ и $$...$$ delimiters в обеих страницах Бонус-фикс: bulkSchema требовал class_id (single), контроллер ждёт class_ids (array). Существующий вызов из classes.html был сломан; исправлено вместе. Команда: node backend/scripts/import-exam9.js (--all для всех 80)
This commit is contained in:
@@ -31,10 +31,10 @@ const directSchema = { body: {
|
||||
}};
|
||||
|
||||
const bulkSchema = { body: {
|
||||
title: { type: 'string', required: true, minLen: 1, maxLen: 200 },
|
||||
class_id: { type: 'number', required: true, min: 1 },
|
||||
mode: { type: 'string', oneOf: MODES },
|
||||
count: { type: 'number', min: 1, max: 200 },
|
||||
title: { type: 'string', required: true, minLen: 1, maxLen: 200 },
|
||||
class_ids: { type: 'array', required: true },
|
||||
mode: { type: 'string', oneOf: MODES },
|
||||
count: { type: 'number', min: 1, max: 200 },
|
||||
}};
|
||||
|
||||
router.use(authMiddleware);
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
'use strict';
|
||||
const router = require('express').Router();
|
||||
const db = require('../db/db');
|
||||
const { authMiddleware } = require('../middleware/auth');
|
||||
|
||||
router.use(authMiddleware);
|
||||
|
||||
/* GET /api/exam9/variants — { variant: test_id } map for assigning variants as homework */
|
||||
router.get('/variants', (_req, res) => {
|
||||
const rows = db.prepare(
|
||||
'SELECT evt.variant, evt.test_id FROM exam9_variant_tests evt JOIN tests t ON t.id = evt.test_id ORDER BY evt.variant'
|
||||
).all();
|
||||
const map = {};
|
||||
for (const r of rows) map[r.variant] = r.test_id;
|
||||
res.json({ variants: map });
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user