Files
eventspace/backend/app/models/email_template.py
Felipe Cardoso 632330b4ac Refactor models to improve consistency and relationships
Updated `Base` import to use centralized `app.core.database.Base` for consistency. Enhanced `TimestampMixin` and `UUIDMixin` with docstrings for clarity. Fixed metadata reference in `guest_gifts` table and added relationships in `email_template`.
2025-02-28 09:21:02 +01:00

73 lines
2.6 KiB
Python

from enum import Enum
from sqlalchemy import Column, String, Boolean, Enum as SQLEnum, Text, UniqueConstraint, ForeignKey
from sqlalchemy.dialects.postgresql import UUID, JSONB
from sqlalchemy.orm import relationship
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