From 7734a0d36f8246c0dad0191872f12312eb26ad9d Mon Sep 17 00:00:00 2001 From: MG Date: Sat, 18 May 2019 17:53:47 +0200 Subject: [PATCH 1/4] UI tweak --- .../management/commands/deletable.py | 21 +++++++++++++++---- src/templates/user/realm_user_detail.jinja2 | 16 ++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/account_helper/management/commands/deletable.py b/src/account_helper/management/commands/deletable.py index e0788a6..68ad440 100644 --- a/src/account_helper/management/commands/deletable.py +++ b/src/account_helper/management/commands/deletable.py @@ -15,16 +15,24 @@ class Command(BaseCommand): parser.add_argument( '--delete', action='store_true', - help='Delete poll instead of closing it', + help='Delete users which deletion time is lower than the current date', ) parser.add_argument( '--json', action='store_true', help='Return an json encoded String', ) + parser.add_argument( + '--all', + action='store_true', + help='Delete all marked user, --delete is required', + ) def handle(self, *args, **options): - deletables = DeletedUser.objects.filter(deletion_date__lte=timezone.now()) + if options['all']: + deletables = DeletedUser.objects.all() + else: + deletables = DeletedUser.objects.filter(deletion_date__lte=timezone.now()) output = "" if options['json']: json_output = {'deletables': []} @@ -34,7 +42,6 @@ class Command(BaseCommand): else: for user in deletables: output += f'{user}\n' - if options['delete']: LdapUser.base_dn = LdapUser.ROOT_DN for user in deletables: @@ -48,4 +55,10 @@ class Command(BaseCommand): pass if not options['json']: output += '\nSuccessfully deleted all listed users' - self.stdout.write(self.style.SUCCESS(output)) + if output: + self.stdout.write(self.style.SUCCESS(output)) + else: + for deletable in deletables: + self.stdout.write(self.style.SUCCESS(deletable)) + + diff --git a/src/templates/user/realm_user_detail.jinja2 b/src/templates/user/realm_user_detail.jinja2 index 12451ba..a9b7e49 100644 --- a/src/templates/user/realm_user_detail.jinja2 +++ b/src/templates/user/realm_user_detail.jinja2 @@ -26,14 +26,22 @@ Noch nicht generiert {% endif %} -
  • Vorname: {{ user.user.first_name }}
  • -
  • Nachname: {{ user.user.last_name }}
  • + {% if user.user.phone %} +
  • Vorname: {{ user.user.first_name }}
  • + {% endif %} + {% if user.user.phone %} +
  • Nachname: {{ user.user.last_name }}
  • + {% endif %}
  • Email: {{ user.user.email }}
  • Passwort: Nutzerpasswort zurücksetzen
  • -
  • Telefon: {{ user.user.phone }}
  • -
  • Mobiltelefon: {{ user.user.mobile_phone }}
  • + {% if user.user.phone %} +
  • Telefon: {{ user.user.phone }}
  • + {% endif %} + {% if user.user.mobile_phone %} +
  • Mobiltelefon: {{ user.user.mobile_phone }}
  • + {% endif %}
  • Gruppen: {% if groups %} {% for group in groups %} From 09c422ed15ef39c199031d5a94519aaeccd94614 Mon Sep 17 00:00:00 2001 From: MG Date: Fri, 7 Jun 2019 15:58:13 +0200 Subject: [PATCH 2/4] Fix #78; Fix empty django accounts --- src/account_manager/forms.py | 5 +++++ src/account_manager/utils/django_user.py | 7 +++++++ src/account_manager/views/user_views.py | 2 ++ 3 files changed, 14 insertions(+) create mode 100644 src/account_manager/utils/django_user.py diff --git a/src/account_manager/forms.py b/src/account_manager/forms.py index d8d7964..859c10c 100644 --- a/src/account_manager/forms.py +++ b/src/account_manager/forms.py @@ -2,6 +2,7 @@ from django import forms from django.contrib.auth import get_user_model from django.contrib.auth.forms import PasswordResetForm +from account_manager.utils.django_user import update_dajngo_user from .models import LdapUser, LdapGroup from django.forms import modelformset_factory import logging @@ -83,6 +84,10 @@ class LdapPasswordResetForm(PasswordResetForm): that prevent inactive users and users with unusable passwords from resetting their password. """ + LdapUser.base_dn = LdapUser.ROOT_DN + ldap_users = LdapUser.objects.filter(email=email) + for ldap_user in ldap_users: + update_dajngo_user(ldap_user) logger.debug('Pasword reset get users') active_users = UserModel._default_manager.filter(**{ '%s__iexact' % UserModel.get_email_field_name(): email, diff --git a/src/account_manager/utils/django_user.py b/src/account_manager/utils/django_user.py new file mode 100644 index 0000000..8bf82f1 --- /dev/null +++ b/src/account_manager/utils/django_user.py @@ -0,0 +1,7 @@ +from django.contrib.auth.models import User + + +def update_dajngo_user(ldap_user): + user, _ = User.objects.get_or_create(username=ldap_user.username) + user.email = ldap_user.email + user.save() diff --git a/src/account_manager/views/user_views.py b/src/account_manager/views/user_views.py index 7581422..9375d27 100644 --- a/src/account_manager/views/user_views.py +++ b/src/account_manager/views/user_views.py @@ -18,6 +18,7 @@ from account_manager.forms import AddLDAPUserForm, UserDeleteListForm, UpdateLDA UserGroupListForm from account_manager.main_views import is_realm_admin from account_manager.models import LdapUser, LdapGroup +from account_manager.utils.django_user import update_dajngo_user from account_manager.utils.mail_utils import send_welcome_mail, send_deletion_mail from django.conf import settings @@ -175,6 +176,7 @@ def realm_user_resend_welcome_mail(request, realm_id, user_dn): realm = Realm.objects.get(id=realm_id) LdapUser.base_dn = f'ou=people,{realm.ldap_base_dn}' ldap_user = LdapUser.objects.get(dn=user_dn) + update_dajngo_user(ldap_user) current_site = get_current_site(request) protocol = 'http' if request.is_secure(): From a63426d1ea6b9a45e5d317da3fb23eed09622d64 Mon Sep 17 00:00:00 2001 From: MG Date: Fri, 7 Jun 2019 17:34:13 +0200 Subject: [PATCH 3/4] Add toast message on mail send --- src/account_manager/views/user_views.py | 12 +++++++++--- src/static/css/floating_labels.css | 15 +++++++++++++++ src/static/js/main.js | 4 ++++ src/templates/base.jinja2 | 1 + src/templates/macros/utils_macros.jinja2 | 13 +++++++++++++ src/templates/user/realm_user_detail.jinja2 | 2 ++ 6 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/account_manager/views/user_views.py b/src/account_manager/views/user_views.py index 9375d27..85cedb7 100644 --- a/src/account_manager/views/user_views.py +++ b/src/account_manager/views/user_views.py @@ -58,14 +58,19 @@ def realm_user(request, realm_id): @is_realm_admin @protect_cross_realm_user_access def realm_user_detail(request, realm_id, user_dn): + return get_rendered_user_details(request, realm_id, user_dn) + + +def get_rendered_user_details(request, realm_id, user_dn, success_headline=None, success_text=None): realm = Realm.objects.get(id=realm_id) LdapUser.base_dn = realm.ldap_base_dn LdapGroup.base_dn = LdapGroup.ROOT_DN - user = LdapUser.objects.get(dn=user_dn) user_wrapper = LdapUser.get_extended_user(user) groups = LdapGroup.objects.filter(members=user.dn) - return render(request, 'user/realm_user_detail.jinja2', {'user': user_wrapper, 'groups': groups, 'realm': realm}) + return render(request, 'user/realm_user_detail.jinja2', + {'user': user_wrapper, 'groups': groups, 'realm': realm, 'success_headline': success_headline, + 'success_text': success_text}) @login_required @@ -183,7 +188,8 @@ def realm_user_resend_welcome_mail(request, realm_id, user_dn): protocol = 'https' send_welcome_mail(domain=current_site.domain, email=ldap_user.email, protocol=protocol, realm=realm, user=User.objects.get(username=ldap_user.username)) - return redirect('realm-user-detail', realm_id, user_dn) + return get_rendered_user_details(request, realm_id, user_dn, success_headline="Willkommensmail", + success_text="Willkommensmail erfolgreich versendet.") @login_required diff --git a/src/static/css/floating_labels.css b/src/static/css/floating_labels.css index 6b6865a..ef4df47 100644 --- a/src/static/css/floating_labels.css +++ b/src/static/css/floating_labels.css @@ -215,6 +215,21 @@ color: #6c757d; } +/* ------------------------------------------------------------------------------------------------------------------ */ +/* -- Toast -- */ +/* ------------------------------------------------------------------------------------------------------------------ */ +.toast { + position: absolute; + top: 5px; + right: -250px; + width: 250px; + min-height: 50px; + z-index: 1000; + transform: translateX(-280px); + transition: transform 2s; +} + + /* ------------------------------------------------------------------------------------------------------------------ */ /* -- Footer -- */ /* ------------------------------------------------------------------------------------------------------------------ */ diff --git a/src/static/js/main.js b/src/static/js/main.js index 0983d36..515d07f 100644 --- a/src/static/js/main.js +++ b/src/static/js/main.js @@ -3,6 +3,10 @@ const TABLE_CLASS = '.data-table'; const TABLE_CLASS_NO_PAGING = '.data-table-npaging'; $(document).ready(function () { + // Bottstrap Toast + $('.toast').toast('show'); + + //Datatables const data_table = $(TABLE_CLASS).DataTable({ "paging": true, "pageLength": 10, diff --git a/src/templates/base.jinja2 b/src/templates/base.jinja2 index 0d7fe60..05dfd1c 100644 --- a/src/templates/base.jinja2 +++ b/src/templates/base.jinja2 @@ -65,6 +65,7 @@ + diff --git a/src/templates/macros/utils_macros.jinja2 b/src/templates/macros/utils_macros.jinja2 index 305cab1..9b6246d 100644 --- a/src/templates/macros/utils_macros.jinja2 +++ b/src/templates/macros/utils_macros.jinja2 @@ -131,6 +131,19 @@ {% endif %} {% endmacro %} +{% macro get_success_toast(success_head, success_text) -%} + {% if success_text and success_head %} + + {% endif %} +{% endmacro %} + {% macro get_data_table_search_field(input_id="data-table-search-input") -%}
    {{ user.user.username }} From eca52bec63dbd8f4dedd800ca6c49bdeae5156b7 Mon Sep 17 00:00:00 2001 From: MG Date: Fri, 7 Jun 2019 17:51:44 +0200 Subject: [PATCH 4/4] Add toast infos --- src/account_manager/main_views.py | 51 ++++++++++------------- src/templates/macros/utils_macros.jinja2 | 12 +++++- src/templates/realm/realm_detailed.jinja2 | 3 ++ 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/account_manager/main_views.py b/src/account_manager/main_views.py index a4c8da4..0974c06 100644 --- a/src/account_manager/main_views.py +++ b/src/account_manager/main_views.py @@ -105,16 +105,25 @@ def base_dn_available(base_dn): @login_required @is_realm_admin def realm_detail(request, realm_id): + return get_realm_detail_rendered(request, realm_id) + + +def get_realm_detail_rendered(request, realm_id, success_headline=None, success_text=None, error_headline=None, + error_text=None): 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, - 'inactive_user_count': inactive_users, 'users_count': LdapUser.objects.all().count()}) + {'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(), + 'success_headline': success_headline, + 'success_text': success_text, + 'error_headline': error_headline, + 'error_text': error_text}) def get_default_admin_group(realm): @@ -214,33 +223,19 @@ def permission_denied(request): def realm_email_test(request, realm_id): realm = Realm.objects.get(id=realm_id) - ldap_admin_group, ldap_default_group = get_default_admin_group(realm) try: realm_send_mail(realm, realm.email, f'{realm.name} Test Mail', f'Du hast die Mail Konfiguration für {realm.name} erfolgreich abgeschlossen.') except SMTPAuthenticationError as err: - return render(request, 'realm/realm_detailed.jinja2', - {'realm': realm, 'error': f'Mail konnte nicht versendet werden, Anmeldedaten inkorrekt.', - 'ldap_admin_group': ldap_admin_group, - 'ldap_default_group': ldap_default_group}) + return get_realm_detail_rendered(request, realm_id, error_headline="Testmail", + error_text=f'Mail konnte nicht versendet werden, Anmeldedaten inkorrekt.') except SMTPConnectError as err: - return render(request, 'realm/realm_detailed.jinja2', - {'realm': realm, - 'error': f'Mail konnte nicht versendet werden. Verbindungsaufbau abgelehnt. Bitte überprüfen sie die Server Addresse und den Port', - 'ldap_admin_group': ldap_admin_group, - 'ldap_default_group': ldap_default_group}) + return get_realm_detail_rendered(request, realm_id, error_headline="Testmail", + error_text=f'Mail konnte nicht versendet werden. Verbindungsaufbau abgelehnt. Bitte überprüfen sie die Server Addresse und den Port') except timeout as err: - return render(request, 'realm/realm_detailed.jinja2', - {'realm': realm, - 'error': f'Mail konnte nicht versendet werden. Zeitüberschreitung beim Verbindungsaufbau. Bitte überprüfen sie die Server Addresse und den Port', - 'ldap_admin_group': ldap_admin_group, - 'ldap_default_group': ldap_default_group}) + return get_realm_detail_rendered(request, realm_id, error_headline="Testmail", + error_text=f'Mail konnte nicht versendet werden. Zeitüberschreitung beim Verbindungsaufbau. Bitte überprüfen sie die Server Addresse und den Port') except SMTPException: - return render(request, 'realm/realm_detailed.jinja2', - {'realm': realm, - 'error': f'Mail konnte nicht versendet werden. Bitte kontaktieren sie den Administrator', - 'ldap_admin_group': ldap_admin_group, - 'ldap_default_group': ldap_default_group}) - return render(request, 'realm/realm_detailed.jinja2', - {'realm': realm, 'notice': 'Test erfolgreich', 'ldap_admin_group': ldap_admin_group, - 'ldap_default_group': ldap_default_group}) + return get_realm_detail_rendered(request, realm_id, error_headline="Testmail", + error_text=f'Mail konnte nicht versendet werden. Bitte kontaktieren sie den Administrator') + return get_realm_detail_rendered(request, realm_id, success_headline="Testmail", success_text='Test erfolgreich') diff --git a/src/templates/macros/utils_macros.jinja2 b/src/templates/macros/utils_macros.jinja2 index 9b6246d..c734496 100644 --- a/src/templates/macros/utils_macros.jinja2 +++ b/src/templates/macros/utils_macros.jinja2 @@ -131,7 +131,7 @@ {% endif %} {% endmacro %} -{% macro get_success_toast(success_head, success_text) -%} +{% macro get_success_toast(success_head, success_text, error_headline, error_text) -%} {% if success_text and success_head %} {% endif %} + {% if error_text and error_headline %} + + {% endif %} {% endmacro %} {% macro get_data_table_search_field(input_id="data-table-search-input") -%} diff --git a/src/templates/realm/realm_detailed.jinja2 b/src/templates/realm/realm_detailed.jinja2 index 760b402..9e39de2 100644 --- a/src/templates/realm/realm_detailed.jinja2 +++ b/src/templates/realm/realm_detailed.jinja2 @@ -1,4 +1,6 @@ {% extends 'base_admin.jinja2' %} +{% import 'macros/utils_macros.jinja2' as mutils %} + {% block admin_content %}
    @@ -19,6 +21,7 @@

    {{ error }}

    {% endif %} {% block detail_content %} + {{ mutils.get_success_toast(success_headline, success_text, error_headline, error_text) }}
    • LDAP Organisationseinheit: {{ realm.ldap_base_dn }}
    • Nutzeranzahl (Aktive/Inaktive): {{ users_count }}