Implement inactive user deletion, Implement deletion form as macro
This commit is contained in:
parent
407958ba9d
commit
2dd8a0d4df
@ -8,6 +8,7 @@ from django.contrib.auth.models import Group, User
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.db import IntegrityError
|
||||
from django.shortcuts import render, redirect, HttpResponse
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from account_helper.models import Realm
|
||||
from account_manager.utils.mail_utils import realm_send_mail
|
||||
@ -105,10 +106,15 @@ def base_dn_available(base_dn):
|
||||
@is_realm_admin
|
||||
def realm_detail(request, realm_id):
|
||||
realm = Realm.objects.get(id=realm_id)
|
||||
LdapUser.base_dn = realm.ldap_base_dn
|
||||
|
||||
inactive_users = LdapUser.get_inactive_users().count()
|
||||
logger.info(inactive_users)
|
||||
ldap_admin_group, ldap_default_group = get_default_admin_group(realm)
|
||||
|
||||
return render(request, 'realm/realm_detailed.jinja2',
|
||||
{'realm': realm, 'ldap_admin_group': ldap_admin_group, 'ldap_default_group': ldap_default_group})
|
||||
{'realm': realm, 'ldap_admin_group': ldap_admin_group, 'ldap_default_group': ldap_default_group,
|
||||
'inactive_user_count': inactive_users, 'users_count': LdapUser.objects.all().count()})
|
||||
|
||||
|
||||
def get_default_admin_group(realm):
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
# Create your models here.
|
||||
import re
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
@ -101,6 +102,12 @@ class LdapUser(Model):
|
||||
user_wrappers.append({'user': user, 'active': False})
|
||||
return user_wrappers
|
||||
|
||||
@staticmethod
|
||||
def get_inactive_users():
|
||||
last_semester = datetime.now() - timedelta(days=182)
|
||||
return (LdapUser.objects.filter(last_login__lte=last_semester) | LdapUser.objects.exclude(
|
||||
last_login__lte=datetime.now() + timedelta(days=1)))
|
||||
|
||||
|
||||
class LdapGroup(Model):
|
||||
"""
|
||||
|
||||
@ -51,6 +51,8 @@ urlpatterns = [
|
||||
name='realm-multiple-user-delete-confirm'),
|
||||
path('realm/<int:realm_id>/user/delete/multiple/', user_views.realm_multiple_user_delete,
|
||||
name='realm-multiple-user-delete'),
|
||||
path('realm/<int:realm_id>/user/delete/multiple/inactive/', user_views.realm_multiple_user_delete_inactive,
|
||||
name='realm-multiple-user-delete-inactive'),
|
||||
|
||||
# Realm Group
|
||||
path('realm/<int:realm_id>/groups/', group_views.realm_groups, name='realm-group-list'),
|
||||
|
||||
@ -246,6 +246,28 @@ def realm_multiple_user_delete(request, realm_id):
|
||||
return redirect('realm-user-list', realm.id)
|
||||
|
||||
|
||||
@login_required
|
||||
@is_realm_admin
|
||||
def realm_multiple_user_delete_inactive(request, realm_id):
|
||||
realm = Realm.objects.get(id=realm_id)
|
||||
if request.method == 'POST':
|
||||
form = UserDeleteListForm(request.POST)
|
||||
if form.is_valid():
|
||||
ldap_users = form.cleaned_data['ldap_users']
|
||||
blocked_users, deletable_users = get_deletable_blocked_users(ldap_users, realm)
|
||||
return render(request, 'realm/realm_user_multiple_delete.jinja2',
|
||||
{'form': form, 'realm': realm, 'deletable_users': deletable_users,
|
||||
'blocked_users': blocked_users,
|
||||
'confirm': True})
|
||||
LdapUser.base_dn = realm.ldap_base_dn
|
||||
inactive_users = LdapUser.get_inactive_users()
|
||||
|
||||
# TODO: Form not valid
|
||||
form = UserDeleteListForm()
|
||||
return render(request, 'realm/realm_user_multiple_delete_confirm.jinja2',
|
||||
{'form': form, 'realm': realm, 'users': inactive_users, })
|
||||
|
||||
|
||||
@login_required
|
||||
@is_realm_admin
|
||||
def realm_multiple_user_delete_confirm(request, realm_id):
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
id="data-table-search-input">
|
||||
<label for="data-table-search-input">Suche</label>
|
||||
</div>
|
||||
{{ mform.user_select_table_input(form.members, users) }}
|
||||
{{ mform.user_select_table_input(users, field=form.members) }}
|
||||
<div class="d-flex mt-4">
|
||||
<button type="submit" class="btn btn-primary mr-auto p-2">Speichern</button>
|
||||
<a href="{{ url('realm-group-list', args = [realm.id]) }}"
|
||||
|
||||
@ -288,20 +288,32 @@
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro user_select_table_input(field, users, css_classes='') -%}
|
||||
{% macro user_select_table_input(users, deletable_users=[], blocked_users=[], field=None, name=None, css_classes='',show_lastlogin=False, checkbox_label_classes='') -%}
|
||||
<table class="table table-hover table-striped table-inverse table-bordered data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="text-center">
|
||||
<input type="checkbox"
|
||||
class="table-checkbox-control-input"
|
||||
id="delete-all-checkbox"
|
||||
><label class="table-checkbox-control-label table-checkbox-control-label-add" for="delete-all-checkbox"></label>
|
||||
{% if not deletable_users and not blocked_users %}
|
||||
<input type="checkbox"
|
||||
class="table-checkbox-control-input"
|
||||
id="delete-all-checkbox"
|
||||
><label class="
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{% if checkbox_label_classes %}{{ checkbox_label_classes }}{% else %}table-checkbox-control-label table-checkbox-control-label-add{% endif %}"
|
||||
for="delete-all-checkbox"></label>
|
||||
{% endif %}
|
||||
</th>
|
||||
<th scope="col">Nutzername</th>
|
||||
<th scope="col">E-Mail</th>
|
||||
<th scope="col">Vorname</th>
|
||||
<th scope="col">Nachname</th>
|
||||
{% if show_lastlogin %}
|
||||
<th scope="col">Letzter Login</th>
|
||||
{% endif %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -311,12 +323,18 @@
|
||||
<input type="checkbox"
|
||||
class="table-checkbox-control-input multiple-select-checkbox"
|
||||
aria-describedby="{{ choice_label }}_help"
|
||||
name="{{ field.html_name }}"
|
||||
name="{% if field %}{{ field.html_name }}{% else %}{{ name }}{% endif %}"
|
||||
id="{{ user.username }}_{{ loop.index }}"
|
||||
value="{{ user.username }}"
|
||||
{% if field.value() and user.username in field.value() %}checked{% endif %}
|
||||
{% if field and field.value() and user.username in field.value() %}checked{% endif %}
|
||||
>
|
||||
<label class="table-checkbox-control-label table-checkbox-control-label-add" for="{{ user.username }}_{{ loop.index }}">
|
||||
<label class="
|
||||
|
||||
|
||||
|
||||
|
||||
{% if checkbox_label_classes %}{{ checkbox_label_classes }}{% else %}table-checkbox-control-label table-checkbox-control-label-add{% endif %}"
|
||||
for="{{ user.username }}_{{ loop.index }}">
|
||||
|
||||
</label>
|
||||
</td>
|
||||
@ -324,6 +342,69 @@
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.first_name }}</td>
|
||||
<td>{{ user.last_name }}</td>
|
||||
{% if show_lastlogin %}
|
||||
<td class="text-center">
|
||||
{% if user.last_login %}
|
||||
{{ user.last_login.strftime('%Y-%m-%d') }}
|
||||
{% else %}
|
||||
<i class="far fa-times-circle text-danger"></i><span class="d-none">+</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% for user in deletable_users %}
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="table-checkbox-control-input multiple-select-checkbox"
|
||||
id="user_{{ loop.index }}"
|
||||
value="{{ user.username }}"
|
||||
name="ldap_users"
|
||||
checked
|
||||
disabled
|
||||
><label class="table-checkbox-control-label" for="user_{{ loop.index }}"></label>
|
||||
</td>
|
||||
<td>{{ user.username }}</td>
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.first_name }}</td>
|
||||
<td>{{ user.last_name }}</td>
|
||||
{% if show_lastlogin %}
|
||||
<td class="text-center">
|
||||
{% if user.last_login %}
|
||||
{{ user.last_login.strftime('%Y-%m-%d') }}
|
||||
{% else %}
|
||||
<i class="far fa-times-circle text-danger"></i><span class="d-none">+</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
<input type="checkbox" value="{{ user.username }}" name="ldap_users" checked hidden>
|
||||
{% endfor %}
|
||||
{% for user in blocked_users %}
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="table-checkbox-control-input delete-checkbox"
|
||||
id="user_{{ loop.index }}"
|
||||
value="{{ user.username }}"
|
||||
name="ldap_users"
|
||||
disabled
|
||||
><label class="table-checkbox-control-label" for="user_{{ loop.index }}"></label>
|
||||
</td>
|
||||
<td>{{ user.username }}</td>
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.first_name }}</td>
|
||||
<td>{{ user.last_name }}</td>
|
||||
{% if show_lastlogin %}
|
||||
<td class="text-center">
|
||||
{% if user.last_login %}
|
||||
{{ user.last_login.strftime('%Y-%m-%d') }}
|
||||
{% else %}
|
||||
<i class="far fa-times-circle text-danger"></i><span class="d-none">+</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
||||
@ -21,6 +21,11 @@
|
||||
{% block detail_content %}
|
||||
<ul class="list-group list-group-flush w-100">
|
||||
<li class="list-group-item">LDAP Organisationseinheit: {{ realm.ldap_base_dn }}</li>
|
||||
<li class="list-group-item">Nutzeranzahl: {{ users_count }}</li>
|
||||
<li class="list-group-item">Inaktive Nutzer: {{ inactive_user_count }} <a
|
||||
href="{{ url('realm-multiple-user-delete-inactive', args=[realm.id]) }}"
|
||||
class="float-right">
|
||||
Inaktive Nutzer löschen</a></li>
|
||||
{% if realm.email %}
|
||||
<li class="list-group-item">Email: {{ realm.email }}</li>
|
||||
{% else %}
|
||||
|
||||
@ -26,55 +26,7 @@
|
||||
</div>
|
||||
<form action="{{ url('realm-multiple-user-delete', args=[realm.id]) }}" method="post">
|
||||
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
|
||||
<table class="table table-hover table-striped table-inverse table-bordered data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="text-center"></th>
|
||||
<th scope="col">Nutzername</th>
|
||||
<th scope="col">E-Mail</th>
|
||||
<th scope="col">Vorname</th>
|
||||
<th scope="col">Nachname</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for user in deletable_users %}
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="table-checkbox-control-input multiple-select-checkbox"
|
||||
id="user_{{ loop.index }}"
|
||||
value="{{ user.username }}"
|
||||
name="ldap_users"
|
||||
checked
|
||||
disabled
|
||||
><label class="table-checkbox-control-label" for="user_{{ loop.index }}"></label>
|
||||
</td>
|
||||
<td>{{ user.username }}</td>
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.first_name }}</td>
|
||||
<td>{{ user.last_name }}</td>
|
||||
</tr>
|
||||
<input type="checkbox" value="{{ user.username }}" name="ldap_users" checked hidden>
|
||||
{% endfor %}
|
||||
{% for user in blocked_users %}
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="table-checkbox-control-input delete-checkbox"
|
||||
id="user_{{ loop.index }}"
|
||||
value="{{ user.username }}"
|
||||
name="ldap_users"
|
||||
disabled
|
||||
><label class="table-checkbox-control-label" for="user_{{ loop.index }}"></label>
|
||||
</td>
|
||||
<td>{{ user.username }}</td>
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.first_name }}</td>
|
||||
<td>{{ user.last_name }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{{ mform.user_select_table_input(users=[], deletable_users=deletable_users, blocked_users=blocked_users, name="ldap_users",css_classes='',show_lastlogin=True, checkbox_label_classes='table-checkbox-control-label') }}
|
||||
<div class="d-flex mt-4">
|
||||
<button type="submit" class="btn btn-danger mr-auto p-2">Ausführen</button>
|
||||
<a href="{{ url('realm-user-list', args = [realm.id]) }}"
|
||||
|
||||
@ -12,41 +12,7 @@
|
||||
</div>
|
||||
<form action="{{ url('realm-multiple-user-delete-confirm', args=[realm.id]) }}" method="post">
|
||||
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
|
||||
{# {{ form.as_p() }}#}
|
||||
<table class="table table-hover table-striped table-inverse table-bordered data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="text-center">
|
||||
<input type="checkbox"
|
||||
class="table-checkbox-control-input"
|
||||
id="delete-all-checkbox"
|
||||
><label class="table-checkbox-control-label" for="delete-all-checkbox"></label>
|
||||
</th>
|
||||
<th scope="col">Nutzername</th>
|
||||
<th scope="col">E-Mail</th>
|
||||
<th scope="col">Vorname</th>
|
||||
<th scope="col">Nachname</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for user in users %}
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
<input type="checkbox"
|
||||
class="table-checkbox-control-input multiple-select-checkbox"
|
||||
id="user_{{ loop.index }}"
|
||||
value="{{ user.username }}"
|
||||
name="ldap_users"
|
||||
><label class="table-checkbox-control-label" for="user_{{ loop.index }}"></label>
|
||||
</td>
|
||||
<td>{{ user.username }}</td>
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.first_name }}</td>
|
||||
<td>{{ user.last_name }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{{ mform.user_select_table_input(users, name="ldap_users",css_classes='',show_lastlogin=True, checkbox_label_classes='table-checkbox-control-label') }}
|
||||
<div class="d-flex mt-4">
|
||||
<button type="submit" class="btn btn-danger mr-auto p-2">Ausführen</button>
|
||||
<a href="{{ url('realm-user-list', args = [realm.id]) }}"
|
||||
|
||||
Reference in New Issue
Block a user