Разработать веб-ресурс для анкетирования пользователей на Python/C#
Весь проект нужен для записи видео функционала для курсовой работы к концу мая, поэтому весь функционал даже можно не реализовывать)
Нефункциональные требования:
Требование к архитектуре программы: База данных +Backend + Frontend, связанные через API. Желательно использование паттернов архитектуры кода
Требования к качеству кода: Без разницы, можно даже всё не отлаживать, лишь бы снять видео функционала для курсовой работы)
Требования к тестированию: Минимальное покрытие основных функций + Фикстуры
Требование к логированию: Логирование основных пользовательских функций и автоматических функций
Требования к дизайну: Не предъявляются
Требование к языку программирования: Python/C#
Требование к развёртыванию: Docker + Github
Функциональные требования:
Пользователи:
• Администратор (1 шт)
• Пользователи (1 запись в сущности «Муниципалитет» = соответствующий пользователь). Пользователи могут просматривать сущности «Анкетирования», назначенные только на них самих.
Вкладка «Анкеты»:
Доступна Администратору.
1. GET: Отображается коллекция (список) анкет, отсортированные по дате изменения (сначала новые). Визуальное представление элемента списка анкет: Наименование, Дата создания, иконка-заглушка блокнота (не принципиально), Кнопка «Удалить» в виде корзины, Кнопка «Выбрать получателей» в виде бумажного самолётика(не принципиально), Кнопка «Копировать», Кнопка «Отчет». После списка анкет должна находиться кнопка для создания новой анкеты.
2. DELETE: Кнопка «Удалить»: Устанавливает атрибут «Удалено» = «Да», если нет экземпляра «Анкетирования» связанного с текущей анкетой, где атрибут «Пройдена»= «Нет», иначе всплывающее сообщение: «Текущая анкета сейчас находится в работе у пользователей. Верните её на доработку во вкладке «Текущие анкетирования»».
3. POST: Кнопка «Создать анкету»: Открывает форму для создания анкеты:
3.1. Поле для ввода наименования анкеты.
3.2. Вертикальный список сущностей «Критерий» блоков-контейнеров, которым можно:
3.2.1. Задать наименование,
3.2.2. изменить порядок (переместить выше/ниже),
3.2.3. создать новый,
3.2.4. удалить.
3.2.4.1. При создании/изменении порядка/удалении «Критерия» изменяется атрибут «Порядок» в соответствии с позицией, на которой он расположен на визуальной форме. (Можно добавить визуализацию этого атрибута как приписку перед наименованием, например, «Критерий А», «Критерий Б».. «Критерий Я» (ограничении в 33 элемента) ).
3.2.5. Внутри блока-контейнера «Критерий» можно создавать сущности «Показатель» (вопрос): Вертикальный список сущностей «Показатель», которым можно:
3.2.5.1. Задать наименование (написать саму формулировку вопроса),
3.2.5.2. изменить порядок (переместить выше/ниже),
3.2.5.3. создать новый,
3.2.5.4. удалить,
3.2.5.4.1. При создании/изменении порядка/удалении «Показателя» изменяется атрибут «Порядок» в соответствии с позицией, на которой он расположен на визуальной форме. (Можно добавить визуализацию этого атрибута как приписку перед наименованием, например, «Показатель 1», «Показатель 2»)
3.2.5.5. Задать пояснение-подсказку для вопроса (просто текст)
3.2.5.6. Установить Единицы измерения по справочнику для вопроса (было бы удобно, если бы можно было добавлять элементы в справочник прямо из этой формы).
3.2.5.7. Скрыть вопрос для пользователя, проходящего анкету (Не будет отображаться Не Администраторам)
3.2.5.8. Если вопрос не скрыт, ему можно указать Способ заполнения по справочнику.
3.2.5.9. Указать формулу оценивания для ответа пользователя, проходящего анкету на основе маски(regex выражения) (=(<Порядок Критерия><Порядок вопроса>|<Вещественное число>) (<Математический знак [+-*\]> (<Порядок Критерия><Порядок вопроса>|<Вещественное число>))*) Например: =А1*2 или = Б12/Г6*3,12+Д5). После ввода формулы необходимо проверять корректность заполнения и наличие таких критериев и показателей в анкете
3.3. Кнопка «Сохранить»
4. POST: Кнопка «Копировать»: Открывает форму для создания анкеты (см. п.3), в которой все сущности заполнены так же, что и существующая (но сущности являются новыми экземплярами), для редактирования.
5. PUT: При двойном нажатии на экземпляр анкеты, он открывается в форме в режиме для редактирования анкеты и всех связанных сущностей.
6. POST: Кнопка «Выбрать получателей»: Отображает модальное окно, в котором отображается:
6.1. Записи Справочника: «Муниципалитеты» INNER JOIN сущность «Город», сгруппированные по атрибуту «Ссылка на регион». Администратору доступно для выбора несколько записей.
6.2. Поле «Дата начала»
6.3. Поле «Дата окончания»
6.4. Кнопка «Отправить»
6.4.1. После нажатия кнопки «Отправить» создаются сущности «Анкетирование» по каждой выбранной из модального окна записи, где «дата назначения»=Текущей дате, «Ссылка на Муниципалитет»= Выбранная запись города, принадлежащая муниципалитету из справочника, «Муниципалитет»=Строковое наименование муниципалитета (это для отчетностей), «Город»= Выбранная запись города в строковой записи. Созданные записи отображаются на вкладке «Текущие анкетирования».
6.4.2. По каждому созданному «Анкетированию» отправляется уведомление на E-mail, указанному в сущности «Муниципалитет» в атрибуте «E-mail»:
Тема уведомления:
Оценка туристической привлекательности города <Город>. Требуется пройти анкетирование.
Текст уведомления:
Вам поступила анкета <Наименование> от <Дата назначения> по городу <Город>
Начало анкетирования: <Дата начала>.
Срок окончания анкетирования: <Дата окончания>.
Для перехода к анкете нажмите на ссылку <Ссылка на анкету>.
Вкладка «Текущие Анкетирования»:
Доступна Администратору.
1. GET: Если на экранной форме чекбокс «Пройденные» = Нет, то Отображается коллекция (список) сущностей «Анкетирование», отсортированные по дате начала (сначала новые). Визуальное представление элемента списка анкет: Наименование, Дата назначения, Муниципалитет, Город, иконка-заглушка блокнота (не принципиально), Кнопка «Отозвать», Кнопка «Продлить»
2. GET: Если на экранной форме чекбокс «Пройденные» = Да, то Отображается коллекция (список) сущностей «Анкетирование», отсортированные по дате прохождения (сначала новые). Визуальное представление элемента списка анкет: Наименование, Дата прохождения, Муниципалитет, Город, Оценка (сумма оценок всех связанных «Ответов»), иконка-заглушка блокнота (не принципиально), Кнопка «Вернуть»
3. PUT: При нажатии на Кнопку «Продлить» открывается модальное окно, в котором можно установить новую дату окончания анкетирования.
4. PUT: При нажатии на Кнопку «Вернуть» открывается модальное окно, в котором можно установить новую дату окончания, указать «комментарий». При нажатии на кнопку «Ок» атрибут «Пройдена» устанавливается в «Нет» и
4.1. на E-mail, указанному в сущности «Муниципалитет» в атрибуте «E-mail»:
Тема уведомления:
Оценка туристической привлекательности города <Город>. Требуется доработать анкету.
Текст уведомления:
Доработайте анкету <Наименование> от <Дата назначения> по городу <Город>
<Комментарий>
Срок окончания анкетирования: <Дата окончания>.
Для перехода к анкете нажмите на ссылку <Ссылка на анкету>.
5. DELETE: При нажатии на кнопку «Отозвать» удаляется экземпляр сущности «Анкетирование» и связанные экземпляры «Ответ», на E-mail, указанному в сущности «Муниципалитет» в атрибуте «E-mail»:
Тема уведомления:
Оценка туристической привлекательности города <Город>. Анкета отозвана
…
6. GET: При двойном нажатии на сущность анкетирование открывается форма анкеты: Критерии LEFT JOIN Показатели LEF JOIN Ответы JOIN Единицы измерения
Вкладка «Текущие анкетирования»:
Доступна Пользователю (не администратору)
1. GET: Отображается коллекция (список) сущностей «Анкетирование», отсортированные по дате окончания (сначала большее), где в атрибуте «Ссылка на муниципалитет» указан муниципалитет текущего пользователя, «Пройдена»= «Нет» и «Дата окончания»>Текущая дата. Визуальное представление элемента списка анкетирования: Наименование, Дата окончания, иконка-заглушка блокнота (не принципиально)
2. GET: При двойном нажатии на анкету открывает форма для заполнения Сущностей «Ответ», связанных с каждым «Показателем» согласно настройке из справочника «Способ заполнения». Кнопка «Сохранить» и Кнопка «Отправить»
2.1. Кнопка «Сохранить» сохраняет значения в сущности «Ответ»
2.2. Кнопка «Отравить» сохраняет значения в сущности «Ответ», считает для каждого атрибут «Оценка» согласно «Формуле оценивания» в связанном вопросе (как в Excel) и устанавливает атрибут «Пройдена» на «Да», «Дата прохождения» на текущую дату
Вкладка «Справочник: Единица измерения»:
Доступна Администратору.
Отображаются записи сущности «Единица измерения» с возможностью создания, удаления.
Вкладка «Справочник: Способ заполнения»:
Доступна Администратору.
Отображаются записи сущности «Способ заполнения». По умолчанию должен быть наполнен:
Вкладка «Справочник: Муниципалитеты»:
Доступна Администратору.
Отображаются записи сущности «Муниципалитет» JOIN «Город» JOIN «Регион», сгруппированные по экземплярам «Регион» с возможностью создания, удаления, редактирования сущностей «Регион», «Муниципалитет», «Город».
Отчеты:
1. При нажатии на кнопку «Отчет» сущности «Анкета» формируется на скачивание таблица в формате .xls по каждой сущности «Анкетирование», связанной с текущей «Анкетой»:
1ая строка – дата формирования отчёта
2ая строка – шапка таблицы: 1ый столбец – «Город», последующие – Порядок «Критерия» + «.» +Порядок «Показателя», затем «Оценка» и «Группа»
3ая и последующие строки – сущности «Анкетирование»: 1ый столбец – атрибут «Город», последующие – атрибут «Оценка» связанного «Ответа» на соответствующий «Показатель», Затем сумма этих оценок (через формулу Excel) и высчитываемая группа методом k-means по 5ти группам. Строки отсортированы по столбцу «Группа».
2. При нажатии на кнопку «Отчет» сущности «Анкетирование» формируется на скачивание таблица в формате .xls по текущей сущности «Анкетирование»:
1ая строка – дата формирования отчёта, «Город», «Муниципалитет»
2ая строка – шапка таблицы: 1ый столбец – «№ п/п», 2й столбец «Критерий», 3й – «Показатель», 4й-«Единицы измерения», 5й-«Значение показателей (с перечислением объектов)», 6й-«Период проставления данных», 7й – «Оценка»
3ая и последующие строки : 1ый столбец – атрибут «Порядок» сущности «Критерий», 2й столбец атрибут «Наименование» сущности «Критерий», 3й – атрибут «Наименование» сущности «Показатель», 4й-атрибут «Наименование» сущности «Единицы измерения», 5й-атрибут «Наименование» сущности «Ответ», 6й-атрибут «Подсказка» сущности «Показатель», 7й- атрибут «Оценка» сущности «Ответ». Сгруппированные по столбцу 1 (можно даже объединить ячейки столбцов одинаковых строк в столбце 1 и 2)
Нефункциональные требования:
Требование к архитектуре программы: База данных +Backend + Frontend, связанные через API. Желательно использование паттернов архитектуры кода
Требования к качеству кода: Без разницы, можно даже всё не отлаживать, лишь бы снять видео функционала для курсовой работы)
Требования к тестированию: Минимальное покрытие основных функций + Фикстуры
Требование к логированию: Логирование основных пользовательских функций и автоматических функций
Требования к дизайну: Не предъявляются
Требование к языку программирования: Python/C#
Требование к развёртыванию: Docker + Github
Функциональные требования:
Пользователи:
• Администратор (1 шт)
• Пользователи (1 запись в сущности «Муниципалитет» = соответствующий пользователь). Пользователи могут просматривать сущности «Анкетирования», назначенные только на них самих.
Вкладка «Анкеты»:
Доступна Администратору.
1. GET: Отображается коллекция (список) анкет, отсортированные по дате изменения (сначала новые). Визуальное представление элемента списка анкет: Наименование, Дата создания, иконка-заглушка блокнота (не принципиально), Кнопка «Удалить» в виде корзины, Кнопка «Выбрать получателей» в виде бумажного самолётика(не принципиально), Кнопка «Копировать», Кнопка «Отчет». После списка анкет должна находиться кнопка для создания новой анкеты.
2. DELETE: Кнопка «Удалить»: Устанавливает атрибут «Удалено» = «Да», если нет экземпляра «Анкетирования» связанного с текущей анкетой, где атрибут «Пройдена»= «Нет», иначе всплывающее сообщение: «Текущая анкета сейчас находится в работе у пользователей. Верните её на доработку во вкладке «Текущие анкетирования»».
3. POST: Кнопка «Создать анкету»: Открывает форму для создания анкеты:
3.1. Поле для ввода наименования анкеты.
3.2. Вертикальный список сущностей «Критерий» блоков-контейнеров, которым можно:
3.2.1. Задать наименование,
3.2.2. изменить порядок (переместить выше/ниже),
3.2.3. создать новый,
3.2.4. удалить.
3.2.4.1. При создании/изменении порядка/удалении «Критерия» изменяется атрибут «Порядок» в соответствии с позицией, на которой он расположен на визуальной форме. (Можно добавить визуализацию этого атрибута как приписку перед наименованием, например, «Критерий А», «Критерий Б».. «Критерий Я» (ограничении в 33 элемента) ).
3.2.5. Внутри блока-контейнера «Критерий» можно создавать сущности «Показатель» (вопрос): Вертикальный список сущностей «Показатель», которым можно:
3.2.5.1. Задать наименование (написать саму формулировку вопроса),
3.2.5.2. изменить порядок (переместить выше/ниже),
3.2.5.3. создать новый,
3.2.5.4. удалить,
3.2.5.4.1. При создании/изменении порядка/удалении «Показателя» изменяется атрибут «Порядок» в соответствии с позицией, на которой он расположен на визуальной форме. (Можно добавить визуализацию этого атрибута как приписку перед наименованием, например, «Показатель 1», «Показатель 2»)
3.2.5.5. Задать пояснение-подсказку для вопроса (просто текст)
3.2.5.6. Установить Единицы измерения по справочнику для вопроса (было бы удобно, если бы можно было добавлять элементы в справочник прямо из этой формы).
3.2.5.7. Скрыть вопрос для пользователя, проходящего анкету (Не будет отображаться Не Администраторам)
3.2.5.8. Если вопрос не скрыт, ему можно указать Способ заполнения по справочнику.
3.2.5.9. Указать формулу оценивания для ответа пользователя, проходящего анкету на основе маски(regex выражения) (=(<Порядок Критерия><Порядок вопроса>|<Вещественное число>) (<Математический знак [+-*\]> (<Порядок Критерия><Порядок вопроса>|<Вещественное число>))*) Например: =А1*2 или = Б12/Г6*3,12+Д5). После ввода формулы необходимо проверять корректность заполнения и наличие таких критериев и показателей в анкете
3.3. Кнопка «Сохранить»
4. POST: Кнопка «Копировать»: Открывает форму для создания анкеты (см. п.3), в которой все сущности заполнены так же, что и существующая (но сущности являются новыми экземплярами), для редактирования.
5. PUT: При двойном нажатии на экземпляр анкеты, он открывается в форме в режиме для редактирования анкеты и всех связанных сущностей.
6. POST: Кнопка «Выбрать получателей»: Отображает модальное окно, в котором отображается:
6.1. Записи Справочника: «Муниципалитеты» INNER JOIN сущность «Город», сгруппированные по атрибуту «Ссылка на регион». Администратору доступно для выбора несколько записей.
6.2. Поле «Дата начала»
6.3. Поле «Дата окончания»
6.4. Кнопка «Отправить»
6.4.1. После нажатия кнопки «Отправить» создаются сущности «Анкетирование» по каждой выбранной из модального окна записи, где «дата назначения»=Текущей дате, «Ссылка на Муниципалитет»= Выбранная запись города, принадлежащая муниципалитету из справочника, «Муниципалитет»=Строковое наименование муниципалитета (это для отчетностей), «Город»= Выбранная запись города в строковой записи. Созданные записи отображаются на вкладке «Текущие анкетирования».
6.4.2. По каждому созданному «Анкетированию» отправляется уведомление на E-mail, указанному в сущности «Муниципалитет» в атрибуте «E-mail»:
Тема уведомления:
Оценка туристической привлекательности города <Город>. Требуется пройти анкетирование.
Текст уведомления:
Вам поступила анкета <Наименование> от <Дата назначения> по городу <Город>
Начало анкетирования: <Дата начала>.
Срок окончания анкетирования: <Дата окончания>.
Для перехода к анкете нажмите на ссылку <Ссылка на анкету>.
Вкладка «Текущие Анкетирования»:
Доступна Администратору.
1. GET: Если на экранной форме чекбокс «Пройденные» = Нет, то Отображается коллекция (список) сущностей «Анкетирование», отсортированные по дате начала (сначала новые). Визуальное представление элемента списка анкет: Наименование, Дата назначения, Муниципалитет, Город, иконка-заглушка блокнота (не принципиально), Кнопка «Отозвать», Кнопка «Продлить»
2. GET: Если на экранной форме чекбокс «Пройденные» = Да, то Отображается коллекция (список) сущностей «Анкетирование», отсортированные по дате прохождения (сначала новые). Визуальное представление элемента списка анкет: Наименование, Дата прохождения, Муниципалитет, Город, Оценка (сумма оценок всех связанных «Ответов»), иконка-заглушка блокнота (не принципиально), Кнопка «Вернуть»
3. PUT: При нажатии на Кнопку «Продлить» открывается модальное окно, в котором можно установить новую дату окончания анкетирования.
4. PUT: При нажатии на Кнопку «Вернуть» открывается модальное окно, в котором можно установить новую дату окончания, указать «комментарий». При нажатии на кнопку «Ок» атрибут «Пройдена» устанавливается в «Нет» и
4.1. на E-mail, указанному в сущности «Муниципалитет» в атрибуте «E-mail»:
Тема уведомления:
Оценка туристической привлекательности города <Город>. Требуется доработать анкету.
Текст уведомления:
Доработайте анкету <Наименование> от <Дата назначения> по городу <Город>
<Комментарий>
Срок окончания анкетирования: <Дата окончания>.
Для перехода к анкете нажмите на ссылку <Ссылка на анкету>.
5. DELETE: При нажатии на кнопку «Отозвать» удаляется экземпляр сущности «Анкетирование» и связанные экземпляры «Ответ», на E-mail, указанному в сущности «Муниципалитет» в атрибуте «E-mail»:
Тема уведомления:
Оценка туристической привлекательности города <Город>. Анкета отозвана
…
6. GET: При двойном нажатии на сущность анкетирование открывается форма анкеты: Критерии LEFT JOIN Показатели LEF JOIN Ответы JOIN Единицы измерения
Вкладка «Текущие анкетирования»:
Доступна Пользователю (не администратору)
1. GET: Отображается коллекция (список) сущностей «Анкетирование», отсортированные по дате окончания (сначала большее), где в атрибуте «Ссылка на муниципалитет» указан муниципалитет текущего пользователя, «Пройдена»= «Нет» и «Дата окончания»>Текущая дата. Визуальное представление элемента списка анкетирования: Наименование, Дата окончания, иконка-заглушка блокнота (не принципиально)
2. GET: При двойном нажатии на анкету открывает форма для заполнения Сущностей «Ответ», связанных с каждым «Показателем» согласно настройке из справочника «Способ заполнения». Кнопка «Сохранить» и Кнопка «Отправить»
2.1. Кнопка «Сохранить» сохраняет значения в сущности «Ответ»
2.2. Кнопка «Отравить» сохраняет значения в сущности «Ответ», считает для каждого атрибут «Оценка» согласно «Формуле оценивания» в связанном вопросе (как в Excel) и устанавливает атрибут «Пройдена» на «Да», «Дата прохождения» на текущую дату
Вкладка «Справочник: Единица измерения»:
Доступна Администратору.
Отображаются записи сущности «Единица измерения» с возможностью создания, удаления.
Вкладка «Справочник: Способ заполнения»:
Доступна Администратору.
Отображаются записи сущности «Способ заполнения». По умолчанию должен быть наполнен:
Наименование | Подсказка | Функционал |
Число | Вводится целое положительное число | Поле ответ, связанное с вопросом должно заполняться только натуральным числом |
Дробное число | Вводится дробное положительное число | Поле ответ, связанное с вопросом должно заполняться только натуральным числом или дробным |
Нумерованный список | Построчно вводится текст, каждый элемент списка с новой строки. Каждая строка присваивает 1 балл | Поле ответ, связанное с вопросом должно заполняться строкой с абзацами, при этом каждый абзац должен маркироваться номером в реальном времени системой, в оценку ответа пойдёт кол-во строк списка, например: 1. Музей совр.иск.. 2. Музей древностей =2 балла. |
Нумерованный список с маской | Используется для заполнения протяжённости улиц для получения значения внутри строк по маске .. «…» -число.. | Поле ответ, связанное с вопросом должно заполняться строкой с абзацами, при этом каждый абзац должен маркироваться номером в реальном времени системой, в оценку ответа пойдёт сумма чисел внутри строк списка, находящихся справа от последнего «-» например: 1. ул. «25-ого Октября» - 25.5км 2. ул. «1805ого года» - 5,5 |
Доступна Администратору.
Отображаются записи сущности «Муниципалитет» JOIN «Город» JOIN «Регион», сгруппированные по экземплярам «Регион» с возможностью создания, удаления, редактирования сущностей «Регион», «Муниципалитет», «Город».
Отчеты:
1. При нажатии на кнопку «Отчет» сущности «Анкета» формируется на скачивание таблица в формате .xls по каждой сущности «Анкетирование», связанной с текущей «Анкетой»:
1ая строка – дата формирования отчёта
2ая строка – шапка таблицы: 1ый столбец – «Город», последующие – Порядок «Критерия» + «.» +Порядок «Показателя», затем «Оценка» и «Группа»
3ая и последующие строки – сущности «Анкетирование»: 1ый столбец – атрибут «Город», последующие – атрибут «Оценка» связанного «Ответа» на соответствующий «Показатель», Затем сумма этих оценок (через формулу Excel) и высчитываемая группа методом k-means по 5ти группам. Строки отсортированы по столбцу «Группа».
2. При нажатии на кнопку «Отчет» сущности «Анкетирование» формируется на скачивание таблица в формате .xls по текущей сущности «Анкетирование»:
1ая строка – дата формирования отчёта, «Город», «Муниципалитет»
2ая строка – шапка таблицы: 1ый столбец – «№ п/п», 2й столбец «Критерий», 3й – «Показатель», 4й-«Единицы измерения», 5й-«Значение показателей (с перечислением объектов)», 6й-«Период проставления данных», 7й – «Оценка»
3ая и последующие строки : 1ый столбец – атрибут «Порядок» сущности «Критерий», 2й столбец атрибут «Наименование» сущности «Критерий», 3й – атрибут «Наименование» сущности «Показатель», 4й-атрибут «Наименование» сущности «Единицы измерения», 5й-атрибут «Наименование» сущности «Ответ», 6й-атрибут «Подсказка» сущности «Показатель», 7й- атрибут «Оценка» сущности «Ответ». Сгруппированные по столбцу 1 (можно даже объединить ячейки столбцов одинаковых строк в столбце 1 и 2)