Files
eventspace/backend/app/models/activity_log.py
Felipe Cardoso c1caea44e8 ```
Rename metadata fields for clarity and fix imports.

Updated metadata-related field names across models to improve clarity and consistency (e.g., `metadata` to `media_metadata` and `notification_metadata`). Fixed an error in `guest_gifts` metadata reference and added a proper imports initialization in `__init__.py` for all models.
```
2025-02-28 08:34:49 +01:00

121 lines
3.8 KiB
Python

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"<ActivityLog {self.activity_type.value} event_id={self.event_id}>"
@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
)