48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
from flask import request
|
|
|
|
from app import db
|
|
from app.models import AuditLog
|
|
|
|
|
|
def log_action(action, target_type=None, target_id=None, details=None):
|
|
"""Записывает действие пользователя в аудит-лог.
|
|
|
|
Аргументы:
|
|
action: короткий код действия, например "guest_create", "event_delete".
|
|
target_type: тип объекта (event, guest, user, ...).
|
|
target_id: идентификатор объекта (может быть строкой).
|
|
details: произвольное текстовое описание или причина.
|
|
"""
|
|
try:
|
|
from app.routes import current_user
|
|
|
|
user = current_user()
|
|
user_id = user.id if user else None
|
|
username = user.username if user else None
|
|
except Exception:
|
|
user_id = None
|
|
username = None
|
|
|
|
ip_address = None
|
|
try:
|
|
if request:
|
|
# Учитываем прокси
|
|
ip_address = request.headers.get("X-Forwarded-For", request.remote_addr)
|
|
if ip_address:
|
|
ip_address = ip_address.split(",")[0].strip()
|
|
except Exception:
|
|
pass
|
|
|
|
record = AuditLog(
|
|
user_id=user_id,
|
|
username=username,
|
|
action=action,
|
|
target_type=target_type,
|
|
target_id=str(target_id) if target_id is not None else None,
|
|
details=details,
|
|
ip_address=ip_address,
|
|
)
|
|
db.session.add(record)
|
|
# Не делаем commit здесь, чтобы не ломать транзакции вызывающего кода.
|
|
# Вызывающий код сам делает db.session.commit() после основных изменений.
|