Add a Settings > Email previews page showing every branded email with sample data
Renders the real templates every send function uses (claim approved, membership invoice, invoice reminder) against hand-built placeholder context -- no real Member/ClubMembership/DuesInvoice row needed, so nothing here can leak real data. Each card shows the subject line and toggles between the HTML render (in an iframe, so the email's own markup can't clash with the page's) and the plain-text body, using the same bg-steel pill-toggle pattern as the news preview's NL/EN switch (generalised to .view-toggle-btn, kept .news-lang-btn as an alias). Admin-only, alongside Club identity in Settings. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ECGMEwrc2k4D8VQuwjstj9
This commit is contained in:
@@ -52,6 +52,7 @@ from teams.models import Position, RefereeLevel, RefereeProfile, StaffAssignment
|
||||
from teams.services import eligible_roster_members
|
||||
|
||||
from .bulk_import import build_member_import_template, parse_member_import_rows, read_member_import_workbook
|
||||
from .email_previews import EMAIL_PREVIEWS, render_preview
|
||||
from .forms import (
|
||||
AddChildForm,
|
||||
AddParentForm,
|
||||
@@ -3320,6 +3321,21 @@ class ClubSettingsView(ClubAdminRequiredMixin, UpdateView):
|
||||
return super().get_context_data(**kwargs)
|
||||
|
||||
|
||||
class EmailPreviewListView(ClubAdminRequiredMixin, TemplateView):
|
||||
"""See email_previews.EMAIL_PREVIEWS's own docstring -- every branded email
|
||||
this app can send, rendered against sample data for this club so an admin
|
||||
can see exactly what a member/parent would receive without sending
|
||||
anything. Same access level as Club identity: this is a branding/comms
|
||||
concern, not day-to-day people/roster work."""
|
||||
|
||||
template_name = "management/email_previews.html"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
club = self.request.club
|
||||
previews = [{"key": preview.key, "label": preview.label, "description": preview.description, **render_preview(preview, club=club, request=self.request)} for preview in EMAIL_PREVIEWS]
|
||||
return super().get_context_data(previews=previews, **kwargs)
|
||||
|
||||
|
||||
class OnboardingRequirementListView(MemberAdminRequiredMixin, ListView):
|
||||
"""What a club requires from every member after they sign up or renew (a
|
||||
photo, a medical certificate, ...) -- see club/models.py's OnboardingRequirement
|
||||
|
||||
Reference in New Issue
Block a user