Add models for EmailTemplate, ActivityLog, and NotificationLog

Introduced new database models to handle email templates, activity logs, and notification logs, including relevant enums and utilities. Updated ER diagram to reflect new relationships and attributes, enhancing event tracking and notification management capabilities.
This commit is contained in:
2025-02-27 19:54:26 +01:00
parent 7247190f5f
commit 9d71fc7fcd
5 changed files with 342 additions and 4 deletions

View File

@@ -0,0 +1,120 @@
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
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,
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,
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,
data=data
)