Тестовое Задание.
У текущего тестового задания есть только общее описание требований, конкретные детали реализации остаются на усмотрение разработчика.
- авторизация в системе (регистрация не нужна)
- добавление/изменение/удаление опросов. Атрибуты опроса: название, дата старта, дата окончания, описание. После создания поле "дата старта" у опроса менять нельзя
- добавление/изменение/удаление вопросов в опросе. Атрибуты вопросов: текст вопроса, тип вопроса (ответ текстом, ответ с выбором одного варианта, ответ с выбором нескольких вариантов)
- получение списка активных опросов
- прохождение опроса: опросы можно проходить анонимно, в качестве идентификатора пользователя в API передаётся числовой ID, по которому сохраняются ответы пользователя на вопросы; один пользователь может участвовать в любом количестве опросов
- получение пройденных пользователем опросов с детализацией по ответам (что выбрано) по ID уникальному пользователя
- исходный код приложения в github (только на github, публичный репозиторий)
- инструкция по разворачиванию приложения (в docker или локально)
- документация по API
mkdir fabrika_test
cd fabrika_test
git init
git pull https://github.com/warrinot/fabrika_test.git
pip install virtualenv
python -m venv venv
source venv/bin/activate //на Linux или "venv\scripts\activate" на Windows
pip install -r requirements.txt
python manage.py migrate
python manage.py loaddata testdata.json
python manage.py runserver
например curl -u admin:123 http://127.0.0.1:8000/admin_api/polls/
/admin_api/nested_polls/
- url для запросов создания опроса с вопросами и с вариантами ответов ОДНИМ запросом. Пример отправляемых данных:
{
"name": "Кем бы вы работали, если б не пошли в IT?",
"description": "Задавались когда-нибудь вопросом, кем бы вы могли стать, если б не пошли в сферу IT? Давайте пофантазируем: ответьте на 10 вопросов нашего развлекательного теста и получите один из необычных вариантов профессии",
"questions": [
{
"text": "Представьте, что вы в своей комнате, пишете код, а перед вами книжная полка. Какая книга там точно есть?",
"question_type": 2,
"choices": [
{
"text": "Искусство программирования», Д. Кнут"
},
{
"text": "«Программирование для гуманитариев», Ю. Денисов"
},
{
"text": "«Пять пороков команды», П. Ленсиони"
},
{
"text": "«Google: эффективный поиск информации в Интернет. Гугл поиск», В. Гусев"
}
]
},
{
"text": "Вам поручили сложный таск, который вы никак не можете выполнить. Что сделаете в первую очередь?",
"question_type": 2,
"choices": [
{
"text": "Побегу на StackOverflow за готовыми ответами"
},
{
"text": "Побегу на StackOverflow задавать вопросы"
}
]
},
{
"text": "Вы очень спешили, и на выходе получился спагетти-код. Что предпримите?",
"question_type": 2,
"choices": [
{
"text": "Покопаюсь в старых проектах, ведь что-то подобное я уже точно писал"
},
{
"text": "Найду best practices для чистого кода и буду им следовать"
}]
}
]
}
GET
- выдает список всех опросовPOST
- добавляет опрос. В теле запроса отправляется:{ "name": "123", "description": "321" }
GET
получает данные опросаPUT
илиPATCH
редактируют опрос. Пример тела запроса:{ "name": "321", "description": "123" }
DELETE
- удаляет опрос
GET
- выдает список всех вопросовPOST
- добавляет вопрос. В теле запроса отправляется:{ "poll": 1, "text": "Текст", "question_type": 2 }
GET
получает данные опросаPUT
илиPATCH
- редактируют опрос. Пример тела запроса:{ "poll": 1, "text": "Новый Текст", "question_type": 3 }
DELETE
- удаляет опрос
GET
- выдает список всех вариантовPOST
- добавляет вариант. В теле запроса отправляется:{ "question": 1, "text": "Опция 1" }
GET
получает данные вариантаPUT
илиPATCH
- редактируют вариант. Пример тела запроса:{ "question": 2, "text": "Опция 2" }
DELETE
- удаляет вариант
/user_api/polls_finished_by_user/?user_id=*
- метод GET
- получение списка опросов, в которых пользователь ответил хотя бы на 1 вопрос в запросе указать user_id
/user_api/user_choices/
- метод POST
- ответ пользователя на вопрос из опроса. Если тип вопроса - "ответ текстом" в теле запроса нужно отправить:
{
"question": 13,
"user_id": 321,
"text_choice": "Текст ответа"
}
Если тип вопроса - "ответ с выбором одного варианта" или "ответ с выбором нескольких вариантов", отправляется:
{
"question": 13,
"choice": [
41
],
"user_id": 321
}