Merge branch '24-impersonate' into 'master'
Resolve "Impersonate user" Closes #24 See merge request BeryJu.org/passbook!11
This commit is contained in:
commit
7507ad2620
|
@ -0,0 +1,25 @@
|
||||||
|
"""passbook admin Middleware to impersonate users"""
|
||||||
|
|
||||||
|
from passbook.core.models import User
|
||||||
|
|
||||||
|
|
||||||
|
def impersonate(get_response):
|
||||||
|
"""Middleware to impersonate users"""
|
||||||
|
|
||||||
|
def middleware(request):
|
||||||
|
"""Middleware to impersonate users"""
|
||||||
|
|
||||||
|
# User is superuser and has __impersonate ID set
|
||||||
|
if request.user.is_superuser and "__impersonate" in request.GET:
|
||||||
|
request.session['impersonate_id'] = request.GET["__impersonate"]
|
||||||
|
# user wants to stop impersonation
|
||||||
|
elif "__unimpersonate" in request.GET and 'impersonate_id' in request.session:
|
||||||
|
del request.session['impersonate_id']
|
||||||
|
|
||||||
|
# Actually impersonate user
|
||||||
|
if request.user.is_superuser and 'impersonate_id' in request.session:
|
||||||
|
request.user = User.objects.get(pk=request.session['impersonate_id'])
|
||||||
|
|
||||||
|
response = get_response(request)
|
||||||
|
return response
|
||||||
|
return middleware
|
|
@ -0,0 +1,5 @@
|
||||||
|
"""passbook admin settings"""
|
||||||
|
|
||||||
|
MIDDLEWARE = [
|
||||||
|
'passbook.admin.middleware.impersonate',
|
||||||
|
]
|
|
@ -31,6 +31,8 @@
|
||||||
href="{% url 'passbook_admin:user-delete' pk=user.pk %}?back={{ request.get_full_path }}">{% trans 'Delete' %}</a>
|
href="{% url 'passbook_admin:user-delete' pk=user.pk %}?back={{ request.get_full_path }}">{% trans 'Delete' %}</a>
|
||||||
<a class="btn btn-default btn-sm"
|
<a class="btn btn-default btn-sm"
|
||||||
href="{% url 'passbook_admin:user-password-reset' pk=user.pk %}?back={{ request.get_full_path }}">{% trans 'Reset Password' %}</a>
|
href="{% url 'passbook_admin:user-password-reset' pk=user.pk %}?back={{ request.get_full_path }}">{% trans 'Reset Password' %}</a>
|
||||||
|
<a class="btn btn-default btn-sm"
|
||||||
|
href="{% url 'passbook_core:overview' %}?__impersonate={{ user.pk }}">{% trans 'Impersonate' %}</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -4,40 +4,51 @@
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta charset="UTF-8">
|
||||||
<title>
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
{% block title %}
|
<title>
|
||||||
{% title %}
|
{% block title %}
|
||||||
{% endblock %}
|
{% title %}
|
||||||
</title>
|
|
||||||
<link rel="icon" type="image/png" href="{% static 'img/logo.png' %}">
|
|
||||||
<link rel="shortcut icon" type="image/png" href="{% static 'img/logo.png' %}">
|
|
||||||
<link rel="stylesheet" type="text/css" href="{% static 'css/patternfly.min.css' %}">
|
|
||||||
<link rel="stylesheet" type="text/css" href="{% static 'css/patternfly-additions.min.css' %}">
|
|
||||||
<link rel="stylesheet" type="text/css" href="{% static 'css/passbook.css' %}">
|
|
||||||
<style>
|
|
||||||
.login-pf {
|
|
||||||
background-attachment: fixed;
|
|
||||||
scroll-behavior: smooth;
|
|
||||||
background-size: cover;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
{% block head %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</head>
|
</title>
|
||||||
<body {% if is_login %} class="login-pf" {% endif %}>
|
<link rel="icon" type="image/png" href="{% static 'img/logo.png' %}">
|
||||||
{% block body %}
|
<link rel="shortcut icon" type="image/png" href="{% static 'img/logo.png' %}">
|
||||||
{% endblock %}
|
<link rel="stylesheet" type="text/css" href="{% static 'css/patternfly.min.css' %}">
|
||||||
<script src="{% static 'js/jquery.min.js' %}"></script>
|
<link rel="stylesheet" type="text/css" href="{% static 'css/patternfly-additions.min.css' %}">
|
||||||
<script src="{% static 'js/bootstrap.min.js' %}"></script>
|
<link rel="stylesheet" type="text/css" href="{% static 'css/passbook.css' %}">
|
||||||
<script src="{% static 'js/patternfly.min.js' %}"></script>
|
<style>
|
||||||
<script src="{% static 'js/passbook.js' %}"></script>
|
.login-pf {
|
||||||
{% block scripts %}
|
background-attachment: fixed;
|
||||||
{% endblock %}
|
scroll-behavior: smooth;
|
||||||
<div class="modals">
|
background-size: cover;
|
||||||
{% include 'partials/about_modal.html' %}
|
}
|
||||||
</div>
|
</style>
|
||||||
</body>
|
{% block head %}
|
||||||
|
{% endblock %}
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body {% if is_login %} class="login-pf" {% endif %}>
|
||||||
|
{% if 'impersonate_id' in request.session %}
|
||||||
|
<div class="experimental-pf-bar">
|
||||||
|
<span id="experimentalBar" class="experimental-pf-text">
|
||||||
|
{% blocktrans with user=user %}You're currently impersonating {{ user }}.{% endblocktrans %}
|
||||||
|
<a href="?__unimpersonate=True" id="acceptMessage">{% trans 'Stop impersonation' %}</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% block body %}
|
||||||
|
{% endblock %}
|
||||||
|
<script src="{% static 'js/jquery.min.js' %}"></script>
|
||||||
|
<script src="{% static 'js/bootstrap.min.js' %}"></script>
|
||||||
|
<script src="{% static 'js/patternfly.min.js' %}"></script>
|
||||||
|
<script src="{% static 'js/passbook.js' %}"></script>
|
||||||
|
{% block scripts %}
|
||||||
|
{% endblock %}
|
||||||
|
<div class="modals">
|
||||||
|
{% include 'partials/about_modal.html' %}
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
Reference in New Issue