from apps.audit.models import AuditEvent def record(actor, action, object_type, object_id="", before=None, after=None, metadata=None, request=None): """Write an immutable audit event. Never raises to avoid breaking business flows.""" ip = None if request is not None: xff = request.META.get("HTTP_X_FORWARDED_FOR") ip = (xff.split(",")[0].strip() if xff else request.META.get("REMOTE_ADDR")) try: AuditEvent.objects.create( actor=actor if actor and actor.is_authenticated else None, action=action, object_type=object_type, object_id=str(object_id), ip=ip, before=before or {}, after=after or {}, metadata=metadata or {}, ) except Exception: pass