From f64049b4160c61bdf24240d9f5edeba42585eaf8 Mon Sep 17 00:00:00 2001 From: Alan Zhu <2025azhu@tjhsst.edu> Date: Sat, 5 Oct 2024 02:15:34 -0400 Subject: [PATCH] feat: send club announcements emails --- intranet/apps/announcements/forms.py | 6 +++++- intranet/apps/announcements/notifications.py | 14 +++++++++++--- intranet/apps/announcements/views.py | 3 ++- .../announcements/emails/announcement_posted.html | 2 +- .../announcements/emails/announcement_posted.txt | 2 +- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/intranet/apps/announcements/forms.py b/intranet/apps/announcements/forms.py index 48a222e4749..67460d82ecb 100644 --- a/intranet/apps/announcements/forms.py +++ b/intranet/apps/announcements/forms.py @@ -44,16 +44,20 @@ def __init__(self, user, *args, **kwargs): else: self.fields["activity"].queryset = [] self.fields["activity"].required = True + self.fields[ + "notify_post" + ].help_text = "If this box is checked, students who have subscribed to your club's announcements will receive an email." if "instance" in kwargs: # Don't allow changing the activity once the announcement has been created self.fields["activity"].widget.attrs["disabled"] = True self.fields["activity"].initial = kwargs["instance"].activity expiration_date = forms.DateTimeInput() + notify_post = forms.BooleanField(required=False, initial=True) class Meta: model = Announcement - fields = ["activity", "title", "content", "expiration_date"] + fields = ["activity", "title", "content", "expiration_date", "notify_post"] help_texts = { "expiration_date": "By default, announcements expire after two weeks. Choose the shortest time necessary.", } diff --git a/intranet/apps/announcements/notifications.py b/intranet/apps/announcements/notifications.py index 4b7c66cf4d8..05a8da436bf 100644 --- a/intranet/apps/announcements/notifications.py +++ b/intranet/apps/announcements/notifications.py @@ -122,8 +122,13 @@ def announcement_posted_email(request, obj, send_all=False): subject = f"Club Announcement for {obj.activity.name}: {obj.title}" users = ( get_user_model() - .objects.filter(user_type="student", graduation_year__gte=get_senior_graduation_year(), subscribed_to_set__contains=obj.activity) - .union(get_user_model().objects.filter(user_type__in=["teacher", "counselor"], subscribed_to_set__contains=obj.activity)) + .objects.filter( + user_type="student", + graduation_year__gte=get_senior_graduation_year(), + receive_news_emails=True, + subscribed_activity_set=obj.activity, + ) + .union(get_user_model().objects.filter(user_type__in=["teacher", "counselor"], subscribed_activity_set=obj.activity)) ) else: @@ -152,7 +157,10 @@ def announcement_posted_email(request, obj, send_all=False): email_send_task.delay( "announcements/emails/announcement_posted.txt", "announcements/emails/announcement_posted.html", data, subject, emails, bcc=True ) - messages.success(request, f"Sent email to {len(users_send)} users") + if request.user.is_announcements_admin: + messages.success(request, f"Sent email to {len(users_send)} users") + else: + messages.success(request, "Sent notification emails.") else: logger.info("Emailing announcements disabled") diff --git a/intranet/apps/announcements/views.py b/intranet/apps/announcements/views.py index a2754e27d17..4412ac0299b 100644 --- a/intranet/apps/announcements/views.py +++ b/intranet/apps/announcements/views.py @@ -157,9 +157,10 @@ def add_club_announcement_view(request): obj.user = request.user # SAFE HTML obj.content = safe_html(obj.content) - obj.save() + announcement_posted_hook(request, obj) + messages.success(request, "Successfully posted club announcement.") return redirect("club_announcements") else: diff --git a/intranet/templates/announcements/emails/announcement_posted.html b/intranet/templates/announcements/emails/announcement_posted.html index 2a78f79fd6e..f791864feef 100644 --- a/intranet/templates/announcements/emails/announcement_posted.html +++ b/intranet/templates/announcements/emails/announcement_posted.html @@ -6,7 +6,7 @@ {{ announcement.content }} {% endautoescape %} -

Posted by {{ announcement.get_author }} on {{ announcement.added|date:"l, F j, Y"}} at {{ announcement.added|date:"P"}} to {% if announcement.groups.count == 0 %}everyone{% else %}{{ announcement.groups.all|join:", " }}{% endif %} +

Posted by {{ announcement.get_author }} on {{ announcement.added|date:"l, F j, Y"}} at {{ announcement.added|date:"P"}} to {% if announcement.is_club_announcement %}{{ announcement.activity.name }}{% else %}{% if announcement.groups.count == 0 %}everyone{% else %}{{ announcement.groups.all|join:", " }}{% endif %}{% endif %}

View this announcement on Intranet

diff --git a/intranet/templates/announcements/emails/announcement_posted.txt b/intranet/templates/announcements/emails/announcement_posted.txt index 6591b80bf61..498e81ec965 100644 --- a/intranet/templates/announcements/emails/announcement_posted.txt +++ b/intranet/templates/announcements/emails/announcement_posted.txt @@ -2,7 +2,7 @@ {{ announcement.content }} {% endautoescape %} -Posted by {{ announcement.get_author }} on {{ announcement.added|date:"l, F j, Y"}} at {{ announcement.added|date:"P"}} to {% if announcement.groups.count == 0 %}everyone{% else %}{{ announcement.groups.all|join:", " }}{% endif %} +Posted by {{ announcement.get_author }} on {{ announcement.added|date:"l, F j, Y"}} at {{ announcement.added|date:"P"}} to {% if announcement.is_club_announcement %}{{ announcement.activity.name }}{% else %}{% if announcement.groups.count == 0 %}everyone{% else %}{{ announcement.groups.all|join:", " }}{% endif %}{% endif %} View this announcement on Intranet: {{ info_link }}