diff --git a/index/views.py b/index/views.py index a115b4c..766792a 100644 --- a/index/views.py +++ b/index/views.py @@ -3,7 +3,7 @@ import os from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden from django.shortcuts import render # from django.db.models import Manager -from django.contrib.auth import authenticate, login +from django.contrib.auth.decorators import login_required # только для тестирования! import requests @@ -11,11 +11,9 @@ import requests TEST_BASE_FETCH = "https://test.wawaa.ru/dev-fetch.php" +@login_required def view_index(request): - if request.user.is_authenticated: - return render(request, 'index.html') - else: - return HttpResponseRedirect('/account/login') + return render(request, 'index.html') def view_stats(request): diff --git a/ospaz_site/settings.py b/ospaz_site/settings.py index ac13666..5efa1ac 100644 --- a/ospaz_site/settings.py +++ b/ospaz_site/settings.py @@ -123,6 +123,8 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] +LOGIN_URL = "/account/login" + # Internationalization # https://docs.djangoproject.com/en/5.0/topics/i18n/ diff --git a/static/css/style.css b/static/css/style.css index 6bdc8dd..77d0eb2 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -61,3 +61,10 @@ header * { color: var(--brand-text); } +.value-good { + color: var(--text-good); +} + +.value-bad { + color: var(--text-bad); +} diff --git a/templates/account/list.html b/templates/account/list.html new file mode 100644 index 0000000..1eff0ed --- /dev/null +++ b/templates/account/list.html @@ -0,0 +1,59 @@ +{% extends 'base.html' %} +{% load static %} + +{% block styles %} + +{% endblock %} + +{% block header %} +

Просмотр аккаунтов

+{% endblock %} + +{% block content %} +{% if user.is_superuser %} +
+ + + + + + + + + + + + {% for u in users %} + + + + + + + + {% endfor %} + +
ЛогинАдминПоследний входПоследнее обновление пароляЗарегистрирован
{{ u.login }}{{ u.is_superuser }}{{ u.last_login }}{{ u.last_password_change }}{{ u.registered }}
+
+ +{% else %} +

Недостаточно прав для просмотра страницы

+

Для просмотра списка пользователей необходимо иметь статус администратора.

+{% endif %} +{% endblock %} diff --git a/templates/account/login.html b/templates/account/login.html index 59514cc..ea679bb 100644 --- a/templates/account/login.html +++ b/templates/account/login.html @@ -62,11 +62,11 @@ {% block content %}

Войти

-
+ {% csrf_token %} {% if message %} -
+
{{ message }}
{% endif %} diff --git a/templates/account/view.html b/templates/account/view.html new file mode 100644 index 0000000..4d8f79d --- /dev/null +++ b/templates/account/view.html @@ -0,0 +1,37 @@ +{% extends 'base.html' %} +{% load static %} + +{% block styles %} + +{% endblock %} + +{% block header %} +

Аккаунт {{ view_user.login }}

+{% endblock %} + +{% block content %} +{% if have_permissions %} + + + +{% else %} +

Недостаточно прав для просмотра страницы

+

Для просмотра списка пользователей необходимо иметь статус администратора.

+{% endif %} +{% endblock %} diff --git a/templates/index.html b/templates/index.html index d40cdbf..7c5339a 100644 --- a/templates/index.html +++ b/templates/index.html @@ -24,14 +24,6 @@ #canvas-wrapper { max-width: 1000px; } - - .value-good { - color: var(--text-good); - } - - .value-bad { - color: var(--text-bad); - } {% endblock %} diff --git a/users/urls.py b/users/urls.py index 1ecb454..03ba8ea 100644 --- a/users/urls.py +++ b/users/urls.py @@ -22,5 +22,6 @@ urlpatterns = [ path('register', views.default_view, name='register'), path('login', views.view_login, name='login'), path('logout', views.view_logout, name='logout'), + path('list', views.view_list, name='accounts-list'), path('change-password', views.default_view, name='change-password'), ] diff --git a/users/views.py b/users/views.py index 0b97dd6..8f01a88 100644 --- a/users/views.py +++ b/users/views.py @@ -4,6 +4,8 @@ from django.http import HttpResponse, HttpResponseRedirect, HttpResponseBadReque from django.shortcuts import render # from django.db.models import Manager from django.contrib.auth import authenticate, login, logout +from django.contrib.auth.decorators import login_required +from .models import User def default_view(request): @@ -17,6 +19,15 @@ def view_logout(request): def view_login(request): + if request.user.is_authenticated: + # уже авторизован, перенаправляем либо в корень, либо по пути, указанному в next + redirect_uri = "/" + if "next" in request.GET: + if request.GET['next'] != request.path: + # чтобы не возникло циклического редиректа + redirect_uri = request.GET['next'] + return HttpResponseRedirect(redirect_uri) + render_context = { 'message': None } @@ -26,7 +37,12 @@ def view_login(request): user = authenticate(request, username=username, password=password) if user is not None: login(request, user) - return HttpResponseRedirect('/') + redirect_uri = "/" + if "next" in request.GET: + if request.GET['next'] != request.path: + # чтобы не возникло циклического редиректа + redirect_uri = request.GET['next'] + return HttpResponseRedirect(redirect_uri) else: render_context['message'] = "Неверный логин или пароль" return render(request, 'account/login.html', render_context) @@ -36,4 +52,11 @@ def view_login(request): return HttpResponseBadRequest() +@login_required +def view_list(request): + users = [] + # ограничение права на просмотр списка пользователей для непривилегированных пользователей + if request.user.is_superuser: + users = User.objects.order_by('login') + return render(request, 'account/list.html', {'users': users})