Администрирование анкет¶
Управление анкетами обратной связи в CMS.
Создание анкеты¶
- Основные поля:
- Название (например, «Оценка видеорезюме»)
- Описание (необязательно)
-
Символьный идентификатор (
external_id) — используется для подхвата анкеты на устройствах -
Добавление вопросов:
- Выбор типа вопроса (шкала, выбор варианта, текст, выбор профессий)
- Текст вопроса
- Обязательность
- Порядок отображения
- Условие показа (если нужно)
Публикация и версионирование¶
Жизненный цикл анкеты¶
- Создание — анкета в статусе черновика, можно редактировать вопросы, текст, порядок
- Публикация — анкета становится активной (
is_active = true), доступна для прохождения на устройствах - Изменение — если нужно изменить опубликованную анкету:
- Нажать «Создать новую версию» (копирование текущей активной)
- Новая версия создаётся как черновик
- Редактировать новую версию
- Опубликовать новую версию → старая автоматически деактивируется
Что происходит при смене версии¶
Сценарий: пользователь начал проходить анкету v1, но в этот момент администратор опубликовал v2.
Результат:
- Пользователь завершает прохождение по v1
- Ответ (SurveyResponse) привязывается к survey_id версии v1
- Новая версия v2 не затрагивает текущие прохождения
Техническая реализация:
- Устройство при загрузке анкеты получает конкретный survey_id (не только external_id)
- Все ответы привязываются к этому survey_id
- Даже если активная версия сменится, ответы сохраняются в той версии, которую проходил пользователь
Ограничение¶
Не может быть двух активных анкет с одинаковым external_id.
Генерация QR-ссылок¶
Для веб-интерфейса (гости без авторизации):
- Выбрать анкету
- Нажать «Сгенерировать QR-ссылку»
- Указать срок жизни JWT (например, 7 дней, 30 дней, бессрочно)
- Система генерирует ссылку вида:
https://platform.example.com/feedback?token=... - Скачать QR-код или скопировать ссылку
Срок жизни JWT — защита от спама неавторизованных пользователей.
Управление вопросами¶
Типы вопросов¶
Типы вопросов — из справочника.
Условные вопросы¶
Вопрос может показываться только при определённом ответе на родительский вопрос.
Пример: - Вопрос 1: «Оцените удобство» (шкала 1–5) - Вопрос 2: «Что именно неудобно?» (текст) — привязан к вопросу 1, условие: «показать если ответ ≤ 2»
Структура:
- parent_id — ID родительского вопроса, на ответ которого смотрим
- condition — JSON с оператором и значением: {"operator": "lte", "value": 2}
Операторы:
- eq — равно
- neq — не равно
- gt — больше
- gte — больше или равно
- lt — меньше
- lte — меньше или равно
- in — значение в списке