11import os
22
3- from data .users import getUserByAuthID , getUserByUserID
3+ from data .users import getUserByAuthID , getUserByUserID , getUserEmailsWithFilter
44from data .emailTemplates .applied import getAppliedEmail , getAppliedSubjectLine
55from data .emailTemplates .accepted import getAcceptedEmail , getAcceptedSubjectLine
66from data .emailTemplates .rejected import getRejectedEmail , getRejectedSubjectLine
7- from data .emailTemplates .confirmed import getConfirmedEmail , getConfirmedSubjectLine
7+ from data .emailTemplates .confirmed import getConfirmedEmail , getConfirmedSubjectLine , getRequestConfirmedEmail , \
8+ getRequestConfirmedSubjectLine
89import logging
910from sendgrid import SendGridAPIClient
10- from sendgrid .helpers .mail import Mail
11- from typing import Union , List
11+ from sendgrid .helpers .mail import Mail , Personalization , Bcc
12+ from typing import Union , List , Tuple
1213from utils .aws import getSendgridAPIKey
1314
1415logger = logging .getLogger ("email" )
1516WICHACKS_EMAIL = "organizers@wichacks.io"
1617
18+ ACCEPTED = "ACCEPTED"
19+ REJECTED = "REJECTED"
20+ CONFIRMED = "CONFIRMED"
21+
22+
23+ def sendPresetEmail (emailName ) -> Tuple [List [str ], bool ]:
24+ """
25+ Send preset email
26+ :param emailName:
27+ :return:
28+ """
29+ if emailName == "requestConfirmation" :
30+ return sendRequestConfirmedEmail ()
31+
32+ # default behavior mimic crash
33+ return None , False
34+
35+
1736def sendEmailByStatus (userID , status ) -> bool :
18- if status == " ACCEPTED" :
37+ if status == ACCEPTED :
1938 return sendAcceptedEmail (userID )
20- elif status == " REJECTED" :
39+ elif status == REJECTED :
2140 return sendRejectedEmail (userID )
22- elif status == " CONFIRMED" :
41+ elif status == CONFIRMED :
2342 return sendConfirmedEmail (userID )
2443 else :
2544 logger .error ("Application Status Change, Status not recognized: %s for user %s" , status , userID )
45+
46+
2647def sendAppliedEmail (auth0ID ) -> bool :
2748 """
2849 Wrapper of send email for applied email
@@ -39,7 +60,7 @@ def sendAppliedEmail(auth0ID) -> bool:
3960 return False
4061 messageContent = getAppliedEmail (firstName , lastName )
4162 subjectLine = getAppliedSubjectLine ()
42- return sendEmail ( emailAddresses = emailAddress , subject = subjectLine , content = messageContent )
63+ return sendEmailToSingleRecipient ( emailAddress = emailAddress , subject = subjectLine , content = messageContent )
4364
4465
4566def sendConfirmedEmail (userId ) -> bool :
@@ -53,9 +74,6 @@ def sendConfirmedEmail(userId) -> bool:
5374 :param auth0ID:
5475 :return: bool success
5576 """
56- logger .error ("Confirmation Email Not Enabled" )
57- return False # REMOVE BEFORE ENABLING
58-
5977 userData = getUserByUserID (userId )
6078 emailAddress = userData .get ("email" , None )
6179 firstName = userData .get ("first_name" , None )
@@ -66,7 +84,24 @@ def sendConfirmedEmail(userId) -> bool:
6684 return False
6785 messageContent = getConfirmedEmail (firstName , lastName )
6886 subjectLine = getConfirmedSubjectLine ()
69- return sendEmail (emailAddresses = emailAddress , subject = subjectLine , content = messageContent )
87+ return sendEmailToSingleRecipient (emailAddress = emailAddress , subject = subjectLine , content = messageContent )
88+
89+
90+ def sendRequestConfirmedEmail () -> Tuple [List [str ], bool ]:
91+ """
92+ Wrapper of send email for requesting confirmation email
93+ :param: applicationStatusFilterList list of application statuses that will receive the email, default is email goes to nobody
94+ :return: list of failed email addresses
95+ """
96+ """
97+ Wrapper of send email for applied email
98+ :return: bool success
99+ """
100+ userEmails = getUserEmailsWithFilter ([ACCEPTED ])
101+ messageContent = getRequestConfirmedEmail ()
102+ subjectLine = getRequestConfirmedSubjectLine ()
103+
104+ return sendGroupEmail (emailAddresses = userEmails , subject = subjectLine , content = messageContent )
70105
71106
72107def sendAcceptedEmail (userId ) -> bool :
@@ -85,7 +120,7 @@ def sendAcceptedEmail(userId) -> bool:
85120 return False
86121 messageContent = getAcceptedEmail (firstName , lastName )
87122 subjectLine = getAcceptedSubjectLine ()
88- return sendEmail ( emailAddresses = emailAddress , subject = subjectLine , content = messageContent )
123+ return sendEmailToSingleRecipient ( emailAddress = emailAddress , subject = subjectLine , content = messageContent )
89124
90125
91126def sendRejectedEmail (userId ) -> bool :
@@ -104,21 +139,21 @@ def sendRejectedEmail(userId) -> bool:
104139 return False
105140 messageContent = getRejectedEmail (firstName , lastName )
106141 subjectLine = getRejectedSubjectLine ()
107- return sendEmail ( emailAddresses = emailAddress , subject = subjectLine , content = messageContent )
142+ return sendEmailToSingleRecipient ( emailAddress = emailAddress , subject = subjectLine , content = messageContent )
108143
109144
110- def sendEmail ( emailAddresses : Union [ List [ str ], str ] , subject , content ) -> bool :
145+ def sendEmailToSingleRecipient ( emailAddress : str , subject , content ) -> bool :
111146 """
112- Send emailType to user based on id
147+ Send email with subject line and content to email address
113148 :param subject: subject line of the email
114- :param emailAddresses : single or list of string email addresses to send email to
149+ :param emailAddress : single email address to send email to
115150 :param content: HTML to send
116151 :return:
117152 """
118153
119154 message = Mail (
120155 from_email = WICHACKS_EMAIL ,
121- to_emails = emailAddresses ,
156+ to_emails = emailAddress ,
122157 subject = subject ,
123158 html_content = content
124159 )
@@ -132,6 +167,26 @@ def sendEmail(emailAddresses: Union[List[str], str], subject, content) -> bool:
132167 return True
133168
134169
170+ def sendGroupEmail (emailAddresses : List [str ], subject , content ) -> Tuple [List [str ], bool ]:
171+ """
172+ Send email to group of users
173+ :param subject: subject line of the email
174+ :param emailAddresses: single or list of string email addresses to send email to
175+ :param content: HTML to send
176+ :return: list of emails that the email failed to send to
177+ """
178+ failedEmailList = []
179+ for email in emailAddresses :
180+ emailSuccessfullySent = sendEmailToSingleRecipient (emailAddress = email , subject = subject , content = content )
181+ if not emailSuccessfullySent :
182+ failedEmailList .append (email )
183+ emailsSuccessful = True
184+ if len (failedEmailList ) > 0 :
185+ emailsSuccessful = False
186+ logger .error ("Sending Group Email Failed. Email errors for: %s" , failedEmailList )
187+ return failedEmailList , emailsSuccessful
188+
189+
135190def getSendGridClient ():
136191 """
137192 Return Send Grid Api Client
0 commit comments