{% extends 'base.html' %}

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

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

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

        <p class="task-description mt-3">У пользователей с ролью "Администратор" есть право на:</p>
        <ul class="task-list mt-2">
            <li>создание пользователей,</li>
            <li>редактирование пользователей,</li>
            <li>просмотр профиля пользователя,</li>
            <li>удаление пользователей,</li>
            <li>просмотр журнала посещений (всех страниц).</li>
        </ul>

        <p class="task-description mt-3">У пользователей с ролью "Пользователь" есть право на:</p>
        <ul class="task-list mt-2">
            <li>редактирование своих данных (за исключением роли — это поле должно быть отключено на форме для редактирования),</li>
            <li>просмотр своего профиля,</li>
            <li>просмотр журнала посещений (только страницу "Журнал посещений", где не должны отображаться записи, соответствующие другим пользователям).</li>
        </ul>

        <p class="task-description mt-3">Реализация проверки прав должна быть реализована при помощи декоратора <code>check_rights</code>, который можно применить к view function. В случае, если у пользователя оказалось недостаточно прав для выполнения запрашиваемого действия, его нужно перенаправить на главную страницу с сообщением "У вас недостаточно прав для доступа к данной странице.".</p>

        <p class="task-description mt-3">Пользователю не должны отображаться кнопки, соответствующие действиям, для выполнения которых у него недостаточно прав.</p>

        <p class="fw-bold task-description mt-4">Формирование статистических отчётов</p>
        <p class="task-description">Добавьте в разрабатываемое приложение "Журнал посещений", в котором разместите информацию посещении пользователями различных страниц сайта. Для этого создайте таблицу <code>visit_logs</code> со следующими полями:</p>
        <ul class="task-list mt-2">
            <li><code>id INT</code> — идентификатор записи,</li>
            <li><code>path VARCHAR(100)</code> — путь до страницы,</li>
            <li><code>user_id INT</code> — идентификатор пользователя (если пользователь не вошёл в систему — можно оставить пустым),</li>
            <li><code>created_at</code> — дата посещения (проставляется автоматически).</li>
        </ul>

        <p class="task-description mt-3">Для автоматического заполнения данной таблицы рекомендуется использовать декоратор <code>before_request</code>.</p>

        <p class="task-description mt-3">Функциональность формирования отчётов необходимо вынести в отдельный модуль и подключать к приложению при помощи Blueprint'а.</p>

        <p class="task-description mt-3">На главной странице журнала посещений нужно отобразить записи таблицы <code>visit_logs</code>, отсортированные по убыванию даты. На этой странице должна быть табличка с колонками:</p>
        <ul class="task-list mt-2">
            <li>№ — порядковый номер записи,</li>
            <li>Пользователь — ФИО пользователя (если нет пользователя — строка "Неаутентифицированный пользователь"),</li>
            <li>Страница — путь до страницы,</li>
            <li>Дата — дата посещения в формате 01.01.2001 01:01:01.</li>
        </ul>

        <p class="task-description mt-3">Должна быть предусмотрена пагинация записей.</p>

        <p class="task-description mt-3">На главной странице журнала посещений должны быть расположены ссылки на страницы с отчётами по посещениям по страницам и по пользователям.</p>

        <p class="task-description mt-3">На странице с отчётом по страницам должна быть таблица, отображающая статистику посещения страниц сайта. В ней должны быть колонки "№", "Страница" и "Количество посещений". Данные должны быть отсортированы в убывающем порядке количества посещений.</p>

        <p class="task-description mt-3">Под таблицей должна располагаться кнопка "Экспорт в CVS", по нажатию на которую должен скачиваться файл с содержимым отчёта в формате CSV.</p>

        <p class="task-description mt-3">Аналогичным образом нужно реализовать формирования отчёта по пользователям. Только в данном случае в таблице будут колонки "№", "Пользователь" (ФИО или "Неаутентифицированный пользователь"), "Количество посещений".</p>
    </div>
</div>
{% endblock %}
