Files
boc/landvex-admin/backend/app/models/audit.py
T

39 lines
1.4 KiB
Python
Raw Normal View History

"""Audit log model for compliance and security tracking."""
from datetime import datetime
from enum import Enum
from uuid import UUID, uuid4
from sqlalchemy import String, ForeignKey, JSON, INET, Text
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base
class AuditSeverity(str, Enum):
INFO = "info"
WARNING = "warning"
CRITICAL = "critical"
class AuditLog(Base):
__tablename__ = "audit_logs"
id: Mapped[UUID] = mapped_column(primary_key=True, default=uuid4)
tenant_id: Mapped[UUID | None] = mapped_column(ForeignKey("tenants.id"))
user_id: Mapped[UUID | None] = mapped_column(ForeignKey("users.id"))
action: Mapped[str] = mapped_column(String(50), nullable=False)
resource_type: Mapped[str] = mapped_column(String(50), nullable=False)
resource_id: Mapped[UUID | None]
details: Mapped[dict] = mapped_column(JSON, default=dict)
ip_address: Mapped[str | None] = mapped_column(INET)
user_agent: Mapped[str | None] = mapped_column(Text)
severity: Mapped[AuditSeverity] = mapped_column(default=AuditSeverity.INFO)
created_at: Mapped[datetime] = mapped_column(default=datetime.utcnow)
# Relationships
tenant: Mapped["Tenant | None"] = relationship(back_populates="audit_logs")
user: Mapped["User | None"] = relationship(back_populates="audit_logs")
def __repr__(self) -> str:
return f"<AuditLog {self.action} on {self.resource_type}>"