55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from django.contrib.auth import get_user_model
|
|
from django.contrib.auth.signals import user_logged_in, user_logged_out
|
|
from django.dispatch import receiver
|
|
from django.utils import timezone
|
|
|
|
from .models import AuditEventType, AuditLog
|
|
from .utils import get_client_ip
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
def _get_event(key: str) -> AuditEventType | None:
|
|
try:
|
|
return AuditEventType.objects.get(key=key)
|
|
except AuditEventType.DoesNotExist:
|
|
return None
|
|
|
|
|
|
@receiver(user_logged_in)
|
|
def on_user_logged_in(sender, request, user: User, **kwargs):
|
|
event = _get_event("user_login")
|
|
if event is None:
|
|
return
|
|
AuditLog.objects.create(
|
|
created_at=timezone.now(),
|
|
actor=user,
|
|
event_type=event,
|
|
message=f"User {user} logged in",
|
|
severity=event.default_severity,
|
|
source=AuditLog.Source.UI,
|
|
ip_address=get_client_ip(request),
|
|
user_agent=(request.META.get("HTTP_USER_AGENT") if request else ""),
|
|
metadata={"path": request.path} if request else {},
|
|
)
|
|
|
|
|
|
@receiver(user_logged_out)
|
|
def on_user_logged_out(sender, request, user: User, **kwargs):
|
|
event = _get_event("user_logout")
|
|
if event is None:
|
|
return
|
|
AuditLog.objects.create(
|
|
created_at=timezone.now(),
|
|
actor=user,
|
|
event_type=event,
|
|
message=f"User {user} logged out",
|
|
severity=event.default_severity,
|
|
source=AuditLog.Source.UI,
|
|
ip_address=get_client_ip(request),
|
|
user_agent=(request.META.get("HTTP_USER_AGENT") if request else ""),
|
|
metadata={"path": request.path} if request else {},
|
|
)
|