Remove password_reset and own login, redirect to admin/login
Django admin login to be used. Thus we should be able to upgrade to Django2.0
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
{% block body %}
|
||||
<div id="header" class="row">
|
||||
<div class="logout-button">
|
||||
<form action="/logout" method="post"> {% csrf_token %}
|
||||
<form action="/admin/logout/" method="post"> {% csrf_token %}
|
||||
<input type="Submit" value="{% trans "Log out" %}" name="Logout" class="btn btn-danger"/>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -24,7 +24,7 @@ from infoscreen.models import ApyInfoItem
|
||||
from infoscreen.models import VideoInfoItem
|
||||
|
||||
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('infoscreen.change_infoinstance', raise_exception=True)
|
||||
def admin(request, *args, **kwargs):
|
||||
"""Render infoscreen admin page."""
|
||||
@@ -36,7 +36,7 @@ def create_item_generator(model):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('infoscreen.add_infoinstance', raise_exception=True)
|
||||
def create_item(request, *args, **kwargs):
|
||||
try:
|
||||
@@ -58,7 +58,7 @@ def delete_item_generator(model):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["DELETE"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('infoscreen.delete_infoinstance', raise_exception=True)
|
||||
def delete_item(request, *args, **kwargs):
|
||||
idx = kwargs.pop("idx", 0)
|
||||
@@ -80,7 +80,7 @@ def delete_item_generator(model):
|
||||
|
||||
# due to model structure this is little complicated
|
||||
@ensure_csrf_cookie
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('infoscreen.delete_infoinstance', raise_exception=True)
|
||||
@require_http_methods(["DELETE"])
|
||||
def delete_info_item(request, *args, **kwargs):
|
||||
@@ -105,7 +105,7 @@ def delete_info_item(request, *args, **kwargs):
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@ensure_csrf_cookie
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('infoscreen.add_infoinstance', raise_exception=True)
|
||||
def create_image_item(request, *args, **kwargs):
|
||||
"""Create image Infoscreen item."""
|
||||
@@ -122,7 +122,7 @@ def create_image_item(request, *args, **kwargs):
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@ensure_csrf_cookie
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('infoscreen.add_infoinstance', raise_exception=True)
|
||||
def create_video_item(request, *args, **kwargs):
|
||||
"""Create video Infoscreen item."""
|
||||
@@ -139,7 +139,7 @@ def create_video_item(request, *args, **kwargs):
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@ensure_csrf_cookie
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('infoscreen.add_rotation', raise_exception=True)
|
||||
def create_rotation(request, *args, **kwargs):
|
||||
"""Create rotation."""
|
||||
@@ -161,7 +161,7 @@ def create_rotation(request, *args, **kwargs):
|
||||
|
||||
@require_http_methods(["DELETE"])
|
||||
@ensure_csrf_cookie
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('infoscreen.delete_rotation', raise_exception=True)
|
||||
def delete_rotation(request, *args, **kwargs):
|
||||
"""Delete rotation."""
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
<li><a href="/members/settings">{% trans "Settings" %}</a></li>
|
||||
</ul>
|
||||
|
||||
<form action="/logout" method="post"> {% csrf_token %}
|
||||
<form action="/admin/logout/" method="post"> {% csrf_token %}
|
||||
<input type="Submit" value="{% trans "Log out" %}" name="Logout" class="btn btn-danger"/>
|
||||
</form>
|
||||
</li>
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ favicon_view = RedirectView.as_view(
|
||||
url='static/img/favicon.ico', permanent=True)
|
||||
|
||||
member_autocomplete_view = login_required(
|
||||
permission_required('members.change_member', login_url='/login')(MemberAutoComplete.as_view())
|
||||
permission_required('members.change_member', login_url='/admin/login')
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
|
||||
@@ -19,7 +19,7 @@ from members.views import error_view
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.read_application', raise_exception=True)
|
||||
def application_list(request, *args, **kwargs):
|
||||
"""List member applications not yet processed."""
|
||||
@@ -42,7 +42,7 @@ def application_list(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.change_request', raise_exception=True)
|
||||
def application_edit(request, *args, **kwargs):
|
||||
"""Edit member request information."""
|
||||
@@ -60,7 +60,7 @@ def application_edit(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.add_member', raise_exception=True)
|
||||
def application_accept(request, *args, **kwargs):
|
||||
"""Accept application."""
|
||||
@@ -102,7 +102,7 @@ def application_accept(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.delete_request', raise_exception=True)
|
||||
def application_delete(request, *args, **kwargs):
|
||||
"""Delete member application."""
|
||||
@@ -128,7 +128,7 @@ def application_delete(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.delete_request', raise_exception=True)
|
||||
def application_delete_confirm(request, *args, **kwargs):
|
||||
"""Confirm application deletion."""
|
||||
@@ -152,7 +152,7 @@ def application_form(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.delete_request', raise_exception=True)
|
||||
def application_submit(request, *args, **kwargs):
|
||||
"""Submit member application"""
|
||||
|
||||
@@ -30,7 +30,7 @@ from members.views.utils import *
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.read_member', raise_exception=True)
|
||||
def member_list(request, *args, **kwargs):
|
||||
"""Render members list."""
|
||||
@@ -68,7 +68,7 @@ def member_list(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.add_member', raise_exception=True)
|
||||
def member_add(request, *args, **kwargs):
|
||||
"""Render add member page."""
|
||||
@@ -78,7 +78,7 @@ def member_add(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.delete_member', raise_exception=True)
|
||||
def member_delete_confirm(request, *args, **kwargs):
|
||||
"""Render member deletion confirmation page."""
|
||||
@@ -94,7 +94,7 @@ def member_delete_confirm(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.add_member', raise_exception=True)
|
||||
def member_add_many(request, *args, **kwargs):
|
||||
"""Render add multiple members page."""
|
||||
@@ -103,7 +103,7 @@ def member_add_many(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.add_member', raise_exception=True)
|
||||
def add_many_confirm(request, *args, **kwargs):
|
||||
models = request.session['models']
|
||||
@@ -130,7 +130,7 @@ def add_many_confirm(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.add_member', raise_exception=True)
|
||||
def member_submit(request, *args, **kwargs):
|
||||
"""Add member based on data gained from member form."""
|
||||
@@ -151,7 +151,7 @@ def member_submit(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.change_member', raise_exception=True)
|
||||
def member_update(request, *args, **kwargs):
|
||||
"""Update member information."""
|
||||
@@ -179,7 +179,7 @@ def member_update(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.delete_member', raise_exception=True)
|
||||
def member_delete(request, *args, **kwargs):
|
||||
"""Delete member."""
|
||||
@@ -204,7 +204,7 @@ def member_delete(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.change_member', raise_exception=True)
|
||||
def member_edit(request, *args, **kwargs):
|
||||
"""Edit member information."""
|
||||
|
||||
@@ -19,7 +19,7 @@ from members.views import error_view
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.read_payment', raise_exception=True)
|
||||
def payment_list(request, *args, **kwargs):
|
||||
"""Render list of payments."""
|
||||
@@ -47,7 +47,7 @@ def payment_list(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.add_payment', raise_exception=True)
|
||||
def payment_add(request, *args, **kwargs):
|
||||
"""Render add payment form."""
|
||||
@@ -57,7 +57,7 @@ def payment_add(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.add_payment', raise_exception=True)
|
||||
def payment_submit(request, *args, **kwargs):
|
||||
"""Submit payment."""
|
||||
@@ -79,7 +79,7 @@ def payment_submit(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.change_payment', raise_exception=True)
|
||||
def payment_edit(request, *args, **kwargs):
|
||||
"""Edit payment."""
|
||||
@@ -96,7 +96,7 @@ def payment_edit(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.delete_payment', raise_exception=True)
|
||||
def payment_delete_confirm(request, *args, **kwargs):
|
||||
"""Render payment delete confirmation page."""
|
||||
@@ -113,7 +113,7 @@ def payment_delete_confirm(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.delete_payment', raise_exception=True)
|
||||
def payment_delete(request, *args, **kwargs):
|
||||
"""Delete payment."""
|
||||
@@ -138,7 +138,7 @@ def payment_delete(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.change_payment', raise_exception=True)
|
||||
def payment_update(request, *args, **kwargs):
|
||||
"""Update payment information."""
|
||||
|
||||
@@ -95,7 +95,7 @@ def convert_table_to_html(table, request):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["GET"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required('members.change_member', raise_exception=True)
|
||||
def settings_page(request, *args, **kwargs):
|
||||
"""Render member app settings page."""
|
||||
@@ -104,7 +104,7 @@ def settings_page(request, *args, **kwargs):
|
||||
|
||||
@ensure_csrf_cookie
|
||||
@require_http_methods(["POST"])
|
||||
@login_required(login_url='/login')
|
||||
@login_required(login_url='/admin/login')
|
||||
@permission_required(['members.change_member', 'members.change_payment'], raise_exception=True)
|
||||
def import_csv(request, *args, **kwargs):
|
||||
"""Get csv data imported to page and create members based on that."""
|
||||
|
||||
+1
-5
@@ -29,12 +29,8 @@ django-autocomplete-light==3.2.10
|
||||
six==1.10.0
|
||||
django-suit==0.2.26
|
||||
telepot==12.3
|
||||
django-password-reset==1.0
|
||||
<<<<<<< Updated upstream
|
||||
# django-password-reset==1.0
|
||||
pyexcel==0.5.8
|
||||
=======
|
||||
pyexcel==0.5.7
|
||||
>>>>>>> Stashed changes
|
||||
pyexcel-xlsx==0.5.5
|
||||
django-import-export==0.7.0
|
||||
openpyxl==2.4.11
|
||||
|
||||
@@ -102,7 +102,6 @@ INSTALLED_APPS = [
|
||||
'auditlog',
|
||||
'phonenumber_field',
|
||||
'import_export',
|
||||
'password_reset',
|
||||
]
|
||||
|
||||
IMPORT_EXPORT_USE_TRANSACTIONS = True
|
||||
|
||||
@@ -26,7 +26,6 @@ import webapp.urls
|
||||
import infoscreen.urls
|
||||
import members.urls
|
||||
import coffee_scale.urls
|
||||
import password_reset.urls
|
||||
|
||||
urlpatterns = [
|
||||
url(r'', include('webapp.urls')),
|
||||
@@ -38,7 +37,6 @@ urlpatterns = [
|
||||
|
||||
# admin
|
||||
url(r'^admin/', admin.site.urls),
|
||||
url(r'^reset/', include('password_reset.urls')),
|
||||
|
||||
# i18n default view for changing the active language
|
||||
url(r'^i18n/', include('django.conf.urls.i18n')),
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
{% extends "webapp:base.html" %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
|
||||
{% block navigation %}
|
||||
{% endblock navigation %}
|
||||
|
||||
{% block content %}
|
||||
<h1>SIK Admin</h1>
|
||||
<form method="POST" class="form-horizontal" action=""> {% csrf_token %}
|
||||
<div class="form-group">
|
||||
<label for="input-username" class="col-form-label">{% trans "Username" %}</label>
|
||||
<input type="text" name="username" id="input-username" class="form-control" placeholder="{% trans "Username" %}"></input>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="input-password" class="col-form-label">{% trans "Password" %}</label>
|
||||
<input type="password" name="passwd" id="input-passwd" class="form-control" placeholder="{% trans "Password" %}"></input>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<a href={% url "password_reset_recover" %}>{% trans "Forgot password?" %}</a>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="text-danger">{{ error }}</div>
|
||||
</div>
|
||||
<div class="form-group" id="login-button">
|
||||
<button type="submit" class="btn btn-primary">{% trans "Log in" %}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
@@ -1 +0,0 @@
|
||||
{% extends "login.html" %}
|
||||
@@ -1,8 +0,0 @@
|
||||
{% extends "password_reset/base.html" %}{% load i18n %}
|
||||
|
||||
{% block title %}{% trans "New password set" %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<p>{% trans "Your password has successfully been reset. You can use it right now on the login page." %}</p>
|
||||
<p><a href="/login">Log in</a></p>
|
||||
{% endblock %}
|
||||
@@ -1,12 +0,0 @@
|
||||
{% extends "password_reset/base.html" %}
|
||||
{% load i18n %}
|
||||
{% load bootstrap3 %}
|
||||
|
||||
{% block content %}
|
||||
<h1>{% trans "Password recovery" %}</h1>
|
||||
<form method="post" action="{{ url }}">
|
||||
{% csrf_token %}
|
||||
{% bootstrap_form form %}
|
||||
<p><input class="btn btn-primary" type="submit" value="{% trans "Send" %}"></p>
|
||||
</form>
|
||||
{% endblock %}
|
||||
@@ -1,14 +0,0 @@
|
||||
{% extends "password_reset/base.html" %}{% load i18n %}
|
||||
|
||||
{% block content %}
|
||||
{% if invalid %}{% url "password_reset_recover" as recovery_url %}
|
||||
<p>{% blocktrans %}Sorry, this password reset link is invalid. You can still <a href="{{ recovery_url }}">request a new one</a>.{% endblocktrans %}</p>
|
||||
{% else %}
|
||||
<p>{% blocktrans %}Hi, <strong>{{ username }}</strong>. Please choose your new password.{% endblocktrans %}</p>
|
||||
<form method="post" action="{% url "password_reset_reset" token %}">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<p><input type="submit" value="{% trans "Set new password" %}"></p>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -1,15 +0,0 @@
|
||||
{% autoescape off %}
|
||||
You're receiving this e-mail because you requested a password reset for your user account at {{ site_name }}.
|
||||
|
||||
Please go to the following page and choose a new password:
|
||||
{% block reset_link %}
|
||||
{{ protocol }}://{{ domain }}{% url django.contrib.auth.views.password_reset_confirm uidb36=uid, token=token %}
|
||||
{% endblock %}
|
||||
|
||||
Your username, in case you've forgotten: {{ user.username }}
|
||||
|
||||
Thanks for using our site!
|
||||
|
||||
The {{ site_name }} team.
|
||||
|
||||
{% endautoescape %}
|
||||
@@ -1,8 +0,0 @@
|
||||
{% extends "password_reset/base.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{% trans "Password recovery sent" %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<p>{% blocktrans with ago=timestamp|timesince %}An email was sent to <strong>{{ email }}</strong> {{ ago }} ago. Use the link in it to set a new password.{% endblocktrans %}</p>
|
||||
{% endblock %}
|
||||
+4
-4
@@ -7,8 +7,8 @@ from rest_framework import routers
|
||||
# from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
# from webapp.views import main_index
|
||||
from webapp.views import login_view
|
||||
from webapp.views import logout_view
|
||||
# from webapp.views import login_view
|
||||
# from webapp.views import logout_view
|
||||
# from webapp.views import about_view
|
||||
# from webapp.views import guild_view
|
||||
# from webapp.views import freshmen_view
|
||||
@@ -28,8 +28,8 @@ router.register(r'signup', SignupViewSet)
|
||||
urlpatterns = [
|
||||
url(r'^', include(router.urls)),
|
||||
# login stuff
|
||||
url(r'^login$', login_view),
|
||||
url(r'^logout$', logout_view),
|
||||
# url(r'^login$', login_view),
|
||||
# url(r'^logout$', logout_view),
|
||||
]
|
||||
# urlpatterns = [
|
||||
# # main
|
||||
|
||||
@@ -54,36 +54,6 @@ def main_index(request, *args, **kwargs):
|
||||
return render(request, "index.html", {})
|
||||
|
||||
|
||||
@require_http_methods(["GET", "POST"])
|
||||
def login_view(request, *args, **kwargs):
|
||||
"""Render login view."""
|
||||
if request.method == "POST":
|
||||
uname = request.POST.get("username", None)
|
||||
pw = request.POST.get("passwd", None)
|
||||
user = authenticate(username=uname, password=pw)
|
||||
if user is not None:
|
||||
login(request, user)
|
||||
original_site = request.GET.get("next", None) or "/"
|
||||
return redirect(original_site)
|
||||
return render(request,
|
||||
"login.html",
|
||||
{"error": "☹ Kirjautuminen kosahti. Yritä uudelleen!"})
|
||||
|
||||
# user got here by a get request
|
||||
user = request.user
|
||||
if user.is_authenticated:
|
||||
# user shoud not be here authenticated with get but get rid if is
|
||||
return redirect("/")
|
||||
return render(request, "login.html", {})
|
||||
|
||||
|
||||
@require_http_methods(["GET", "POST"])
|
||||
def logout_view(request, *args, **kwargs):
|
||||
"""Logout user and return to main page."""
|
||||
logout(request)
|
||||
return redirect("/")
|
||||
|
||||
|
||||
@require_http_methods(["GET"])
|
||||
def about_view(request, *args, **kwargs):
|
||||
"""Render about page."""
|
||||
|
||||
Reference in New Issue
Block a user