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/account_manager/forms.py b/src/account_manager/forms.py index 9f2c386..93fdd43 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, PasswordChangeForm +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/main_views.py b/src/account_manager/main_views.py index b6c3342..01d3f27 100644 --- a/src/account_manager/main_views.py +++ b/src/account_manager/main_views.py @@ -106,7 +106,26 @@ def base_dn_available(base_dn): @login_required @is_realm_admin def realm_detail(request, realm_id): - return render_realm_detail_page(realm_id, request) + 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) + ldap_admin_group, ldap_default_group = get_default_admin_group(realm) + LdapUser.base_dn = realm.ldap_base_dn + inactive_users = LdapUser.get_inactive_users().count() + 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(), + 'success_headline': success_headline, + 'success_text': success_text, + 'error_headline': error_headline, + 'error_text': error_text}) def get_default_admin_group(realm): @@ -206,31 +225,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_realm_detail_page(realm_id, request, notice='Test erfolgreich') + 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/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 a8fac30..1e312fb 100644 --- a/src/account_manager/views/user_views.py +++ b/src/account_manager/views/user_views.py @@ -20,6 +20,7 @@ from account_manager.forms import AddLDAPUserForm, UserDeleteListForm, UpdateLDA UserGroupListForm, LdapPasswordChangeForm 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.contrib.auth import logout @@ -60,14 +61,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 @@ -178,13 +184,15 @@ 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(): 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..c734496 100644 --- a/src/templates/macros/utils_macros.jinja2 +++ b/src/templates/macros/utils_macros.jinja2 @@ -131,6 +131,29 @@ {% endif %} {% endmacro %} +{% 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") -%}
@@ -19,6 +21,7 @@

{{ error }}

{% endif %} {% block detail_content %} + {{ mutils.get_success_toast(success_headline, success_text, error_headline, error_text) }}