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. ```
121 lines
3.8 KiB
Python
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
|
|
)
|