{% extends 'base.html' %}

{% block content %}
<div class="row my-4">
    <div class="col-lg-12">
        <h1 class="mb-4">Задание к лабораторной работе №4</h1>

        <p class="task-description">Разработайте веб-приложение с использованием фреймворка Flask. Приложение должно предоставлять функциональность управления учётными записями пользователей, а именно: создание новых записей, просмотр, редактирование и удаление.</p>

        <p class="task-description mt-3">Учётная запись пользователя характеризуется идентификатором, логином, значением хэш-функции пароля, фамилией, именем, отчеством, идентификатором роли пользователя и датой создания записи. Дата создания должна устанавливаться автоматически. У пользователя может отсутствовать фамилия или роль. Роль характеризуется идентификатором, названием и описанием.</p>

        <p class="task-description mt-3">В приложении должна быть реализована функциональность аутентификации (можно взять из лаб. №3). Загрузка данных пользователя при аутентификации должна осуществляться из базы данных.</p>

        <p class="task-description mt-3">Главная страница приложения должна отображать список пользователей в виде таблицы. Столбцы таблицы: порядковый номер пользователя, полное имя, название роли, действия. В столбце «действия» в каждой строке должны быть кнопки «Просмотр», «Редактировать» и «Удалить». Кнопки «Редактировать» и «Удалить» должны отображаться только для аутентифицированных пользователей. Под таблицей должна быть кнопка «Создать пользователя», которая также должна отображаться только для аутентифицированных пользователей.</p>

        <p class="fw-bold task-description mt-4">Просмотр записи</p>
        <p class="task-description">При нажатии на кнопку «Просмотр» должна открываться страница с данными выбранного пользователя (идентификатор, логин, фамилия, имя, отчество, название роли). Данные должны отображаться в виде таблицы. Эта страница доступна всем пользователям.</p>

        <p class="fw-bold task-description mt-4">Создание записи</p>
        <p class="task-description">При нажатии на кнопку «Создать пользователя» должна открываться страница с формой для ввода данных нового пользователя. Если неаутентифицированный пользователь попытается зайти на эту страницу, он должен быть перенаправлен на страницу входа.</p>
        <p class="task-description mt-2">Форма должна содержать поля для ввода логина, пароля, фамилии, имени, отчества и выбора роли (selector). Внизу формы должна быть кнопка «Сохранить», при нажатии на которую на сервер отправляется POST-запрос и данные записываются в базу данных. При возникновении ошибки в процессе обработки запроса пользователю должно быть показано сообщение об ошибке (flash-сообщение) и отображена страница с заполненной формой (чтобы пользователь мог исправить введённые данные). При успешном завершении операции пользователь должен быть перенаправлен на страницу со списком пользователей и показано сообщение об успешном завершении.</p>

        <p class="fw-bold task-description mt-4">Редактирование записи</p>
        <p class="task-description">При нажатии на кнопку «Редактировать» должна открываться страница с формой редактирования пользователя. Она должна быть автоматически заполнена данными редактируемого пользователя. Набор полей данной формы должен соответствовать форме создания пользователей за исключением полей «логин» и «пароль» — их не должно быть в форме редактирования. Также не должно быть дублирования шаблона формы, то есть форма должна быть реализована в виде макроса и использоваться как на странице создания, так и на странице редактирования пользователя. Доступ к функциональности редактирования имеют только аутентифицированные пользователи. Механизм обработки ошибок и вывода сообщений аналогичен функциональности создания.</p>

        <p class="fw-bold task-description mt-4">Удаление записи</p>
        <p class="task-description">При нажатии на кнопку «Удалить» должно открываться модальное окно с сообщением «Вы уверены, что хотите удалить пользователя {}?». Вместо {} должно быть подставлено полное имя удаляемого пользователя. В нижней части модального окна должны быть кнопки «Да» и «Нет». При нажатии кнопки «Да» на сервер отправляется POST-запрос, и в результате обработки выбранная учётная запись пользователя удаляется из базы данных. При возникновении ошибки в процессе обработки запроса пользователю должно быть показано сообщение. Доступ к функциональности удаления имеют только аутентифицированные пользователи. Механизм обработки ошибок и вывода сообщений аналогичен функциональности создания и редактирования.</p>

        <p class="fw-bold task-description mt-4">Проверка данных, вводимых пользователем</p>
        <p class="task-description">Помимо перехвата ошибок записи в базу данных, реализуйте предварительную проверку введённых пользователем данных на стороне сервера. Поля логин, пароль, фамилия и имя не могут быть пустыми. Логин должен состоять только из латинских букв и цифр и иметь длину не менее 5 символов. Пароль должен соответствовать следующим требованиям:</p>
        <ul class="task-list mt-2">
            <li>Не менее 8 символов</li>
            <li>Не более 128 символов</li>
            <li>Хотя бы одна заглавная и одна строчная буква</li>
            <li>Только латинские или кириллические буквы</li>
            <li>Хотя бы одна цифра</li>
            <li>Только арабские цифры</li>
            <li>Нет пробелов</li>
            <li>Допустимые прочие символы: ~ ! ? @ # $ % ^ &amp; * _ - + ( ) [ ] { } &gt; &lt; / \ | " ' . , : ;</li>
        </ul>
        <p class="task-description mt-2">Если какое-либо из вышеперечисленных требований нарушено, необходимо выделить некорректно заполненные поля в форме (с помощью соответствующего класса) и отобразить текст ниже каждого такого поля с объяснением причины ошибки (например, «Поле не может быть пустым»).</p>

        <p class="fw-bold task-description mt-4">Смена пароля</p>
        <p class="task-description">Добавьте возможность смены пароля текущего пользователя. Разместите ссылку «Сменить пароль» в панели навигации. При переходе по этой ссылке пользователь должен попасть на страницу с формой, содержащей 3 поля: старый пароль, новый пароль, повтор нового пароля. При отправке данных формы на сервер необходимо проверить правильность введённого старого пароля, соответствие требованиям к новому паролю (см. предыдущий раздел) и совпадение полей «новый пароль» и «повтор нового пароля». При возникновении ошибок пользователю должно быть показано flash-сообщение и/или выделены соответствующие поля формы. В случае успешной смены пароля перенаправьте пользователя на главную страницу и покажите ему flash-сообщение об успешном завершении.</p>
    </div>
</div>
{% endblock %}
