from enum import Enum from sqlalchemy import Column, String, ForeignKey, Enum as SQLEnum, Text from sqlalchemy.dialects.postgresql import UUID, JSONB from sqlalchemy.orm import relationship from .base import Base, TimestampMixin, UUIDMixin class ActivityType(str, Enum): # Event Activities EVENT_CREATED = "event_created" EVENT_UPDATED = "event_updated" # Guest Activities GUEST_ADDED = "guest_added" GUEST_INVITED = "guest_invited" GUEST_RSVP = "guest_rsvp" # Gift Activities GIFT_ADDED = "gift_added" GIFT_UPDATED = "gift_updated" GIFT_RESERVED = "gift_reserved" GIFT_PURCHASED = "gift_purchased" # User Activities USER_LOGIN = "user_login" USER_LOGOUT = "user_logout" USER_CREATED = "user_created" # Manager Activities MANAGER_ADDED = "manager_added" MANAGER_REMOVED = "manager_removed" MANAGER_UPDATED = "manager_updated" # Media Activities MEDIA_UPLOADED = "media_uploaded" MEDIA_DELETED = "media_deleted" # Other ACCESS_DENIED = "access_denied" SYSTEM_ERROR = "system_error" class ActivityLog(Base, UUIDMixin, TimestampMixin): __tablename__ = 'activity_logs' # Activity Details activity_type = Column(SQLEnum(ActivityType), nullable=False) description = Column(Text) # Context event_id = Column(UUID(as_uuid=True), ForeignKey('events.id')) # Optional, for event-specific activities user_id = Column(UUID(as_uuid=True), ForeignKey('users.id')) # Optional, for user-initiated activities guest_id = Column(UUID(as_uuid=True), ForeignKey('guests.id')) # Optional, for guest activities # Additional Context target_id = Column(UUID(as_uuid=True)) # Generic ID of the target object (gift, media, etc.) target_type = Column(String) # Type of the target object ("gift", "media", etc.) # Request Information ip_address = Column(String) user_agent = Column(String) # Additional Data activity_data = Column(JSONB, default=dict) # Relationships event = relationship("Event") user = relationship("User", foreign_keys=[user_id]) guest = relationship("Guest") def __repr__(self): return f"" @classmethod def log_event_activity(cls, activity_type, event_id, user_id=None, description=None, ip_address=None, user_agent=None, **data): """ Helper method to create an event activity log entry """ return cls( activity_type=activity_type, event_id=event_id, user_id=user_id, description=description, ip_address=ip_address, user_agent=user_agent, activity_data=data ) @classmethod def log_user_activity(cls, activity_type, user_id, event_id=None, description=None, ip_address=None, user_agent=None, **data): """ Helper method to create a user activity log entry """ return cls( activity_type=activity_type, user_id=user_id, event_id=event_id, description=description, ip_address=ip_address, user_agent=user_agent, activity_data=data ) @classmethod def log_guest_activity(cls, activity_type, guest_id, event_id, description=None, ip_address=None, user_agent=None, **data): """ Helper method to create a guest activity log entry """ return cls( activity_type=activity_type, guest_id=guest_id, event_id=event_id, description=description, ip_address=ip_address, user_agent=user_agent, activity_data=data )