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,70 @@
from enum import Enum
from sqlalchemy import Column, String, Boolean, Enum as SQLEnum, Text, UniqueConstraint
from sqlalchemy.dialects.postgresql import UUID, JSONB
from .base import Base, TimestampMixin, UUIDMixin
class TemplateType(str, Enum):
INVITATION = "invitation"
REMINDER = "reminder"
CONFIRMATION = "confirmation"
UPDATE = "update"
THANK_YOU = "thank_you"
CUSTOM = "custom"
class EmailTemplate(Base, UUIDMixin, TimestampMixin):
__tablename__ = 'email_templates'
# Template Identification
name = Column(String, nullable=False)
description = Column(String)
template_type = Column(SQLEnum(TemplateType), nullable=False)
# Template Content
subject = Column(String, nullable=False)
html_content = Column(Text, nullable=False)
text_content = Column(Text, nullable=False)
# Template Variables
variables = Column(JSONB, default=dict)
# Organization
event_id = Column(UUID(as_uuid=True), ForeignKey('events.id')) # Optional, for event-specific templates
created_by = Column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=False)
# Status
is_active = Column(Boolean, default=True, nullable=False)
is_system = Column(Boolean, default=False, nullable=False) # For system-provided templates
# Relationships
event = relationship("Event", back_populates="email_templates", foreign_keys=[event_id])
creator = relationship("User", foreign_keys=[created_by])
# Ensure unique template names within an event or globally for system templates
__table_args__ = (
UniqueConstraint('event_id', 'name', name='uq_event_template_name'),
)
def __repr__(self):
return f"<EmailTemplate {self.name} ({self.template_type.value})>"
def render(self, context: dict) -> tuple[str, str, str]:
"""
Render the template with given context
Returns tuple of (subject, html_content, text_content)
"""
# This would normally use a template engine like Jinja2
# For now, we'll use a simple placeholder implementation
subject = self.subject
html = self.html_content
text = self.text_content
# Replace placeholders in the form {{variable}}
for key, value in context.items():
placeholder = f"{{{{{key}}}}}"
subject = subject.replace(placeholder, str(value))
html = html.replace(placeholder, str(value))
text = text.replace(placeholder, str(value))
return subject, html, text