Skip to content

Commit

Permalink
feat: Add functionality to send test emails from subscription model a…
Browse files Browse the repository at this point in the history
…nd Wagtail admin
  • Loading branch information
drikusroor committed Oct 8, 2024
1 parent c1e520e commit 9c24b13
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 8 deletions.
29 changes: 24 additions & 5 deletions src/blog/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# blog/models.py

from django.contrib.auth import get_user_model
from django.http import JsonResponse
from django.utils.html import format_html
from django import forms
from django.utils import timezone
from django.utils.dateparse import parse_date
Expand All @@ -10,7 +12,7 @@
from django.db.models.functions import Cast
from modelcluster.fields import ParentalKey
from django.db.models import DateField
# from django.core.management import call_command
from django.core.mail import send_mail

from wagtail.models import Page, Orderable
from wagtail.fields import RichTextField
Expand Down Expand Up @@ -346,10 +348,27 @@ class Subscription(models.Model):
class Meta:
unique_together = ("subscriber", "author")

def send_test_email(self):
# command is located in blog/management/commands/send_daily_digest.py
# call_command("senddailydigest")
return "Send test emailz"
def send_test_email_button(self):
obj = Subscription.objects.get(id=self.id)

return format_html(
'<button class="button button-small" onclick="sendTestEmail({})">Send Test Email</button>',
obj.id,
)

send_test_email_button.short_description = "Send Test Email"

def send_test_email(self, request, subscription_id):
subscription = Subscription.objects.get(id=subscription_id)

result = send_mail(
"Test email",
"This is a test email",
"noreply@tropischeverrassing.fun",
[subscription.subscriber.email],
)

return JsonResponse({"message": result})

def __str__(self):
return f"{self.subscriber.username} subscribed to {self.author.username}"
60 changes: 60 additions & 0 deletions src/blog/templates/wagtailadmin/base.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{% extends "wagtailadmin/admin_base.html" %}
{% load wagtailadmin_tags wagtailcore_tags i18n %}

{% block furniture %}
<template data-wagtail-sidebar-branding-logo>{% block branding_logo %}{% endblock %}</template>
{% sidebar_props %}
<aside id="wagtail-sidebar" class="sidebar-loading" data-wagtail-sidebar aria-label="{% trans 'Sidebar' %}"></aside>
{% keyboard_shortcuts_dialog %}
<main class="content-wrapper w-overflow-x-hidden" id="main">
<div class="content">
{# Always show messages div so it can be appended to by JS #}
<div class="messages" role="status" data-controller="w-messages" data-action="w-messages:add@document->w-messages#add" data-w-messages-added-class="new" data-w-messages-show-class="appear" data-w-messages-show-delay-value="100">
<ul data-w-messages-target="container">
{% if messages %}
{% for message in messages %}
{% message_level_tag message as level_tag %}
<li class="{% message_tags message %}">
{% if level_tag == "error" %}
{# There is no error icon, use warning icon instead #}
{% icon name="warning" classname="messages-icon" %}
{% elif message.extra_tags == "lock" %}
{% icon name="lock" classname="messages-icon" %}
{% elif message.extra_tags == "unlock" %}
{% icon name="lock-open" classname="messages-icon" %}
{% else %}
{% icon name=level_tag classname="messages-icon" %}
{% endif %}
{{ message|safe }}
</li>
{% endfor %}
{% endif %}
</ul>
<template data-w-messages-target="template" data-type="success">
<li class="success">{% icon name="success" classname="messages-icon" %}<span></span></li>
</template>
<template data-w-messages-target="template" data-type="error">
<li class="error">{% icon name="warning" classname="messages-icon" %}<span></span></li>
</template>
<template data-w-messages-target="template" data-type="warning">
<li class="warning">{% icon name="warning" classname="messages-icon" %}<span></span></li>
</template>
</div>

{% block content %}{% endblock %}
</div>
</main>
<script>
function sendTestEmail(subscriptionId) {
fetch(`/blog/api/send-test-email/${subscriptionId}/`)
.then(response => response.json())
.then(data => {
alert(data.message);
})
.catch((error) => {
console.error('Error:', error);
alert('An error occurred while sending the test email.');
});
}
</script>
{% endblock %}
6 changes: 6 additions & 0 deletions src/blog/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
CommentLikeViewSet,
posts_by_date,
toggle_subscription,
send_test_email,
)

router = DefaultRouter()
Expand All @@ -31,4 +32,9 @@
toggle_subscription,
name="toggle_subscription",
),
path(
"api/send-test-email/<int:subscription_id>/",
send_test_email,
name="send_test_email",
),
]
11 changes: 9 additions & 2 deletions src/blog/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from django.utils.dateparse import parse_date
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_POST
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import login_required, permission_required

from rest_framework import viewsets
from .models import Comment, BlogPage, Subscription, User
Expand All @@ -13,7 +13,7 @@
from rest_framework.authentication import SessionAuthentication
from rest_framework.exceptions import PermissionDenied
from rest_framework.decorators import permission_classes, action
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.permissions import AllowAny, IsAuthenticated, IsAdminUser
from rest_framework.response import Response

from notifications.models import Notification
Expand Down Expand Up @@ -186,3 +186,10 @@ def toggle_subscription(request, author_id):
subscribed = True

return JsonResponse({"subscribed": subscribed})


@permission_classes([IsAdminUser])
def send_test_email(request, subscription_id):
subscription = Subscription.objects.get(id=subscription_id)
result = subscription.send_test_email(request, subscription_id)
return JsonResponse({"message": result})
6 changes: 5 additions & 1 deletion src/blog/wagtail_hooks.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from django.utils.html import format_html
from django.urls import path
from django.http import JsonResponse
from wagtail import hooks
from wagtail.snippets.models import register_snippet
from wagtail.snippets.views.snippets import SnippetViewSet
Expand Down Expand Up @@ -38,7 +41,8 @@ def after_publish_page(request, page):
class SubscriptionViewSet(SnippetViewSet):
model = Subscription
icon = "user"
list_display = ["subscriber", "author", "created_at", "send_test_email"]
list_display = ["subscriber", "author", "created_at", "send_test_email_button"]
inline_actions = ["send_test_email"]

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Expand Down

0 comments on commit 9c24b13

Please sign in to comment.