diff --git a/backend/app/routes/intake.py b/backend/app/routes/intake.py index 0f1513e5..795ccfa5 100644 --- a/backend/app/routes/intake.py +++ b/backend/app/routes/intake.py @@ -13,6 +13,7 @@ from app.schemas.user import UserRole from app.services.implementations.form_processor import FormProcessor from app.utilities.db_utils import get_db +from app.utilities.ses_email_service import SESEmailService # ===== Schemas ===== @@ -269,6 +270,21 @@ async def create_form_submission( db.commit() db.refresh(db_submission) + # Send intake form confirmation email for intake forms + if form and form.type == "intake": + try: + ses_service = SESEmailService() + # Get language (enum values are already "en" or "fr") + language = target_user.language.value if target_user.language else "en" + + first_name = target_user.first_name if target_user.first_name else None + ses_service.send_intake_form_confirmation_email( + to_email=target_user.email, first_name=first_name, language=language + ) + except Exception as e: + # Log error but don't fail the request + print(f"Failed to send intake form confirmation email: {str(e)}") + # Build response dict response_dict = { "id": db_submission.id, diff --git a/backend/app/services/implementations/auth_service.py b/backend/app/services/implementations/auth_service.py index 785ebddf..809483a8 100644 --- a/backend/app/services/implementations/auth_service.py +++ b/backend/app/services/implementations/auth_service.py @@ -49,6 +49,34 @@ def renew_token(self, refresh_token: str) -> Token: def reset_password(self, email: str) -> None: try: + # Get user's first name and language if available + first_name = None + language = "en" # Default to English + try: + # Try database first, then fall back to Firebase + try: + user = self.user_service.get_user_by_email(email) + if user: + if user.first_name and user.first_name.strip(): + first_name = user.first_name.strip() + # Get language from user (enum values are already "en" or "fr") + if user.language: + language = user.language.value + except Exception: + pass + + # Fall back to Firebase if database didn't have first_name + if not first_name: + try: + firebase_user = firebase_admin.auth.get_user_by_email(email) + if firebase_user and firebase_user.display_name: + display_name = firebase_user.display_name.strip() + first_name = display_name.split()[0] if display_name else None + except Exception: + pass + except Exception: + pass + # Use Firebase Admin SDK to generate password reset link action_code_settings = firebase_admin.auth.ActionCodeSettings( url="http://localhost:3000/set-new-password", @@ -57,8 +85,8 @@ def reset_password(self, email: str) -> None: reset_link = firebase_admin.auth.generate_password_reset_link(email, action_code_settings) - # Send via SES - email_sent = self.ses_email_service.send_password_reset_email(email, reset_link) + # Send via SES with language + email_sent = self.ses_email_service.send_password_reset_email(email, reset_link, first_name, language) if email_sent: self.logger.info(f"Password reset email sent successfully to {email}") diff --git a/backend/app/services/implementations/match_service.py b/backend/app/services/implementations/match_service.py index 20814385..1cad936b 100644 --- a/backend/app/services/implementations/match_service.py +++ b/backend/app/services/implementations/match_service.py @@ -24,6 +24,7 @@ ) from app.schemas.time_block import TimeBlockEntity, TimeRange from app.schemas.user import UserRole +from app.utilities.ses_email_service import SESEmailService from app.utilities.timezone_utils import get_timezone_from_abbreviation SCHEDULE_CLEANUP_STATUSES = { @@ -95,6 +96,28 @@ async def create_matches(self, req: MatchCreateRequest) -> MatchCreateResponse: for match in created_matches: self.db.refresh(match) + # Send "matches available" email to each volunteer + ses_service = SESEmailService() + for match in created_matches: + try: + volunteer = self.db.get(User, match.volunteer_id) + if volunteer and volunteer.email: + # Get volunteer's language (enum values are already "en" or "fr") + language = volunteer.language.value if volunteer.language else "en" + + first_name = volunteer.first_name if volunteer.first_name else None + matches_url = "http://localhost:3000/volunteer/dashboard" + + ses_service.send_matches_available_email( + to_email=volunteer.email, + first_name=first_name, + matches_url=matches_url, + language=language, + ) + except Exception as e: + # Log error but don't fail the match creation + self.logger.error(f"Failed to send matches available email to volunteer {match.volunteer_id}: {e}") + responses = [self._build_match_response(match) for match in created_matches] return MatchCreateResponse(matches=responses) @@ -258,6 +281,90 @@ async def schedule_match( self.db.commit() self.db.refresh(match) + # Send "call scheduled" email to both participant and volunteer + try: + # Load participant and volunteer with their data + participant = ( + self.db.query(User) + .options(joinedload(User.user_data)) + .filter(User.id == match.participant_id) + .first() + ) + volunteer = ( + self.db.query(User) + .options(joinedload(User.user_data)) + .filter(User.id == match.volunteer_id) + .first() + ) + + if participant and volunteer and match.confirmed_time: + ses_service = SESEmailService() + confirmed_time_utc = match.confirmed_time.start_time + + # Get participant's timezone and language + participant_tz = ZoneInfo("America/Toronto") # Default to EST + if participant.user_data and participant.user_data.timezone: + tz_result = get_timezone_from_abbreviation(participant.user_data.timezone) + if tz_result: + participant_tz = tz_result + + participant_language = participant.language.value if participant.language else "en" + + # Get volunteer's timezone and language + volunteer_tz = ZoneInfo("America/Toronto") # Default to EST + if volunteer.user_data and volunteer.user_data.timezone: + tz_result = get_timezone_from_abbreviation(volunteer.user_data.timezone) + if tz_result: + volunteer_tz = tz_result + + volunteer_language = volunteer.language.value if volunteer.language else "en" + + # Convert time to participant's timezone + participant_time = confirmed_time_utc.astimezone(participant_tz) + participant_date = participant_time.strftime("%B %d, %Y") + participant_time_str = participant_time.strftime("%I:%M %p") + participant_tz_abbr = participant_time.strftime("%Z") + + # Convert time to volunteer's timezone + volunteer_time = confirmed_time_utc.astimezone(volunteer_tz) + volunteer_date = volunteer_time.strftime("%B %d, %Y") + volunteer_time_str = volunteer_time.strftime("%I:%M %p") + volunteer_tz_abbr = volunteer_time.strftime("%Z") + + # Send to participant + if participant.email: + ses_service.send_call_scheduled_email( + to_email=participant.email, + match_name=f"{volunteer.first_name} {volunteer.last_name}" + if volunteer.first_name and volunteer.last_name + else "Your volunteer", + date=participant_date, + time=participant_time_str, + timezone=participant_tz_abbr, + first_name=participant.first_name, + scheduled_calls_url="http://localhost:3000/participant/dashboard", + language=participant_language, + ) + + # Send to volunteer + if volunteer.email: + ses_service.send_call_scheduled_email( + to_email=volunteer.email, + match_name=f"{participant.first_name} {participant.last_name}" + if participant.first_name and participant.last_name + else "Your participant", + date=volunteer_date, + time=volunteer_time_str, + timezone=volunteer_tz_abbr, + first_name=volunteer.first_name, + scheduled_calls_url="http://localhost:3000/volunteer/dashboard", + language=volunteer_language, + ) + + except Exception as e: + # Log error but don't fail the scheduling + self.logger.error(f"Failed to send call scheduled emails for match {match_id}: {e}") + return self._build_match_detail(match) except HTTPException: @@ -317,6 +424,35 @@ async def request_new_times( self.db.commit() self.db.refresh(match) + # Send "participant requested new times" email to volunteer + try: + # Load participant and volunteer + participant = self.db.get(User, match.participant_id) + volunteer = self.db.get(User, match.volunteer_id) + + if participant and volunteer and volunteer.email: + # Get volunteer's language + volunteer_language = volunteer.language.value if volunteer.language else "en" + + # Get participant's name for email + participant_name = ( + f"{participant.first_name} {participant.last_name}" + if participant.first_name and participant.last_name + else "A participant" + ) + + ses_service = SESEmailService() + ses_service.send_participant_requested_new_times_email( + to_email=volunteer.email, + participant_name=participant_name, + first_name=volunteer.first_name, + matches_url="http://localhost:3000/volunteer/dashboard", + language=volunteer_language, + ) + except Exception as e: + # Log error but don't fail the request + self.logger.error(f"Failed to send participant requested new times email for match {match_id}: {e}") + return self._build_match_detail(match) except HTTPException: @@ -530,6 +666,27 @@ async def volunteer_accept_match( self.db.commit() self.db.refresh(match) + # Send "matches available" email to participant + try: + participant = match.participant + if participant and participant.email: + # Get participant's language (enum values are already "en" or "fr") + language = participant.language.value if participant.language else "en" + + first_name = participant.first_name if participant.first_name else None + matches_url = "http://localhost:3000/participant/dashboard" + + ses_service = SESEmailService() + ses_service.send_matches_available_email( + to_email=participant.email, + first_name=first_name, + matches_url=matches_url, + language=language, + ) + except Exception as e: + # Log error but don't fail the match acceptance + self.logger.error(f"Failed to send matches available email to participant {match.participant_id}: {e}") + # Return match detail for participant view (includes suggested times) return self._build_match_detail(match) except HTTPException: diff --git a/backend/app/utilities/__init__.py b/backend/app/utilities/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/utilities/ses/__init__.py b/backend/app/utilities/ses/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/app/utilities/ses/ses_templates.json b/backend/app/utilities/ses/ses_templates.json index ccbe85e5..cb2d2b66 100644 --- a/backend/app/utilities/ses/ses_templates.json +++ b/backend/app/utilities/ses/ses_templates.json @@ -1,26 +1,92 @@ [ { - "HtmlPart": "app/utilities/ses/template_files/test.html", + "HtmlPart": "app/utilities/ses/template_files/compiled/test.html", "SubjectPart": "Testing Email SES Template", "TemplateName": "Test", - "TextPart": "app/utilities/ses/template_files/test.txt" + "TextPart": "app/utilities/ses/template_files/text/test.txt" }, { - "HtmlPart": "app/utilities/ses/template_files/email_verification_en.html", - "SubjectPart": "Verify Your Email Address", + "HtmlPart": "app/utilities/ses/template_files/compiled/email_verification_en.html", + "SubjectPart": "{{first_name}}, confirm your email - First Connection Peer Support Program", "TemplateName": "EmailVerificationEn", - "TextPart": "app/utilities/ses/template_files/email_verification_en.txt" + "TextPart": "app/utilities/ses/template_files/text/email_verification_en.txt" }, { - "HtmlPart": "app/utilities/ses/template_files/email_verification_fr.html", - "SubjectPart": "Vérifiez votre adresse courriel", + "HtmlPart": "app/utilities/ses/template_files/compiled/email_verification_fr.html", + "SubjectPart": "{{first_name}}, confirmation de l'adresse courriel – Programme de soutien par les pairs Premier contact", "TemplateName": "EmailVerificationFr", - "TextPart": "app/utilities/ses/template_files/email_verification_fr.txt" + "TextPart": "app/utilities/ses/template_files/text/email_verification_fr.txt" }, { - "HtmlPart": "app/utilities/ses/template_files/password_reset.html", - "SubjectPart": "Reset Your Password", - "TemplateName": "PasswordReset", - "TextPart": "app/utilities/ses/template_files/password_reset.txt" + "HtmlPart": "app/utilities/ses/template_files/compiled/password_reset_en.html", + "SubjectPart": "Reset Your Password - First Connection Peer Support Program", + "TemplateName": "PasswordResetEn", + "TextPart": "app/utilities/ses/template_files/text/password_reset_en.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/password_reset_fr.html", + "SubjectPart": "Réinitialisation du mot de passe – Programme de soutien par les pairs Premier contact", + "TemplateName": "PasswordResetFr", + "TextPart": "app/utilities/ses/template_files/text/password_reset_fr.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/intake_form_confirmation_en.html", + "SubjectPart": "We received your intake form - First Connection Peer Support Program", + "TemplateName": "IntakeFormConfirmationEn", + "TextPart": "app/utilities/ses/template_files/text/intake_form_confirmation_en.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/intake_form_confirmation_fr.html", + "SubjectPart": "Réception de votre formulaire de demande – Programme de soutien par les pairs Premier contact", + "TemplateName": "IntakeFormConfirmationFr", + "TextPart": "app/utilities/ses/template_files/text/intake_form_confirmation_fr.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/matches_available_en.html", + "SubjectPart": "{{first_name}}, you have new matches - First Connection Peer Support Program", + "TemplateName": "MatchesAvailableEn", + "TextPart": "app/utilities/ses/template_files/text/matches_available_en.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/matches_available_fr.html", + "SubjectPart": "{{first_name}}, nouveaux jumelages – Programme de soutien par les pairs Premier contact", + "TemplateName": "MatchesAvailableFr", + "TextPart": "app/utilities/ses/template_files/text/matches_available_fr.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/call_scheduled_en.html", + "SubjectPart": "Call confirmed with {{match_name}} @ {{date}} {{time}} {{timezone}} - First Connection Peer Support Program", + "TemplateName": "CallScheduledEn", + "TextPart": "app/utilities/ses/template_files/text/call_scheduled_en.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/call_scheduled_fr.html", + "SubjectPart": "Confirmation de l'appel avec {{match_name}} le {{date}} à {{time}} {{timezone}} – Programme de soutien par les pairs Premier contact", + "TemplateName": "CallScheduledFr", + "TextPart": "app/utilities/ses/template_files/text/call_scheduled_fr.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/participant_requested_new_times_en.html", + "SubjectPart": "{{participant_name}} requested new times - First Connection Peer Support Program", + "TemplateName": "ParticipantRequestedNewTimesEn", + "TextPart": "app/utilities/ses/template_files/text/participant_requested_new_times_en.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/participant_requested_new_times_fr.html", + "SubjectPart": "Demande d'une autre plage horaire par {{participant_name}} – Programme de soutien par les pairs Premier contact", + "TemplateName": "ParticipantRequestedNewTimesFr", + "TextPart": "app/utilities/ses/template_files/text/participant_requested_new_times_fr.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/volunteer_accepted_new_times_en.html", + "SubjectPart": "{{volunteer_name}} confirmed your new time @ {{date}} {{time}} {{timezone}} - First Connection Peer Support Program", + "TemplateName": "VolunteerAcceptedNewTimesEn", + "TextPart": "app/utilities/ses/template_files/text/volunteer_accepted_new_times_en.txt" + }, + { + "HtmlPart": "app/utilities/ses/template_files/compiled/volunteer_accepted_new_times_fr.html", + "SubjectPart": "Confirmation de la nouvelle plage horaire, le {{date}} à {{time}} {{timezone}}, par {{volunteer_name}} – Programme de soutien par les pairs Premier contact", + "TemplateName": "VolunteerAcceptedNewTimesFr", + "TextPart": "app/utilities/ses/template_files/text/volunteer_accepted_new_times_fr.txt" } ] diff --git a/backend/app/utilities/ses/template_files/email_verification.html b/backend/app/utilities/ses/template_files/base/base_email_en.html similarity index 78% rename from backend/app/utilities/ses/template_files/email_verification.html rename to backend/app/utilities/ses/template_files/base/base_email_en.html index 4ebbd8ec..1983df03 100644 --- a/backend/app/utilities/ses/template_files/email_verification.html +++ b/backend/app/utilities/ses/template_files/base/base_email_en.html @@ -10,7 +10,7 @@
@@ -23,27 +23,31 @@ diff --git a/backend/app/utilities/ses/template_files/base/base_email_fr.html b/backend/app/utilities/ses/template_files/base/base_email_fr.html new file mode 100644 index 00000000..5980144c --- /dev/null +++ b/backend/app/utilities/ses/template_files/base/base_email_fr.html @@ -0,0 +1,216 @@ + + + +
+
+
+
-
- llsc_en_small.png
-
+ + + + +
+ LLSC Logo +
-

Hi {{first_name}},

-

Click the link below to verify your email address: {{verification_link}}

-

If the link doesn't work, copy and paste it into your browser.

-

This link will expire in 24 hours. If you didn't request this verification, please ignore this email.

+ {% block content %} + + {% endblock %}

@@ -73,10 +77,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1044" src="http://secure.llscanada.org/images/content/pagebuilder/instagram-logo.png" alt="Instagram" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -92,10 +94,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1043" src="http://secure.llscanada.org/images/content/pagebuilder/facebook-logo.png" alt="Facebook" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -111,10 +111,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1042" src="http://secure.llscanada.org/images/content/pagebuilder/linkedin-logo.png" alt="LinkedIn" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -130,10 +128,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1041" src="http://secure.llscanada.org/images/content/pagebuilder/YouTube_logo.png" alt="YouTube" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -149,10 +145,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1040" src="http://secure.llscanada.org/images/content/pagebuilder/twitter-x.jpg" alt="X" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -168,10 +162,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1039" src="http://secure.llscanada.org/images/content/pagebuilder/spotify-logo.png" alt="Spotify" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -211,7 +203,7 @@
NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact - megan.norrish@lls.org for any questions or concerns related to the First Connection Peer Support Program. + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program.
+ + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + {% block content %} + + {% endblock %} + +
+
+
+ +

+ + + Restez à jour : suivez-nous dès aujourd'hui! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ © Société de leucémie et lymphome du Canada
+ Tous droits réservés.
+ No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 +

+ +
+
+
+
+ + REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à + FirstConnection@bloodcancers.ca. + +
+
+ + + + diff --git a/backend/app/utilities/ses/template_files/compiled/call_scheduled_en.html b/backend/app/utilities/ses/template_files/compiled/call_scheduled_en.html new file mode 100644 index 00000000..e8ab3065 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/call_scheduled_en.html @@ -0,0 +1,222 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Hi {{first_name}},

+

You're meeting with {{match_name}} on {{date}} @ {{time}} {{timezone}}. Please login to view their contact information.

+

+ + View scheduled calls + +

+ + +
+
+
+ +

+ + + Stay informed. Connect with us today! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ Copyright © The Leukemia & Lymphoma Society of Canada.
+ All rights reserved.
+ Charitable registration: #10762 3654 RR0001 +

+ +
+
+
+
+ + NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/call_scheduled_fr.html b/backend/app/utilities/ses/template_files/compiled/call_scheduled_fr.html new file mode 100644 index 00000000..009865d8 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/call_scheduled_fr.html @@ -0,0 +1,222 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Bonjour {{first_name}},

+

Vous avez rendez-vous avec {{match_name}} le {{date}} à {{time}} {{timezone}}. Veuillez vous connecter à votre compte pour voir ses coordonnées.

+

+ + Voir les appels planifiés + +

+ + +
+
+
+ +

+ + + Restez à jour : suivez-nous dès aujourd'hui! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ © Société de leucémie et lymphome du Canada
+ Tous droits réservés.
+ No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 +

+ +
+
+
+
+ + REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à + FirstConnection@bloodcancers.ca. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/email_verification_en.html b/backend/app/utilities/ses/template_files/compiled/email_verification_en.html similarity index 82% rename from backend/app/utilities/ses/template_files/email_verification_en.html rename to backend/app/utilities/ses/template_files/compiled/email_verification_en.html index 1ffee402..cf225172 100644 --- a/backend/app/utilities/ses/template_files/email_verification_en.html +++ b/backend/app/utilities/ses/template_files/compiled/email_verification_en.html @@ -10,7 +10,7 @@
@@ -23,7 +23,7 @@ @@ -45,10 +45,12 @@
-

Hi {{first_name}},

-

Click the link below to verify your email address: {{verification_link}}

-

If the link doesn't work, copy and paste it into your browser.

-

This link will expire in 24 hours. If you didn't request this verification, please ignore this email.

+ +

Hi {{first_name}},

+

Click the link to verify your email: {{verification_link}}

+

If the link doesn't work, copy and paste it into your browser.

+

This link will expire in 24 hours. If you didn't create an account, please ignore this email.

+

@@ -78,10 +80,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1044" src="http://secure.llscanada.org/images/content/pagebuilder/instagram-logo.png" alt="Instagram" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -97,10 +97,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1043" src="http://secure.llscanada.org/images/content/pagebuilder/facebook-logo.png" alt="Facebook" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -116,10 +114,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1042" src="http://secure.llscanada.org/images/content/pagebuilder/linkedin-logo.png" alt="LinkedIn" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -135,10 +131,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1041" src="http://secure.llscanada.org/images/content/pagebuilder/YouTube_logo.png" alt="YouTube" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -154,10 +148,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1040" src="http://secure.llscanada.org/images/content/pagebuilder/twitter-x.jpg" alt="X" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -173,10 +165,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1039" src="http://secure.llscanada.org/images/content/pagebuilder/spotify-logo.png" alt="Spotify" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -216,7 +206,7 @@
NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact - megan.norrish@lls.org for any questions or concerns related to the First Connection Peer Support Program. + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. @@ -226,4 +216,4 @@
- + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/email_verification_fr.html b/backend/app/utilities/ses/template_files/compiled/email_verification_fr.html similarity index 78% rename from backend/app/utilities/ses/template_files/email_verification_fr.html rename to backend/app/utilities/ses/template_files/compiled/email_verification_fr.html index 25e7ca2b..6a3c8fbf 100644 --- a/backend/app/utilities/ses/template_files/email_verification_fr.html +++ b/backend/app/utilities/ses/template_files/compiled/email_verification_fr.html @@ -10,7 +10,7 @@
@@ -23,7 +23,7 @@ @@ -34,7 +34,7 @@
LLSC Logo
-

Hi {{first_name}},

-

Click the link below to verify your email address: {{verification_link}}

-

If the link doesn't work, copy and paste it into your browser.

-

This link will expire in 24 hours. If you didn't request this verification, please ignore this email.

+ +

Bonjour {{first_name}},

+

Pour confirmer votre adresse courriel, cliquez sur le lien suivant : {{verification_link}}.

+

Si le lien ne fonctionne pas, vous pouvez le copier et le coller dans la barre d'adresse de votre navigateur.

+

Le lien expirera dans 24 heures. Si vous n'avez pas demandé à créer de compte, veuillez ignorer ce message.

+

@@ -57,7 +59,7 @@

- Stay informed. Connect with us today we are extra french! + Restez à jour : suivez-nous dès aujourd'hui! @@ -78,10 +80,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1044" src="http://secure.llscanada.org/images/content/pagebuilder/instagram-logo.png" alt="Instagram" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -97,10 +97,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1043" src="http://secure.llscanada.org/images/content/pagebuilder/facebook-logo.png" alt="Facebook" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -116,10 +114,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1042" src="http://secure.llscanada.org/images/content/pagebuilder/linkedin-logo.png" alt="LinkedIn" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -135,10 +131,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1041" src="http://secure.llscanada.org/images/content/pagebuilder/YouTube_logo.png" alt="YouTube" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -154,10 +148,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1040" src="http://secure.llscanada.org/images/content/pagebuilder/twitter-x.jpg" alt="X" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -173,10 +165,8 @@ border="0" width="25" height="25" - id="m_4346998286330489325m_-277460127918842692m_5180834574350019448m_-2438363903363548788m_-1430917162020640728m_-2619392195472490027m_2564292851399425314m_817068749652786359_x0000_i1039" src="http://secure.llscanada.org/images/content/pagebuilder/spotify-logo.png" alt="Spotify" - class="gmail-CToWUd" style="width: 0.2604in; height: 0.2604in;" > @@ -196,9 +186,9 @@

- Copyright © The Leukemia & Lymphoma Society of Canada.
- All rights reserved.
- Charitable registration: #10762 3654 RR0001 + © Société de leucémie et lymphome du Canada
+ Tous droits réservés.
+ No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001

@@ -215,8 +205,8 @@
- NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact - megan.norrish@lls.org for any questions or concerns related to the First Connection Peer Support Program. + REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à + FirstConnection@bloodcancers.ca. @@ -226,4 +216,4 @@ - + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/intake_form_confirmation_en.html b/backend/app/utilities/ses/template_files/compiled/intake_form_confirmation_en.html new file mode 100644 index 00000000..488d78ff --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/intake_form_confirmation_en.html @@ -0,0 +1,217 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Hi {{first_name}},

+

Your request to join the First Connection Peer Support Program has been received. A staff member will call you within 1-2 business days to better understand your match preferences. For any inquiries, please reach us at FirstConnections@bloodcancers.ca. Please note LLSC's working days are Monday to Thursday.

+ + +
+
+
+ +

+ + + Stay informed. Connect with us today! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ Copyright © The Leukemia & Lymphoma Society of Canada.
+ All rights reserved.
+ Charitable registration: #10762 3654 RR0001 +

+ +
+
+
+
+ + NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/intake_form_confirmation_fr.html b/backend/app/utilities/ses/template_files/compiled/intake_form_confirmation_fr.html new file mode 100644 index 00000000..206bac82 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/intake_form_confirmation_fr.html @@ -0,0 +1,217 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Bonjour {{first_name}},

+

Nous avons bien reçu votre demande d'inscription au programme de soutien par les pairs Premier contact. Un membre de notre personnel communiquera avec vous d'ici deux jours ouvrables en vue d'établir vos préférences en matière de jumelage. Pour toute demande, écrivez à FirstConnections@bloodcancers.ca. Veuillez noter que la semaine de travail de la SLLC est du lundi au jeudi.

+ + +
+
+
+ +

+ + + Restez à jour : suivez-nous dès aujourd'hui! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ © Société de leucémie et lymphome du Canada
+ Tous droits réservés.
+ No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 +

+ +
+
+
+
+ + REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à + FirstConnection@bloodcancers.ca. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/matches_available_en.html b/backend/app/utilities/ses/template_files/compiled/matches_available_en.html new file mode 100644 index 00000000..af2d7b47 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/matches_available_en.html @@ -0,0 +1,222 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Hi {{first_name}},

+

Good news - new matches are ready for you. Please login to schedule a call / send your availability.

+

+ + View matches + +

+ + +
+
+
+ +

+ + + Stay informed. Connect with us today! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ Copyright © The Leukemia & Lymphoma Society of Canada.
+ All rights reserved.
+ Charitable registration: #10762 3654 RR0001 +

+ +
+
+
+
+ + NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/matches_available_fr.html b/backend/app/utilities/ses/template_files/compiled/matches_available_fr.html new file mode 100644 index 00000000..903481ec --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/matches_available_fr.html @@ -0,0 +1,222 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Bonjour {{first_name}},

+

Bonne nouvelle : nous avons de nouveaux jumelages pour vous. Veuillez vous connecter à votre compte pour planifier un appel ou indiquer vos disponibilités.

+

+ + Voir les jumelages + +

+ + +
+
+
+ +

+ + + Restez à jour : suivez-nous dès aujourd'hui! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ © Société de leucémie et lymphome du Canada
+ Tous droits réservés.
+ No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 +

+ +
+
+
+
+ + REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à + FirstConnection@bloodcancers.ca. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/participant_requested_new_times_en.html b/backend/app/utilities/ses/template_files/compiled/participant_requested_new_times_en.html new file mode 100644 index 00000000..a8d9df80 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/participant_requested_new_times_en.html @@ -0,0 +1,222 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Hi {{first_name}},

+

{{participant_name}} has reviewed your available times and has requested new times to meet. Please login to choose a new slot.

+

+ + View matches + +

+ + +
+
+
+ +

+ + + Stay informed. Connect with us today! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ Copyright © The Leukemia & Lymphoma Society of Canada.
+ All rights reserved.
+ Charitable registration: #10762 3654 RR0001 +

+ +
+
+
+
+ + NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/participant_requested_new_times_fr.html b/backend/app/utilities/ses/template_files/compiled/participant_requested_new_times_fr.html new file mode 100644 index 00000000..950a3cf6 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/participant_requested_new_times_fr.html @@ -0,0 +1,222 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Bonjour {{first_name}},

+

{{participant_name}} a consulté vos disponibilités et a demandé une autre plage horaire pour votre rencontre. Veuillez vous connecter à votre compte pour sélectionner une nouvelle plage horaire.

+

+ + Voir les jumelages + +

+ + +
+
+
+ +

+ + + Restez à jour : suivez-nous dès aujourd'hui! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ © Société de leucémie et lymphome du Canada
+ Tous droits réservés.
+ No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 +

+ +
+
+
+
+ + REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à + FirstConnection@bloodcancers.ca. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/password_reset.html b/backend/app/utilities/ses/template_files/compiled/password_reset.html new file mode 100644 index 00000000..60c9b10c --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/password_reset.html @@ -0,0 +1,219 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Hi ,

+

Click the link to reset your password:

+

If the link doesn't work, copy and paste it into your browser.

+

This link will expire in 24 hours. If you didn't request a password reset, please ignore this email.

+ + +
+
+
+ +

+ + + Stay informed. Connect with us today! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ Copyright © The Leukemia & Lymphoma Society of Canada.
+ All rights reserved.
+ Charitable registration: #10762 3654 RR0001 +

+ +
+
+
+
+ + NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/password_reset_en.html b/backend/app/utilities/ses/template_files/compiled/password_reset_en.html new file mode 100644 index 00000000..b25ebdd5 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/password_reset_en.html @@ -0,0 +1,219 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Hi {{first_name}},

+

Click the link to reset your password: {{reset_link}}

+

If the link doesn't work, copy and paste it into your browser.

+

This link will expire in 24 hours. If you didn't request a password reset, please ignore this email.

+ + +
+
+
+ +

+ + + Stay informed. Connect with us today! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ Copyright © The Leukemia & Lymphoma Society of Canada.
+ All rights reserved.
+ Charitable registration: #10762 3654 RR0001 +

+ +
+
+
+
+ + NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/password_reset_fr.html b/backend/app/utilities/ses/template_files/compiled/password_reset_fr.html new file mode 100644 index 00000000..e04beb17 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/password_reset_fr.html @@ -0,0 +1,219 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Bonjour {{first_name}},

+

Pour réinitialiser votre mot de passe, cliquez sur le lien suivant : {{reset_link}}.

+

Si le lien ne fonctionne pas, vous pouvez le copier et le coller dans la barre d'adresse de votre navigateur.

+

Le lien expirera dans 24 heures. Si vous n'avez pas demandé à réinitialiser votre mot de passe, veuillez ignorer ce message.

+ + +
+
+
+ +

+ + + Restez à jour : suivez-nous dès aujourd'hui! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ © Société de leucémie et lymphome du Canada
+ Tous droits réservés.
+ No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 +

+ +
+
+
+
+ + REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à + FirstConnection@bloodcancers.ca. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/test.html b/backend/app/utilities/ses/template_files/compiled/test.html new file mode 100644 index 00000000..d4db8ae2 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/test.html @@ -0,0 +1,217 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Welcome, {{name}}!

+

We are glad to have you with us. Thank you for joining us on {{date}}.

+ + +
+
+
+ +

+ + + Stay informed. Connect with us today! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ Copyright © The Leukemia & Lymphoma Society of Canada.
+ All rights reserved.
+ Charitable registration: #10762 3654 RR0001 +

+ +
+
+
+
+ + NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/volunteer_accepted_new_times_en.html b/backend/app/utilities/ses/template_files/compiled/volunteer_accepted_new_times_en.html new file mode 100644 index 00000000..0fa820c0 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/volunteer_accepted_new_times_en.html @@ -0,0 +1,222 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Hi {{first_name}},

+

You're meeting with {{volunteer_name}} on {{date}} @ {{time}} {{timezone}}. Please login to view their contact information.

+

+ + View scheduled calls + +

+ + +
+
+
+ +

+ + + Stay informed. Connect with us today! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ Copyright © The Leukemia & Lymphoma Society of Canada.
+ All rights reserved.
+ Charitable registration: #10762 3654 RR0001 +

+ +
+
+
+
+ + NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact + FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/compiled/volunteer_accepted_new_times_fr.html b/backend/app/utilities/ses/template_files/compiled/volunteer_accepted_new_times_fr.html new file mode 100644 index 00000000..6d585640 --- /dev/null +++ b/backend/app/utilities/ses/template_files/compiled/volunteer_accepted_new_times_fr.html @@ -0,0 +1,222 @@ + + + +
+
+
+ + + + + + +
+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + +
+ LLSC Logo +
+ + +

Bonjour {{first_name}},

+

Vous avez rendez-vous avec {{volunteer_name}} le {{date}} à {{time}} {{timezone}}. Veuillez vous connecter à votre compte pour voir ses coordonnées.

+

+ + Voir les appels planifiés + +

+ + +
+
+
+ +

+ + + Restez à jour : suivez-nous dès aujourd'hui! + + + +

+ + + + + + + + + + + + + + + + + + + + + +
+

 

+
+

+ + + Instagram + + +

+
+

+ + + Facebook + + +

+
+

+ + + LinkedIn + + +

+
+

+ + + YouTube + + +

+
+

+ + + X + + +

+
+

+ + + Spotify + + +

+
+

 

+
+ +
+
+
+ +

+ © Société de leucémie et lymphome du Canada
+ Tous droits réservés.
+ No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 +

+ +
+
+
+
+ + REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à + FirstConnection@bloodcancers.ca. + +
+
+
+
+ + \ No newline at end of file diff --git a/backend/app/utilities/ses/template_files/email_verification.txt b/backend/app/utilities/ses/template_files/email_verification.txt deleted file mode 100644 index 07e49f90..00000000 --- a/backend/app/utilities/ses/template_files/email_verification.txt +++ /dev/null @@ -1,10 +0,0 @@ -Email Verification - -Thank you for registering! Please verify your email address by clicking the link below: - -{{verification_link}} - -If the link doesn't work, you can copy and paste it into your browser. - -This link will expire in 24 hours. If you didn't request this verification, please ignore this email. - diff --git a/backend/app/utilities/ses/template_files/email_verification_en.txt b/backend/app/utilities/ses/template_files/email_verification_en.txt deleted file mode 100644 index 07e49f90..00000000 --- a/backend/app/utilities/ses/template_files/email_verification_en.txt +++ /dev/null @@ -1,10 +0,0 @@ -Email Verification - -Thank you for registering! Please verify your email address by clicking the link below: - -{{verification_link}} - -If the link doesn't work, you can copy and paste it into your browser. - -This link will expire in 24 hours. If you didn't request this verification, please ignore this email. - diff --git a/backend/app/utilities/ses/template_files/email_verification_fr.txt b/backend/app/utilities/ses/template_files/email_verification_fr.txt deleted file mode 100644 index 07e49f90..00000000 --- a/backend/app/utilities/ses/template_files/email_verification_fr.txt +++ /dev/null @@ -1,10 +0,0 @@ -Email Verification - -Thank you for registering! Please verify your email address by clicking the link below: - -{{verification_link}} - -If the link doesn't work, you can copy and paste it into your browser. - -This link will expire in 24 hours. If you didn't request this verification, please ignore this email. - diff --git a/backend/app/utilities/ses/template_files/password_reset.html b/backend/app/utilities/ses/template_files/password_reset.html deleted file mode 100644 index 2f5487c4..00000000 --- a/backend/app/utilities/ses/template_files/password_reset.html +++ /dev/null @@ -1,24 +0,0 @@ - - -
-

Reset Your Password

-

- Click the button below to reset your password. -

-
- - Reset Password - -
-

- If the button doesn't work, copy and paste this link into your browser:
- {{reset_link}} -

-

- This link will expire in 24 hours. If you didn't request a password reset, please ignore this email. -

-
- - - diff --git a/backend/app/utilities/ses/template_files/password_reset.txt b/backend/app/utilities/ses/template_files/password_reset.txt deleted file mode 100644 index 50f67d36..00000000 --- a/backend/app/utilities/ses/template_files/password_reset.txt +++ /dev/null @@ -1,10 +0,0 @@ -Password Reset - -Click the link below to reset your password: - -{{reset_link}} - -If the link doesn't work, copy and paste it into your browser. - -This link will expire in 24 hours. If you didn't request a password reset, please ignore this email. - diff --git a/backend/app/utilities/ses/template_files/source/call_scheduled_en.j2 b/backend/app/utilities/ses/template_files/source/call_scheduled_en.j2 new file mode 100644 index 00000000..e27a14e6 --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/call_scheduled_en.j2 @@ -0,0 +1,11 @@ +{% extends "base_email_en.html" %} + +{% block content %} +

Hi {{first_name}},

+

You're meeting with {{match_name}} on {{date}} @ {{time}} {{timezone}}. Please login to view their contact information.

+

+ + View scheduled calls + +

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/call_scheduled_fr.j2 b/backend/app/utilities/ses/template_files/source/call_scheduled_fr.j2 new file mode 100644 index 00000000..f35355da --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/call_scheduled_fr.j2 @@ -0,0 +1,11 @@ +{% extends "base_email_fr.html" %} + +{% block content %} +

Bonjour {{first_name}},

+

Vous avez rendez-vous avec {{match_name}} le {{date}} à {{time}} {{timezone}}. Veuillez vous connecter à votre compte pour voir ses coordonnées.

+

+ + Voir les appels planifiés + +

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/email_verification_en.j2 b/backend/app/utilities/ses/template_files/source/email_verification_en.j2 new file mode 100644 index 00000000..f586b863 --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/email_verification_en.j2 @@ -0,0 +1,8 @@ +{% extends "base_email_en.html" %} + +{% block content %} +

Hi {{first_name}},

+

Click the link to verify your email: {{verification_link}}

+

If the link doesn't work, copy and paste it into your browser.

+

This link will expire in 24 hours. If you didn't create an account, please ignore this email.

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/email_verification_fr.j2 b/backend/app/utilities/ses/template_files/source/email_verification_fr.j2 new file mode 100644 index 00000000..28410dd8 --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/email_verification_fr.j2 @@ -0,0 +1,8 @@ +{% extends "base_email_fr.html" %} + +{% block content %} +

Bonjour {{first_name}},

+

Pour confirmer votre adresse courriel, cliquez sur le lien suivant : {{verification_link}}.

+

Si le lien ne fonctionne pas, vous pouvez le copier et le coller dans la barre d'adresse de votre navigateur.

+

Le lien expirera dans 24 heures. Si vous n'avez pas demandé à créer de compte, veuillez ignorer ce message.

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/intake_form_confirmation_en.j2 b/backend/app/utilities/ses/template_files/source/intake_form_confirmation_en.j2 new file mode 100644 index 00000000..da8f18bc --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/intake_form_confirmation_en.j2 @@ -0,0 +1,6 @@ +{% extends "base_email_en.html" %} + +{% block content %} +

Hi {{first_name}},

+

Your request to join the First Connection Peer Support Program has been received. A staff member will call you within 1-2 business days to better understand your match preferences. For any inquiries, please reach us at FirstConnections@bloodcancers.ca. Please note LLSC's working days are Monday to Thursday.

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/intake_form_confirmation_fr.j2 b/backend/app/utilities/ses/template_files/source/intake_form_confirmation_fr.j2 new file mode 100644 index 00000000..96ff7b2e --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/intake_form_confirmation_fr.j2 @@ -0,0 +1,6 @@ +{% extends "base_email_fr.html" %} + +{% block content %} +

Bonjour {{first_name}},

+

Nous avons bien reçu votre demande d'inscription au programme de soutien par les pairs Premier contact. Un membre de notre personnel communiquera avec vous d'ici deux jours ouvrables en vue d'établir vos préférences en matière de jumelage. Pour toute demande, écrivez à FirstConnections@bloodcancers.ca. Veuillez noter que la semaine de travail de la SLLC est du lundi au jeudi.

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/matches_available_en.j2 b/backend/app/utilities/ses/template_files/source/matches_available_en.j2 new file mode 100644 index 00000000..b7072e0a --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/matches_available_en.j2 @@ -0,0 +1,11 @@ +{% extends "base_email_en.html" %} + +{% block content %} +

Hi {{first_name}},

+

Good news - new matches are ready for you. Please login to schedule a call / send your availability.

+

+ + View matches + +

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/matches_available_fr.j2 b/backend/app/utilities/ses/template_files/source/matches_available_fr.j2 new file mode 100644 index 00000000..48d9f3d4 --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/matches_available_fr.j2 @@ -0,0 +1,11 @@ +{% extends "base_email_fr.html" %} + +{% block content %} +

Bonjour {{first_name}},

+

Bonne nouvelle : nous avons de nouveaux jumelages pour vous. Veuillez vous connecter à votre compte pour planifier un appel ou indiquer vos disponibilités.

+

+ + Voir les jumelages + +

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/participant_requested_new_times_en.j2 b/backend/app/utilities/ses/template_files/source/participant_requested_new_times_en.j2 new file mode 100644 index 00000000..49f0138b --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/participant_requested_new_times_en.j2 @@ -0,0 +1,11 @@ +{% extends "base_email_en.html" %} + +{% block content %} +

Hi {{first_name}},

+

{{participant_name}} has reviewed your available times and has requested new times to meet. Please login to choose a new slot.

+

+ + View matches + +

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/participant_requested_new_times_fr.j2 b/backend/app/utilities/ses/template_files/source/participant_requested_new_times_fr.j2 new file mode 100644 index 00000000..398c5ac7 --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/participant_requested_new_times_fr.j2 @@ -0,0 +1,11 @@ +{% extends "base_email_fr.html" %} + +{% block content %} +

Bonjour {{first_name}},

+

{{participant_name}} a consulté vos disponibilités et a demandé une autre plage horaire pour votre rencontre. Veuillez vous connecter à votre compte pour sélectionner une nouvelle plage horaire.

+

+ + Voir les jumelages + +

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/password_reset_en.j2 b/backend/app/utilities/ses/template_files/source/password_reset_en.j2 new file mode 100644 index 00000000..634df164 --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/password_reset_en.j2 @@ -0,0 +1,8 @@ +{% extends "base_email_en.html" %} + +{% block content %} +

Hi {{first_name}},

+

Click the link to reset your password: {{reset_link}}

+

If the link doesn't work, copy and paste it into your browser.

+

This link will expire in 24 hours. If you didn't request a password reset, please ignore this email.

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/password_reset_fr.j2 b/backend/app/utilities/ses/template_files/source/password_reset_fr.j2 new file mode 100644 index 00000000..2efa0df3 --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/password_reset_fr.j2 @@ -0,0 +1,8 @@ +{% extends "base_email_fr.html" %} + +{% block content %} +

Bonjour {{first_name}},

+

Pour réinitialiser votre mot de passe, cliquez sur le lien suivant : {{reset_link}}.

+

Si le lien ne fonctionne pas, vous pouvez le copier et le coller dans la barre d'adresse de votre navigateur.

+

Le lien expirera dans 24 heures. Si vous n'avez pas demandé à réinitialiser votre mot de passe, veuillez ignorer ce message.

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/test.j2 b/backend/app/utilities/ses/template_files/source/test.j2 new file mode 100644 index 00000000..b8356365 --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/test.j2 @@ -0,0 +1,6 @@ +{% extends "base_email_en.html" %} + +{% block content %} +

Welcome, {{name}}!

+

We are glad to have you with us. Thank you for joining us on {{date}}.

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/volunteer_accepted_new_times_en.j2 b/backend/app/utilities/ses/template_files/source/volunteer_accepted_new_times_en.j2 new file mode 100644 index 00000000..78e033b0 --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/volunteer_accepted_new_times_en.j2 @@ -0,0 +1,11 @@ +{% extends "base_email_en.html" %} + +{% block content %} +

Hi {{first_name}},

+

You're meeting with {{volunteer_name}} on {{date}} @ {{time}} {{timezone}}. Please login to view their contact information.

+

+ + View scheduled calls + +

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/source/volunteer_accepted_new_times_fr.j2 b/backend/app/utilities/ses/template_files/source/volunteer_accepted_new_times_fr.j2 new file mode 100644 index 00000000..781ba7fc --- /dev/null +++ b/backend/app/utilities/ses/template_files/source/volunteer_accepted_new_times_fr.j2 @@ -0,0 +1,11 @@ +{% extends "base_email_fr.html" %} + +{% block content %} +

Bonjour {{first_name}},

+

Vous avez rendez-vous avec {{volunteer_name}} le {{date}} à {{time}} {{timezone}}. Veuillez vous connecter à votre compte pour voir ses coordonnées.

+

+ + Voir les appels planifiés + +

+{% endblock %} diff --git a/backend/app/utilities/ses/template_files/test.html b/backend/app/utilities/ses/template_files/test.html deleted file mode 100644 index 3ad7bf1d..00000000 --- a/backend/app/utilities/ses/template_files/test.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

Welcome, {{name}}!

-

We are glad to have you with us. Thank you for joining us on {{date}}.

- - diff --git a/backend/app/utilities/ses/template_files/text/call_scheduled_en.txt b/backend/app/utilities/ses/template_files/text/call_scheduled_en.txt new file mode 100644 index 00000000..2945c00b --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/call_scheduled_en.txt @@ -0,0 +1,15 @@ +Hi {{first_name}}, + +You're meeting with {{match_name}} on {{date}} @ {{time}} {{timezone}}. Please login to view their contact information. + +View scheduled calls: {{scheduled_calls_url}} + +--- + +Stay informed. Connect with us today! + +Copyright © The Leukemia & Lymphoma Society of Canada. +All rights reserved. +Charitable registration: #10762 3654 RR0001 + +NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. diff --git a/backend/app/utilities/ses/template_files/text/call_scheduled_fr.txt b/backend/app/utilities/ses/template_files/text/call_scheduled_fr.txt new file mode 100644 index 00000000..e1b29b1f --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/call_scheduled_fr.txt @@ -0,0 +1,15 @@ +Bonjour {{first_name}}, + +Vous avez rendez-vous avec {{match_name}} le {{date}} à {{time}} {{timezone}}. Veuillez vous connecter à votre compte pour voir ses coordonnées. + +Voir les appels planifiés : {{scheduled_calls_url}} + +--- + +Restez à jour : suivez-nous dès aujourd'hui! + +© Société de leucémie et lymphome du Canada +Tous droits réservés. +No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 + +REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à FirstConnection@bloodcancers.ca. diff --git a/backend/app/utilities/ses/template_files/text/email_verification_en.txt b/backend/app/utilities/ses/template_files/text/email_verification_en.txt new file mode 100644 index 00000000..9f7728f9 --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/email_verification_en.txt @@ -0,0 +1,20 @@ +Hi {{first_name}}, + +Click the link to verify your email: + +{{verification_link}} + +If the link doesn't work, copy and paste it into your browser. + +This link will expire in 24 hours. If you didn't create an account, please ignore this email. + +--- + +Stay informed. Connect with us today! + +Copyright © The Leukemia & Lymphoma Society of Canada. +All rights reserved. +Charitable registration: #10762 3654 RR0001 + +NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + diff --git a/backend/app/utilities/ses/template_files/text/email_verification_fr.txt b/backend/app/utilities/ses/template_files/text/email_verification_fr.txt new file mode 100644 index 00000000..6b8b25bc --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/email_verification_fr.txt @@ -0,0 +1,18 @@ +Bonjour {{first_name}}, + +Pour confirmer votre adresse courriel, cliquez sur le lien suivant : {{verification_link}} + +Si le lien ne fonctionne pas, vous pouvez le copier et le coller dans la barre d'adresse de votre navigateur. + +Le lien expirera dans 24 heures. Si vous n'avez pas demandé à créer de compte, veuillez ignorer ce message. + +--- + +Restez à jour : suivez-nous dès aujourd'hui! + +© Société de leucémie et lymphome du Canada +Tous droits réservés. +No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 + +REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à FirstConnection@bloodcancers.ca. + diff --git a/backend/app/utilities/ses/template_files/text/intake_form_confirmation_en.txt b/backend/app/utilities/ses/template_files/text/intake_form_confirmation_en.txt new file mode 100644 index 00000000..eb0f91f8 --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/intake_form_confirmation_en.txt @@ -0,0 +1,13 @@ +Hi {{first_name}}, + +Your request to join the First Connection Peer Support Program has been received. A staff member will call you within 1-2 business days to better understand your match preferences. For any inquiries, please reach us at FirstConnections@bloodcancers.ca. Please note LLSC's working days are Monday to Thursday. + +--- + +Stay informed. Connect with us today! + +Copyright © The Leukemia & Lymphoma Society of Canada. +All rights reserved. +Charitable registration: #10762 3654 RR0001 + +NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. diff --git a/backend/app/utilities/ses/template_files/text/intake_form_confirmation_fr.txt b/backend/app/utilities/ses/template_files/text/intake_form_confirmation_fr.txt new file mode 100644 index 00000000..06ab1360 --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/intake_form_confirmation_fr.txt @@ -0,0 +1,13 @@ +Bonjour {{first_name}}, + +Nous avons bien reçu votre demande d'inscription au programme de soutien par les pairs Premier contact. Un membre de notre personnel communiquera avec vous d'ici deux jours ouvrables en vue d'établir vos préférences en matière de jumelage. Pour toute demande, écrivez à FirstConnections@bloodcancers.ca. Veuillez noter que la semaine de travail de la SLLC est du lundi au jeudi. + +--- + +Restez à jour : suivez-nous dès aujourd'hui! + +© Société de leucémie et lymphome du Canada +Tous droits réservés. +No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 + +REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à FirstConnection@bloodcancers.ca. diff --git a/backend/app/utilities/ses/template_files/text/matches_available_en.txt b/backend/app/utilities/ses/template_files/text/matches_available_en.txt new file mode 100644 index 00000000..e4a76825 --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/matches_available_en.txt @@ -0,0 +1,15 @@ +Hi {{first_name}}, + +Good news - new matches are ready for you. Please login to schedule a call / send your availability. + +View matches: {{matches_url}} + +--- + +Stay informed. Connect with us today! + +Copyright © The Leukemia & Lymphoma Society of Canada. +All rights reserved. +Charitable registration: #10762 3654 RR0001 + +NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. diff --git a/backend/app/utilities/ses/template_files/text/matches_available_fr.txt b/backend/app/utilities/ses/template_files/text/matches_available_fr.txt new file mode 100644 index 00000000..46793da7 --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/matches_available_fr.txt @@ -0,0 +1,15 @@ +Bonjour {{first_name}}, + +Bonne nouvelle : nous avons de nouveaux jumelages pour vous. Veuillez vous connecter à votre compte pour planifier un appel ou indiquer vos disponibilités. + +Voir les jumelages : {{matches_url}} + +--- + +Restez à jour : suivez-nous dès aujourd'hui! + +© Société de leucémie et lymphome du Canada +Tous droits réservés. +No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 + +REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à FirstConnection@bloodcancers.ca. diff --git a/backend/app/utilities/ses/template_files/text/participant_requested_new_times_en.txt b/backend/app/utilities/ses/template_files/text/participant_requested_new_times_en.txt new file mode 100644 index 00000000..3a8a320e --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/participant_requested_new_times_en.txt @@ -0,0 +1,15 @@ +Hi {{first_name}}, + +{{participant_name}} has reviewed your available times and has requested new times to meet. Please login to choose a new slot. + +View matches: {{matches_url}} + +--- + +Stay informed. Connect with us today! + +Copyright © The Leukemia & Lymphoma Society of Canada. +All rights reserved. +Charitable registration: #10762 3654 RR0001 + +NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. diff --git a/backend/app/utilities/ses/template_files/text/participant_requested_new_times_fr.txt b/backend/app/utilities/ses/template_files/text/participant_requested_new_times_fr.txt new file mode 100644 index 00000000..3fef32cd --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/participant_requested_new_times_fr.txt @@ -0,0 +1,15 @@ +Bonjour {{first_name}}, + +{{participant_name}} a consulté vos disponibilités et a demandé une autre plage horaire pour votre rencontre. Veuillez vous connecter à votre compte pour sélectionner une nouvelle plage horaire. + +Voir les jumelages : {{matches_url}} + +--- + +Restez à jour : suivez-nous dès aujourd'hui! + +© Société de leucémie et lymphome du Canada +Tous droits réservés. +No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 + +REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à FirstConnection@bloodcancers.ca. diff --git a/backend/app/utilities/ses/template_files/text/password_reset_en.txt b/backend/app/utilities/ses/template_files/text/password_reset_en.txt new file mode 100644 index 00000000..895acd21 --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/password_reset_en.txt @@ -0,0 +1,20 @@ +Hi {{first_name}}, + +Click the link to reset your password: + +{{reset_link}} + +If the link doesn't work, copy and paste it into your browser. + +This link will expire in 24 hours. If you didn't request a password reset, please ignore this email. + +--- + +Stay informed. Connect with us today! + +Copyright © The Leukemia & Lymphoma Society of Canada. +All rights reserved. +Charitable registration: #10762 3654 RR0001 + +NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. + diff --git a/backend/app/utilities/ses/template_files/text/password_reset_fr.txt b/backend/app/utilities/ses/template_files/text/password_reset_fr.txt new file mode 100644 index 00000000..c61c18ef --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/password_reset_fr.txt @@ -0,0 +1,19 @@ +Bonjour {{first_name}}, + +Pour réinitialiser votre mot de passe, cliquez sur le lien suivant : + +{{reset_link}} + +Si le lien ne fonctionne pas, vous pouvez le copier et le coller dans la barre d'adresse de votre navigateur. + +Le lien expirera dans 24 heures. Si vous n'avez pas demandé à réinitialiser votre mot de passe, veuillez ignorer ce message. + +--- + +Restez à jour : suivez-nous dès aujourd'hui! + +© Société de leucémie et lymphome du Canada +Tous droits réservés. +No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 + +REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à FirstConnection@bloodcancers.ca. diff --git a/backend/app/utilities/ses/template_files/test.txt b/backend/app/utilities/ses/template_files/text/test.txt similarity index 100% rename from backend/app/utilities/ses/template_files/test.txt rename to backend/app/utilities/ses/template_files/text/test.txt diff --git a/backend/app/utilities/ses/template_files/text/volunteer_accepted_new_times_en.txt b/backend/app/utilities/ses/template_files/text/volunteer_accepted_new_times_en.txt new file mode 100644 index 00000000..b9ab9b32 --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/volunteer_accepted_new_times_en.txt @@ -0,0 +1,15 @@ +Hi {{first_name}}, + +You're meeting with {{volunteer_name}} on {{date}} @ {{time}} {{timezone}}. Please login to view their contact information. + +View scheduled calls: {{scheduled_calls_url}} + +--- + +Stay informed. Connect with us today! + +Copyright © The Leukemia & Lymphoma Society of Canada. +All rights reserved. +Charitable registration: #10762 3654 RR0001 + +NOTICE: Please do not reply to this email. It is automated from an unmonitored email address and will not be received or responded to. Please contact FirstConnection@bloodcancers.ca for any questions or concerns related to the First Connection Peer Support Program. diff --git a/backend/app/utilities/ses/template_files/text/volunteer_accepted_new_times_fr.txt b/backend/app/utilities/ses/template_files/text/volunteer_accepted_new_times_fr.txt new file mode 100644 index 00000000..49000233 --- /dev/null +++ b/backend/app/utilities/ses/template_files/text/volunteer_accepted_new_times_fr.txt @@ -0,0 +1,15 @@ +Bonjour {{first_name}}, + +Vous avez rendez-vous avec {{volunteer_name}} le {{date}} à {{time}} {{timezone}}. Veuillez vous connecter à votre compte pour voir ses coordonnées. + +Voir les appels planifiés : {{scheduled_calls_url}} + +--- + +Restez à jour : suivez-nous dès aujourd'hui! + +© Société de leucémie et lymphome du Canada +Tous droits réservés. +No d'enregistrement à titre d'organisme de bienfaisance : 10762 3654 RR0001 + +REMARQUE : Veuillez ne pas répondre au présent courriel. Il est envoyé automatiquement à partir d'une boîte de messagerie non surveillée – aucune réponse ne sera reçue ou traitée. Pour toute question ou préoccupation concernant le programme de soutien par les pairs Premier contact, écrivez à FirstConnection@bloodcancers.ca. diff --git a/backend/app/utilities/ses_email_service.py b/backend/app/utilities/ses_email_service.py index 6bb5b76c..ab223c7d 100644 --- a/backend/app/utilities/ses_email_service.py +++ b/backend/app/utilities/ses_email_service.py @@ -141,17 +141,225 @@ def send_verification_email( return self.send_templated_email(to_email, template_name, template_data, source_email) - def send_password_reset_email(self, to_email: str, reset_link: str) -> bool: + def send_password_reset_email( + self, to_email: str, reset_link: str, first_name: str = None, language: str = "en" + ) -> bool: """ Send password reset email Args: to_email: Recipient email address reset_link: Firebase password reset link + first_name: User's first name (optional) + language: Language code ("en" for English, "fr" for French). Defaults to "en" + + Returns: + bool: True if email sent successfully, False otherwise + """ + # Normalize language code + language = language.lower() if language else "en" + if language not in ["en", "fr"]: + language = "en" + + template_name = "PasswordResetEn" if language == "en" else "PasswordResetFr" + source_email = self.source_email_en if language == "en" else self.source_email_fr + + template_data = {"reset_link": reset_link, "first_name": first_name if first_name else "there"} + + return self.send_templated_email(to_email, template_name, template_data, source_email) + + def send_intake_form_confirmation_email(self, to_email: str, first_name: str = None, language: str = "en") -> bool: + """ + Send intake form confirmation email + + Args: + to_email: Recipient email address + first_name: User's first name (optional) + language: Language code ("en" for English, "fr" for French). Defaults to "en" Returns: bool: True if email sent successfully, False otherwise """ - template_data = {"reset_link": reset_link} + # Normalize language code + language = language.lower() if language else "en" + if language not in ["en", "fr"]: + language = "en" + + template_name = "IntakeFormConfirmationEn" if language == "en" else "IntakeFormConfirmationFr" + source_email = self.source_email_en if language == "en" else self.source_email_fr + + template_data = {"first_name": first_name if first_name else "there"} - return self.send_templated_email(to_email, "PasswordReset", template_data) + return self.send_templated_email(to_email, template_name, template_data, source_email) + + def send_matches_available_email( + self, to_email: str, first_name: str = None, matches_url: str = None, language: str = "en" + ) -> bool: + """ + Send matches available email + + Args: + to_email: Recipient email address + first_name: User's first name (optional) + matches_url: URL to view matches (optional, defaults to dashboard) + language: Language code ("en" for English, "fr" for French). Defaults to "en" + + Returns: + bool: True if email sent successfully, False otherwise + """ + # Normalize language code + language = language.lower() if language else "en" + if language not in ["en", "fr"]: + language = "en" + + template_name = "MatchesAvailableEn" if language == "en" else "MatchesAvailableFr" + source_email = self.source_email_en if language == "en" else self.source_email_fr + + # Default to dashboard if no specific URL provided + if not matches_url: + matches_url = "http://localhost:3000/participant/dashboard" + + template_data = {"first_name": first_name if first_name else "there", "matches_url": matches_url} + + return self.send_templated_email(to_email, template_name, template_data, source_email) + + def send_call_scheduled_email( + self, + to_email: str, + match_name: str, + date: str, + time: str, + timezone: str, + first_name: str = None, + scheduled_calls_url: str = None, + language: str = "en", + ) -> bool: + """ + Send call scheduled confirmation email + + Args: + to_email: Recipient email address + match_name: Name of the person they're meeting with + date: Date of the call + time: Time of the call + timezone: Timezone of the call + first_name: User's first name (optional) + scheduled_calls_url: URL to view scheduled calls (optional, defaults to dashboard) + language: Language code ("en" for English, "fr" for French). Defaults to "en" + + Returns: + bool: True if email sent successfully, False otherwise + """ + # Normalize language code + language = language.lower() if language else "en" + if language not in ["en", "fr"]: + language = "en" + + template_name = "CallScheduledEn" if language == "en" else "CallScheduledFr" + source_email = self.source_email_en if language == "en" else self.source_email_fr + + # Default to dashboard if no specific URL provided + if not scheduled_calls_url: + scheduled_calls_url = "http://localhost:3000/participant/dashboard" + + template_data = { + "first_name": first_name if first_name else "there", + "match_name": match_name, + "date": date, + "time": time, + "timezone": timezone, + "scheduled_calls_url": scheduled_calls_url, + } + + return self.send_templated_email(to_email, template_name, template_data, source_email) + + def send_participant_requested_new_times_email( + self, + to_email: str, + participant_name: str, + first_name: str = None, + matches_url: str = None, + language: str = "en", + ) -> bool: + """ + Send participant requested new times email (to volunteer) + + Args: + to_email: Volunteer email address + participant_name: Name of the participant who requested new times + first_name: Volunteer's first name (optional) + matches_url: URL to view matches (optional, defaults to dashboard) + language: Language code ("en" for English, "fr" for French). Defaults to "en" + + Returns: + bool: True if email sent successfully, False otherwise + """ + # Normalize language code + language = language.lower() if language else "en" + if language not in ["en", "fr"]: + language = "en" + + template_name = "ParticipantRequestedNewTimesEn" if language == "en" else "ParticipantRequestedNewTimesFr" + source_email = self.source_email_en if language == "en" else self.source_email_fr + + # Default to dashboard if no specific URL provided + if not matches_url: + matches_url = "http://localhost:3000/volunteer/dashboard" + + template_data = { + "first_name": first_name if first_name else "there", + "participant_name": participant_name, + "matches_url": matches_url, + } + + return self.send_templated_email(to_email, template_name, template_data, source_email) + + def send_volunteer_accepted_new_times_email( + self, + to_email: str, + volunteer_name: str, + date: str, + time: str, + timezone: str, + first_name: str = None, + scheduled_calls_url: str = None, + language: str = "en", + ) -> bool: + """ + Send volunteer accepted new times email (to participant) + + Args: + to_email: Participant email address + volunteer_name: Name of the volunteer who accepted new times + date: Date of the call + time: Time of the call + timezone: Timezone of the call + first_name: Participant's first name (optional) + scheduled_calls_url: URL to view scheduled calls (optional, defaults to dashboard) + language: Language code ("en" for English, "fr" for French). Defaults to "en" + + Returns: + bool: True if email sent successfully, False otherwise + """ + # Normalize language code + language = language.lower() if language else "en" + if language not in ["en", "fr"]: + language = "en" + + template_name = "VolunteerAcceptedNewTimesEn" if language == "en" else "VolunteerAcceptedNewTimesFr" + source_email = self.source_email_en if language == "en" else self.source_email_fr + + # Default to dashboard if no specific URL provided + if not scheduled_calls_url: + scheduled_calls_url = "http://localhost:3000/participant/dashboard" + + template_data = { + "first_name": first_name if first_name else "there", + "volunteer_name": volunteer_name, + "date": date, + "time": time, + "timezone": timezone, + "scheduled_calls_url": scheduled_calls_url, + } + + return self.send_templated_email(to_email, template_name, template_data, source_email) diff --git a/backend/update_ses_templates.py b/backend/update_ses_templates.py index 22c96b55..0f48e8d5 100644 --- a/backend/update_ses_templates.py +++ b/backend/update_ses_templates.py @@ -1,15 +1,27 @@ #!/usr/bin/env python3 """ Script to update SES email templates in AWS. -Run this script to update existing templates with the latest HTML/text content. +Run this script to: +1. Compile Jinja2 templates (.j2) to HTML files +2. Update existing templates with the latest HTML/text content in AWS SES """ import os +from pathlib import Path from dotenv import load_dotenv +from jinja2 import Environment, FileSystemLoader, Undefined from app.utilities.ses.ses_init import ensure_ses_templates + +class PreservingUndefined(Undefined): + """Custom Undefined that preserves {{variable}} syntax for AWS SES""" + + def __str__(self): + return "{{%s}}" % self._undefined_name + + # Change to backend directory for proper path resolution backend_dir = os.path.dirname(os.path.abspath(__file__)) os.chdir(backend_dir) @@ -18,7 +30,75 @@ load_dotenv() +def compile_jinja_templates(): + """ + Compile all .j2 Jinja2 templates to .html files + """ + template_dir = Path("app/utilities/ses/template_files") + source_dir = template_dir / "source" + compiled_dir = template_dir / "compiled" + base_dir = template_dir / "base" + + # Set up Jinja2 environment with multiple loader paths and custom Undefined handler + env = Environment( + loader=FileSystemLoader([str(source_dir), str(base_dir)]), + undefined=PreservingUndefined, + ) + + # Find all .j2 files in source directory + j2_files = list(source_dir.glob("*.j2")) + + if not j2_files: + print("No .j2 templates found to compile.") + return + + print(f"Found {len(j2_files)} Jinja2 template(s) to compile...") + + for j2_file in j2_files: + template_name = j2_file.name + output_name = template_name.replace(".j2", ".html") + output_path = compiled_dir / output_name + + print(f" Compiling {template_name} → {output_name}") + + # Determine which base template to use based on language + is_french = "_fr" in template_name.lower() + + # Update the source file to extend the correct base template + source_content = j2_file.read_text() + + if is_french: + # Replace base_email.html with base_email_fr.html + source_content = source_content.replace( + '{% extends "base_email.html" %}', '{% extends "base_email_fr.html" %}' + ) + else: + # Replace base_email.html with base_email_en.html + source_content = source_content.replace( + '{% extends "base_email.html" %}', '{% extends "base_email_en.html" %}' + ) + + # Temporarily write this to the file for compilation + j2_file.write_text(source_content) + + # Load template + template = env.get_template(template_name) + + # Render WITHOUT passing any variables to preserve {{}} for AWS SES + rendered = template.render() + + # Write to output file + output_path.write_text(rendered) + print(" ✓ Compiled successfully") + + print(f"\nCompiled {len(j2_files)} template(s).") + + if __name__ == "__main__": - print("Updating SES templates...") + print("=== Compiling Jinja2 Templates ===\n") + compile_jinja_templates() + + print("\n=== Updating SES Templates in AWS ===\n") ensure_ses_templates(force_update=True) - print("Done!") + + print("\n✓ Done!")