A lot of layout tweaks, Close #41
This commit is contained in:
parent
2878b2c84d
commit
7519e69a2c
@ -6,6 +6,7 @@ from django.contrib.auth.tokens import default_token_generator
|
|||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
from django.utils.encoding import force_bytes
|
from django.utils.encoding import force_bytes
|
||||||
from django.utils.http import urlsafe_base64_encode
|
from django.utils.http import urlsafe_base64_encode
|
||||||
|
from django.db.models import Q
|
||||||
from ldapdb.models import fields as ldap_fields
|
from ldapdb.models import fields as ldap_fields
|
||||||
from ldapdb.models.base import Model
|
from ldapdb.models.base import Model
|
||||||
|
|
||||||
@ -14,6 +15,7 @@ from account_manager.utils.mail_utils import realm_send_mail
|
|||||||
from multiprocessing import Process
|
from multiprocessing import Process
|
||||||
from ldap import NO_SUCH_OBJECT, ALREADY_EXISTS
|
from ldap import NO_SUCH_OBJECT, ALREADY_EXISTS
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
from account_manager.utils.dbldap import get_filterstr
|
||||||
|
|
||||||
|
|
||||||
class LdapUser(Model):
|
class LdapUser(Model):
|
||||||
@ -73,6 +75,17 @@ class LdapUser(Model):
|
|||||||
LdapUser.base_dn = re.compile('(uid=[a-zA-Z0-9_]*),(.*)').match(ldap_user.dn).group(2)
|
LdapUser.base_dn = re.compile('(uid=[a-zA-Z0-9_]*),(.*)').match(ldap_user.dn).group(2)
|
||||||
ldap_user.save()
|
ldap_user.save()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_users_by_dn(realm, users):
|
||||||
|
print(users)
|
||||||
|
LdapGroup.base_dn = f'ou=groups,{realm.ldap_base_dn}'
|
||||||
|
users = [re.compile('uid=([a-zA-Z0-9_]*),(ou=[a-zA-Z_]*),(.*)').match(user).group(1) for
|
||||||
|
user in users]
|
||||||
|
query = Q(username=users.pop())
|
||||||
|
for user in users:
|
||||||
|
query = query | Q(username=user)
|
||||||
|
return LdapUser.objects.filter(query)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def is_user_duplicate(username):
|
def is_user_duplicate(username):
|
||||||
LdapUser.base_dn = LdapUser.ROOT_DN
|
LdapUser.base_dn = LdapUser.ROOT_DN
|
||||||
@ -82,6 +95,24 @@ class LdapUser(Model):
|
|||||||
except (NO_SUCH_OBJECT, ObjectDoesNotExist) as err:
|
except (NO_SUCH_OBJECT, ObjectDoesNotExist) as err:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_active_user(ldap_user):
|
||||||
|
try:
|
||||||
|
django_user = User.objects.get(username=ldap_user.username)
|
||||||
|
return django_user.last_login
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
return False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_user_active_marked(ldap_users):
|
||||||
|
user_wrappers = []
|
||||||
|
for user in ldap_users:
|
||||||
|
if LdapUser.is_active_user(user):
|
||||||
|
user_wrappers.append({'user': user, 'active': True})
|
||||||
|
else:
|
||||||
|
user_wrappers.append({'user': user, 'active': False})
|
||||||
|
return user_wrappers
|
||||||
|
|
||||||
|
|
||||||
class LdapGroup(Model):
|
class LdapGroup(Model):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -38,7 +38,9 @@ def group_detail(request, realm_id, group_dn):
|
|||||||
realm = Realm.objects.get(id=realm_id)
|
realm = Realm.objects.get(id=realm_id)
|
||||||
LdapGroup.base_dn = f'ou=groups,{realm.ldap_base_dn}'
|
LdapGroup.base_dn = f'ou=groups,{realm.ldap_base_dn}'
|
||||||
group = LdapGroup.objects.get(dn=group_dn)
|
group = LdapGroup.objects.get(dn=group_dn)
|
||||||
return render(request, 'group/group_detail.jinja2', {'group': group, 'realm': realm})
|
users = LdapUser.get_users_by_dn(realm, group.members)
|
||||||
|
user_wrapper = LdapUser.get_user_active_marked(users)
|
||||||
|
return render(request, 'group/group_detail.jinja2', {'group': group, 'realm': realm, 'users': user_wrapper})
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
|
|||||||
@ -1,25 +1,20 @@
|
|||||||
{% extends 'realm/realm_detailed.jinja2' %}
|
{% extends 'realm/realm_detailed.jinja2' %}
|
||||||
{% import 'macros/form_macros.jinja2' as mform %}
|
{% import 'macros/form_macros.jinja2' as mform %}
|
||||||
|
{% import 'macros/utils_macros.jinja2' as mutils %}
|
||||||
|
|
||||||
{% block detail_content %}
|
{% block detail_content %}
|
||||||
{% if not form %}
|
{% if not form %}
|
||||||
<h3>{{ group.name }}</h3>
|
<h3>Gruppe {{ group.name }}</h3>
|
||||||
<ul class="list-group list-group-flush w-100 mb-3">
|
<ul class="list-group list-group-flush w-100 mb-3">
|
||||||
<li class="list-group-item">Ldap Domain: {{ group.dn }}</li>
|
<li class="list-group-item">Ldap Domain: {{ group.dn }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h2>Mitglieder</h2>
|
<h2>Mitglieder</h2>
|
||||||
<ul class="list-group list-group-flush w-100 mb-3">
|
{{ mutils.get_user_table(realm, users) }}
|
||||||
{% for user in group.members %}
|
|
||||||
<li class="list-group-item"><a
|
|
||||||
href="{{ url('realm-user-detail', args=[realm.id, user]) }}">{{ user }}</a>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
<div class="d-flex mt-3">
|
<div class="d-flex mt-3">
|
||||||
<a href="{{ url('realm-group-update', args = [realm.id, group.dn]) }}" class="btn btn-primary mr-auto p-2">Update
|
<a href="{{ url('realm-group-update', args = [realm.id, group.dn]) }}" class="btn btn-primary mr-auto p-2">
|
||||||
Gruppe</a>
|
<i class="fas fa-pen-square"></i> Gruppe bearbeiten</a>
|
||||||
<a href="{{ url('realm-group-delete', args = [realm.id, group.dn]) }}" class="btn btn-danger p-2">Delete
|
<a href="{{ url('realm-group-delete', args = [realm.id, group.dn]) }}" class="btn btn-danger p-2"><i
|
||||||
Gruppe</a>
|
class="fas fa-trash"></i> <span class="d-sm-none d-md-inline-block">Gruppe löschen</span></a>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<form method="post">
|
<form method="post">
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
{# author: Marius Hofmann #}
|
|
||||||
|
|
||||||
{% macro get_sidebar(realms, realm=None) -%}
|
{% macro get_sidebar(realms, realm=None) -%}
|
||||||
{# <div class="col-2 col-xl-3 sidebar">#}
|
{# <div class="col-2 col-xl-3 sidebar">#}
|
||||||
<div class="bg-light border-right sidebar-wrapper">
|
<div class="bg-light border-right sidebar-wrapper">
|
||||||
@ -22,3 +20,38 @@
|
|||||||
{# </div>#}
|
{# </div>#}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
{% macro get_user_table(realm, users) -%}
|
||||||
|
<div class="form-group w-25 float-right">
|
||||||
|
<input type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="data-table-search-input">
|
||||||
|
<label for="data-table-search-input">Suche</label>
|
||||||
|
</div>
|
||||||
|
<table class="table table-hover table-striped table-inverse table-bordered data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Nutzername</th>
|
||||||
|
<th scope="col">E-Mail</th>
|
||||||
|
<th scope="col">Vorname</th>
|
||||||
|
<th scope="col">Nachname</th>
|
||||||
|
<th scope="col">Aktiv</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for user in users %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="{{ url('realm-user-detail', args=[realm.id, user.user.dn]) }}">{{ user.user.username }}</a>
|
||||||
|
</td>
|
||||||
|
<td>{{ user.user.email }}</td>
|
||||||
|
<td>{{ user.user.first_name }}</td>
|
||||||
|
<td>{{ user.user.last_name }}</td>
|
||||||
|
<td class="text-center">{% if user.active %}
|
||||||
|
<i class="fas fa-check-circle text-success"></i>{% else %}
|
||||||
|
<i class="far fa-times-circle text-warning"></i>{% endif %}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,8 @@
|
|||||||
<small>
|
<small>
|
||||||
{% if request.user.is_superuser %}
|
{% if request.user.is_superuser %}
|
||||||
<a href="{{ url('realm-delete-confirm', args=[realm.id]) }}"
|
<a href="{{ url('realm-delete-confirm', args=[realm.id]) }}"
|
||||||
class="float-right h5 realm-delete-link">Delete</a>
|
class="float-right h5 realm-delete-link"><i class="fas fa-dumpster"></i> <span
|
||||||
|
class="d-none d-md-inline-block">Bereich löschen</span></a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</small>
|
</small>
|
||||||
</h1>
|
</h1>
|
||||||
@ -46,14 +47,15 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="d-flex mt-3">
|
<div class="d-flex mt-3">
|
||||||
{% if request.user.is_superuser %}
|
{% if request.user.is_superuser %}
|
||||||
<a href="{{ url('realm-update', args=[realm.id]) }}" class="btn btn-primary mr-auto p-2">Bereichsinformationen
|
<a href="{{ url('realm-update', args=[realm.id]) }}" class="btn btn-primary mr-auto p-2"><i
|
||||||
|
class="fas fa-info-circle"></i> Bereichsinformationen
|
||||||
anpassen</a>
|
anpassen</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{# <a href="{{ url('realm-mail-add-update', args=[realm.id]) }}" class="btn btn-primary p-2">E-Mail#}
|
{# <a href="{{ url('realm-mail-add-update', args=[realm.id]) }}" class="btn btn-primary p-2">E-Mail#}
|
||||||
{# Einstellungen</a>#}
|
{# Einstellungen</a>#}
|
||||||
{% if realm.email %}
|
{% if realm.email %}
|
||||||
<a href="{{ url('realm-mail-test', args=[realm.id]) }}" class="btn btn-secondary p-2">Test
|
<a href="{{ url('realm-mail-test', args=[realm.id]) }}" class="btn btn-secondary p-2"><i
|
||||||
Mail</a>
|
class="fas fa-paper-plane"></i> Test Mail</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% block realm_form %}
|
{% block realm_form %}
|
||||||
|
|||||||
@ -20,5 +20,6 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<a href="{{ url('realm-group-add', args=[realm.id]) }}" class="btn btn-primary">Gruppen hinzufügen</a>
|
<a href="{{ url('realm-group-add', args=[realm.id]) }}" class="btn btn-primary"><i class="far fa-plus-square"></i>
|
||||||
|
Gruppen hinzufügen</a>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@ -1,38 +1,12 @@
|
|||||||
{% extends 'realm/realm_detailed.jinja2' %}
|
{% extends 'realm/realm_detailed.jinja2' %}
|
||||||
|
{% import 'macros/utils_macros.jinja2' as mutils %}
|
||||||
|
|
||||||
{% block detail_content %}
|
{% block detail_content %}
|
||||||
<h2>Nutzer </h2>
|
<h2>Nutzer </h2>
|
||||||
<div class="form-group w-25 float-right">
|
{{ mutils.get_user_table(realm, realm_user) }}
|
||||||
<input type="text"
|
<a href="{{ url('realm-user-add', args=[realm.id]) }}" class="btn btn-primary"><i class="fas fa-user-plus"></i>
|
||||||
class="form-control"
|
Nutzer hinzufügen</a>
|
||||||
id="data-table-search-input">
|
<a href="{{ url('realm-multiple-user-delete-confirm', args=[realm.id]) }}" class="btn btn-danger float-right"><i
|
||||||
<label for="data-table-search-input">Suche</label>
|
class="fas fa-trash"></i> Mehrere Nutzer
|
||||||
</div>
|
|
||||||
<table class="table table-hover table-striped table-inverse table-bordered data-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Nutzername</th>
|
|
||||||
<th scope="col">E-Mail</th>
|
|
||||||
<th scope="col">Vorname</th>
|
|
||||||
<th scope="col">Nachname</th>
|
|
||||||
<th scope="col">Aktiv</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for user in realm_user %}
|
|
||||||
<tr>
|
|
||||||
<td><a href="{{ url('realm-user-detail', args=[realm.id, user.user.dn]) }}">{{ user.user.username }}</a>
|
|
||||||
</td>
|
|
||||||
<td>{{ user.user.email }}</td>
|
|
||||||
<td>{{ user.user.first_name }}</td>
|
|
||||||
<td>{{ user.user.last_name }}</td>
|
|
||||||
<td class="text-center">{% if user.active %}
|
|
||||||
<i class="fas fa-check-circle text-success"></i>{% else %}
|
|
||||||
<i class="far fa-times-circle text-warning"></i>{% endif %}</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<a href="{{ url('realm-user-add', args=[realm.id]) }}" class="btn btn-primary">Nutzer hinzufügen</a>
|
|
||||||
<a href="{{ url('realm-multiple-user-delete-confirm', args=[realm.id]) }}" class="btn btn-danger"> Mehrere Nutzer
|
|
||||||
Löschen</a>
|
Löschen</a>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -11,8 +11,8 @@
|
|||||||
<li class="list-group-item">Nachname: {{ user.last_name }}</li>
|
<li class="list-group-item">Nachname: {{ user.last_name }}</li>
|
||||||
<li class="list-group-item">Email: {{ user.email }}</li>
|
<li class="list-group-item">Email: {{ user.email }}</li>
|
||||||
<li class="list-group-item">Passwort: {{ user.password }}</li>
|
<li class="list-group-item">Passwort: {{ user.password }}</li>
|
||||||
<li class="list-group-item">Telefon: {{ user.phone }}</li>
|
{# <li class="list-group-item">Telefon: {{ user.phone }}</li>#}
|
||||||
<li class="list-group-item">Mobiltelefon: {{ user.mobile_phone }}</li>
|
{# <li class="list-group-item">Mobiltelefon: {{ user.mobile_phone }}</li>#}
|
||||||
<li class="list-group-item">Gruppen:
|
<li class="list-group-item">Gruppen:
|
||||||
{% if groups %}
|
{% if groups %}
|
||||||
{% for group in groups %}
|
{% for group in groups %}
|
||||||
@ -28,10 +28,10 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<div class="d-flex mt-3">
|
<div class="d-flex mt-3">
|
||||||
<a href="{{ url('realm-user-update', args = [realm.id, user.dn]) }}" class="btn btn-primary mr-auto p-2">
|
<a href="{{ url('realm-user-update', args = [realm.id, user.dn]) }}" class="btn btn-primary mr-auto p-2">
|
||||||
Update User
|
<i class="fas fa-user-cog"></i> Nutzer berarbeiten
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ url('realm-user-delete-confirm', args = [realm.id, user.dn]) }}" class="btn btn-danger p-2">
|
<a href="{{ url('realm-user-delete-confirm', args = [realm.id, user.dn]) }}" class="btn btn-danger p-2">
|
||||||
Delete User
|
<i class="fas fa-trash"></i> Nutzer löschen
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<form method="post" action="{{ url('realm-user-group-update-delete', args = [realm.id, user.dn]) }}">
|
<form method="post" action="{{ url('realm-user-group-update-delete', args = [realm.id, user.dn]) }}">
|
||||||
<button type="submit" class="btn btn-warning w-100 mb-2">Entfernen</button>
|
<button type="submit" class="btn btn-warning w-100 mb-2"><i class="fas fa-minus-square"></i> Entfernen</button>
|
||||||
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
|
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
@ -24,7 +24,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<form method="post" action="{{ url('realm-user-group-update-add', args = [realm.id, user.dn]) }}">
|
<form method="post" action="{{ url('realm-user-group-update-add', args = [realm.id, user.dn]) }}">
|
||||||
<button type="submit" class="btn btn-success w-100 mb-2">Hinzufügen</button>
|
<button type="submit" class="btn btn-success w-100 mb-2"><i class="fas fa-plus-square"></i> Hinzufügen</button>
|
||||||
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
|
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
|
||||||
<ul>
|
<ul>
|
||||||
{% for realm_group in realm_groups %}
|
{% for realm_group in realm_groups %}
|
||||||
|
|||||||
Reference in New Issue
Block a user