From 2dd8a0d4df774da14d7b6dda8c82e03b3d70c9c3 Mon Sep 17 00:00:00 2001 From: MG Date: Wed, 15 May 2019 03:00:37 +0200 Subject: [PATCH] Implement inactive user deletion, Implement deletion form as macro --- src/account_manager/main_views.py | 8 +- src/account_manager/models.py | 7 ++ src/account_manager/urls.py | 2 + src/account_manager/views/user_views.py | 22 +++++ src/templates/group/group_add.jinja2 | 2 +- src/templates/macros/form_macros.jinja2 | 97 +++++++++++++++++-- src/templates/realm/realm_detailed.jinja2 | 5 + .../realm/realm_user_multiple_delete.jinja2 | 50 +--------- .../realm_user_multiple_delete_confirm.jinja2 | 36 +------ 9 files changed, 135 insertions(+), 94 deletions(-) diff --git a/src/account_manager/main_views.py b/src/account_manager/main_views.py index 9a4de2e..a4c8da4 100644 --- a/src/account_manager/main_views.py +++ b/src/account_manager/main_views.py @@ -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): diff --git a/src/account_manager/models.py b/src/account_manager/models.py index b69e849..dc7f1be 100644 --- a/src/account_manager/models.py +++ b/src/account_manager/models.py @@ -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): """ diff --git a/src/account_manager/urls.py b/src/account_manager/urls.py index f1f1492..6bc24f4 100644 --- a/src/account_manager/urls.py +++ b/src/account_manager/urls.py @@ -51,6 +51,8 @@ urlpatterns = [ name='realm-multiple-user-delete-confirm'), path('realm//user/delete/multiple/', user_views.realm_multiple_user_delete, name='realm-multiple-user-delete'), + path('realm//user/delete/multiple/inactive/', user_views.realm_multiple_user_delete_inactive, + name='realm-multiple-user-delete-inactive'), # Realm Group path('realm//groups/', group_views.realm_groups, name='realm-group-list'), diff --git a/src/account_manager/views/user_views.py b/src/account_manager/views/user_views.py index 31b0133..999d8d9 100644 --- a/src/account_manager/views/user_views.py +++ b/src/account_manager/views/user_views.py @@ -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): diff --git a/src/templates/group/group_add.jinja2 b/src/templates/group/group_add.jinja2 index 5df5216..d79a9e9 100644 --- a/src/templates/group/group_add.jinja2 +++ b/src/templates/group/group_add.jinja2 @@ -16,7 +16,7 @@ id="data-table-search-input"> - {{ mform.user_select_table_input(form.members, users) }} + {{ mform.user_select_table_input(users, field=form.members) }}
{% 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='') -%} + {% if show_lastlogin %} + + {% endif %} @@ -311,12 +323,18 @@ - + {% if show_lastlogin %} + + {% endif %} + + {% endfor %} + {% for user in deletable_users %} + + + + + + + {% if show_lastlogin %} + + {% endif %} + + + {% endfor %} + {% for user in blocked_users %} + + + + + + + {% if show_lastlogin %} + + {% endif %} {% endfor %} diff --git a/src/templates/realm/realm_detailed.jinja2 b/src/templates/realm/realm_detailed.jinja2 index c002521..0e8f68f 100644 --- a/src/templates/realm/realm_detailed.jinja2 +++ b/src/templates/realm/realm_detailed.jinja2 @@ -21,6 +21,11 @@ {% block detail_content %}
  • LDAP Organisationseinheit: {{ realm.ldap_base_dn }}
  • +
  • Nutzeranzahl: {{ users_count }}
  • +
  • Inaktive Nutzer: {{ inactive_user_count }} + Inaktive Nutzer löschen
  • {% if realm.email %}
  • Email: {{ realm.email }}
  • {% else %} diff --git a/src/templates/realm/realm_user_multiple_delete.jinja2 b/src/templates/realm/realm_user_multiple_delete.jinja2 index a95c772..2744780 100644 --- a/src/templates/realm/realm_user_multiple_delete.jinja2 +++ b/src/templates/realm/realm_user_multiple_delete.jinja2 @@ -26,55 +26,7 @@
    -
- + {% if not deletable_users and not blocked_users %} + + {% endif %} Nutzername E-Mail Vorname NachnameLetzter Login
{{ user.email }} {{ user.first_name }} {{ user.last_name }} + {% if user.last_login %} + {{ user.last_login.strftime('%Y-%m-%d') }} + {% else %} + + + {% endif %} +
+ + {{ user.username }}{{ user.email }}{{ user.first_name }}{{ user.last_name }} + {% if user.last_login %} + {{ user.last_login.strftime('%Y-%m-%d') }} + {% else %} + + + {% endif %} +
+ + {{ user.username }}{{ user.email }}{{ user.first_name }}{{ user.last_name }} + {% if user.last_login %} + {{ user.last_login.strftime('%Y-%m-%d') }} + {% else %} + + + {% endif %} +
- - - - - - - - - - - {% for user in deletable_users %} - - - - - - - - - {% endfor %} - {% for user in blocked_users %} - - - - - - - - {% endfor %} - -
NutzernameE-MailVornameNachname
- - {{ user.username }}{{ user.email }}{{ user.first_name }}{{ user.last_name }}
- - {{ user.username }}{{ user.email }}{{ user.first_name }}{{ user.last_name }}
+ {{ 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') }}