diff --git a/Web/app.py b/Web/app.py index 9a021cb..db328c7 100755 --- a/Web/app.py +++ b/Web/app.py @@ -8114,35 +8114,33 @@ def register_csv(): mimetype='application/pdf' ) + @app.route('/user_del', methods=['GET']) def user_del(): """ User deletion interface. Displays a list of users that can be deleted by an administrator. Prevents self-deletion by hiding the current user from the list. - - Returns: - flask.Response: Rendered template with user list or redirect """ if 'username' not in session: - flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') + flash( + 'Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adresse zu nutzen. Bitte melden Sie sich an!', + 'error') return redirect(url_for('login')) - + + # Abruf aller User (falls get_all_users tenant_id unterstützt, kann diese hier übergeben werden) all_users = us.get_all_users() users_list = [] for user in all_users: - username = None - for field in ['Username']: - if field in user: - username = user[field] - break - - if username and username != session['username']: + username = user.get('Username') + + if username and username != session.get('username'): try: permissions_payload = us.get_effective_permissions(username) except Exception: permissions_payload = us.build_default_permission_payload('standard_user') + try: name = us.get_name(username) last_name = us.get_last_name(username) @@ -8154,12 +8152,13 @@ def user_del(): fullname = last_name else: fullname = None - except: + except Exception: name = "" last_name = "" fullname = None + users_list.append({ - 'username': decrypt_text(username), + 'username': username, # Username ist plain in DB, kein decrypt_text() notwendig 'admin': user.get('Admin', False), 'fullname': fullname, 'name': name, @@ -8168,7 +8167,7 @@ def user_del(): 'action_permissions': permissions_payload.get('actions', {}), 'page_permissions': permissions_payload.get('pages', {}), }) - + return render_template( 'user_del.html', users=users_list, @@ -8183,61 +8182,63 @@ def delete_user(): Process user deletion request. Deletes a specified user from the system. Includes safety checks to prevent self-deletion. - - Returns: - flask.Response: Redirect to the user deletion interface with status """ if 'username' not in session: - flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') + flash( + 'Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adresse zu nutzen. Bitte melden Sie sich an!', + 'error') return redirect(url_for('login')) - + username = request.form.get('username') if not username: flash('Kein Benutzer ausgewählt', 'error') return redirect(url_for('user_del')) - - # Prevent self-deletion - if username == session['username']: + + if username == session.get('username'): flash('Sie können Ihr eigenes Konto nicht löschen', 'error') return redirect(url_for('user_del')) - - # Reset this user's borrowings and free items before deleting the user + try: - client = MongoClient(MONGODB_HOST, MONGODB_PORT) - db = client[MONGODB_DB] + client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT) + tenant_id = session.get('tenant_id') + db = _get_tenant_db(client, tenant_id) + ausleihungen = db['ausleihungen'] items_col = db['items'] now = datetime.datetime.now() - # Complete all active borrowings of this user + # Aktive Ausleihen abschließen ausleihungen.update_many( {'User': username, 'Status': 'active'}, {'$set': {'Status': 'completed', 'End': now, 'LastUpdated': now}} ) - # Cancel all planned borrowings of this user + # Geplante Ausleihen stornieren ausleihungen.update_many( {'User': username, 'Status': 'planned'}, {'$set': {'Status': 'cancelled', 'LastUpdated': now}} ) - # Free all items currently associated with this user + # Inventar wieder verfügbar machen items_col.update_many( {'User': username}, {'$set': {'Verfuegbar': True, 'LastUpdated': now}, '$unset': {'User': ""}} ) - - client.close() except Exception as e: - app.logger.error(f"Error resetting borrowings for user {encrypt_text(username)}: {e}") - flash(f'Warnung: Ausleihungen/Reservierungen für {username} konnten nicht vollständig zurückgesetzt werden', 'warning') + app.logger.error(f"Error resetting borrowings for user {username}: {e}") + flash(f'Warnung: Ausleihungen/Reservierungen für {username} konnten nicht vollständig zurückgesetzt werden', + 'warning') + finally: + # Garantiert, dass die Datenbankverbindung geschlossen wird + if 'client' in locals(): + client.close() - # Delete the user try: + # us.delete_user muss ggf. noch angepasst werden, falls es auch den tenant_id verlangt us.delete_user(username) flash(f'Benutzer {username} erfolgreich gelöscht', 'success') except Exception as e: - app.logger.error(f"Error deleting user {encrypt_text(username)}: {e}") + app.logger.error(f"Error deleting user {username}: {e}") flash('Fehler beim Löschen des Benutzers', 'error') return redirect(url_for('user_del'))