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 @@
+