diff --git a/web/core/views.py b/web/core/views.py index 888403b..6924a78 100644 --- a/web/core/views.py +++ b/web/core/views.py @@ -1000,3 +1000,21 @@ def dismiss_announcement(request, pk): ann = get_object_or_404(Announcement, pk=pk) AnnouncementDismissal.objects.get_or_create(user=request.user, announcement=ann) return JsonResponse({"ok": True}) + + +# ----- Login attempts (superuser only) ----- +from django.contrib.auth.decorators import user_passes_test, login_required +from django.utils import timezone +from datetime import timedelta +from .models_login import LoginAttempt + +is_superuser = user_passes_test(lambda u: u.is_superuser) + +@is_superuser +@login_required +def login_attempts(request): + """ + Show last 7 days of login attempts (success + failure) with username, IP, and timestamp. + """ + cutoff = timezone.now() - timedelta(days=7) + attempts = LoginAttempt.objects.filter(timestamp__gte=cutoff).order_by("-timestamp") + return render(request, "tools/login_attempts.html", {"attempts": attempts})