From 93cfdc0f8dc00ffeb295463f610d17a9344cc57d Mon Sep 17 00:00:00 2001
From: Tore Brede <Tore.Brede@uib.no>
Date: Mon, 1 Nov 2021 16:04:57 +0100
Subject: [PATCH] GREG-94: Adding sending of e-mail for invitations

---
 gregui/api/views/invitation.py |  7 +++----
 gregui/mailutils.py            | 25 +++++++++++++++++++++++--
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/gregui/api/views/invitation.py b/gregui/api/views/invitation.py
index feed09dd..3bfbcc0c 100644
--- a/gregui/api/views/invitation.py
+++ b/gregui/api/views/invitation.py
@@ -23,6 +23,7 @@ from greg.models import Identity, InvitationLink, Person, Invitation
 from greg.permissions import IsSponsor
 from gregui.api.serializers.guest import GuestRegisterSerializer
 from gregui.api.serializers.invitation import InviteGuestSerializer
+from gregui.mailutils import send_invite_mail
 from gregui.models import GregUserProfile
 
 logger = logging.getLogger(__name__)
@@ -76,8 +77,7 @@ class InvitationView(CreateAPIView, DestroyAPIView):
             invitation__role__person_id=person.id,
             invitation__role__sponsor_id=sponsor_user.sponsor.id,
         )
-        # TODO: send email to invited guest
-        print(invitationlink)
+        send_invite_mail(invitationlink)
         return Response(status=status.HTTP_201_CREATED)
 
     def delete(self, request, *args, **kwargs) -> Response:
@@ -310,7 +310,6 @@ class ResendInvitationView(UpdateModelMixin, APIView):
             #     expire=timezone.now() + datetime.timedelta(days=30),
             # )
 
-            # TODO: send email to invited guest
-            print(link)
+            send_invite_mail(link)
 
         return Response(status=status.HTTP_200_OK)
diff --git a/gregui/mailutils.py b/gregui/mailutils.py
index 9ccbe5e3..c9bfd68f 100644
--- a/gregui/mailutils.py
+++ b/gregui/mailutils.py
@@ -1,13 +1,19 @@
+import logging
+
+from typing import Optional
 from typing import Union
 from django.conf import settings
 from django.template.context import Context
 from django_q.tasks import async_task
 
+from greg.models import InvitationLink
 from gregui.models import EmailTemplate
 
+logger = logging.getLogger(__name__)
+
 
 def prepare_arguments(
-    template: EmailTemplate, context: dict[str, str], mail_to: str
+        template: EmailTemplate, context: dict[str, str], mail_to: str
 ) -> dict[str, Union[str, list[str]]]:
     """Combine input to a dict ready for use as arguments ti django's send_mail"""
     return {
@@ -19,7 +25,7 @@ def prepare_arguments(
 
 
 def registration_template(
-    institution: str, sponsor: str, mail_to: str
+        institution: str, sponsor: str, mail_to: str
 ) -> dict[str, Union[str, list[str]]]:
     """
     Prepare email for registration
@@ -62,3 +68,18 @@ def send_registration_mail(mail_to: str, sponsor: str) -> str:
 def send_confirmation_mail(mail_to: str, guest: str) -> str:
     arguments = confirmation_template(guest, mail_to)
     return async_task("django.core.mail.send_mail", **arguments)
+
+
+def send_invite_mail(link: InvitationLink) -> Optional[str]:
+    email_address = link.invitation.role.person.private_email
+    sponsor = link.invitation.role.sponsor
+
+    if not email_address:
+        logger.warning(f"No e-mail address found for invitation link with ID: {link.id}")
+        return None
+
+    if not sponsor:
+        logger.warning("Unable to determine sponsor for invitation link with ID: {link.id}")
+        return None
+
+    return send_registration_mail(email_address.value, f"{sponsor.first_name} {sponsor.last_name}")
-- 
GitLab