feat: send welcome mail vv

This commit is contained in:
Livio Bieri 2023-12-07 15:56:59 +01:00 committed by Christian Cueni
parent e1120ef523
commit b8accb0c62
4 changed files with 68 additions and 13 deletions

View File

@ -62,6 +62,13 @@ class EmailTemplate(Enum):
# VBV - Neues Feedback für Circle # VBV - Neues Feedback für Circle
NEW_FEEDBACK = {"de": "d-40fb94d5149949e7b8e7ddfcf0fcfdde"} NEW_FEEDBACK = {"de": "d-40fb94d5149949e7b8e7ddfcf0fcfdde"}
# Versicherungsvermittler (after buying a course)
WELCOME_MAIL_VV = {
"de": "d-308a72c779b74c8487cdec03c772ad13",
"fr": "d-1a0958c7798c4dd18f730491e920eab5",
"it": "d-0882ec9c92f64312b9f358481a943c9a",
}
def send_email( def send_email(
recipient_email: str, recipient_email: str,

View File

@ -50,6 +50,10 @@ For Production: Make sure that the following env vars are set:
- `OAUTH_SIGNIN_SERVER_METADATA_URL` should help to find the correct value. - `OAUTH_SIGNIN_SERVER_METADATA_URL` should help to find the correct value.
- Should be the SSO Prod one from Lernnetz. -> TBD! - Should be the SSO Prod one from Lernnetz. -> TBD!
### send_vv_welcome_email()
- Due to lack of access to Sendgrid, never tested actually sending the email.
## Testing Payment Flow ## Testing Payment Flow
- To get user into state for testing (e.g. test-student1@example.com so that he can buy the course): - To get user into state for testing (e.g. test-student1@example.com so that he can buy the course):

View File

@ -1,4 +1,4 @@
from unittest.mock import patch from unittest.mock import ANY, patch
from django.urls import reverse from django.urls import reverse
from rest_framework import status from rest_framework import status
@ -8,6 +8,7 @@ from vbv_lernwelt.core.admin import User
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_ID from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_ID
from vbv_lernwelt.course.creators.test_utils import create_course, create_course_session from vbv_lernwelt.course.creators.test_utils import create_course, create_course_session
from vbv_lernwelt.course.models import CourseSessionUser from vbv_lernwelt.course.models import CourseSessionUser
from vbv_lernwelt.notify.email.email_services import EmailTemplate
from vbv_lernwelt.shop.const import VV_DE_PRODUCT_SKU from vbv_lernwelt.shop.const import VV_DE_PRODUCT_SKU
from vbv_lernwelt.shop.models import CheckoutInformation, CheckoutState, Product from vbv_lernwelt.shop.models import CheckoutInformation, CheckoutState, Product
@ -75,7 +76,10 @@ class DatatransWebhookTestCase(APITestCase):
) )
@patch("vbv_lernwelt.shop.views.is_signature_valid") @patch("vbv_lernwelt.shop.views.is_signature_valid")
def test_webhook_settled_transmitted_paid(self, mock_is_signature_valid): @patch("vbv_lernwelt.shop.views.send_email")
def test_webhook_settled_transmitted_paid(
self, mock_send_mail, mock_is_signature_valid
):
# GIVEN # GIVEN
transaction_id = "1234567890" transaction_id = "1234567890"
@ -135,6 +139,22 @@ class DatatransWebhookTestCase(APITestCase):
CourseSessionUser.objects.first().course_session.course.id, CourseSessionUser.objects.first().course_session.course.id,
) )
self.assertEqual(
1,
mock_send_mail.call_count,
)
mock_send_mail.assert_called_once_with(
template=EmailTemplate.WELCOME_MAIL_VV,
recipient_email=self.user.email,
template_data={
"course": "Versicherungsvermittler/-in (Deutsch)",
"target_url": "https://my.vbv-afa.ch/",
},
template_language=self.user.language,
fail_silently=ANY,
)
@patch("vbv_lernwelt.shop.views.is_signature_valid") @patch("vbv_lernwelt.shop.views.is_signature_valid")
def test_webhook_updates_webhook_history(self, mock_is_signature_valid): def test_webhook_updates_webhook_history(self, mock_is_signature_valid):
# GIVEN # GIVEN

View File

@ -13,6 +13,7 @@ from vbv_lernwelt.course.consts import (
COURSE_VERSICHERUNGSVERMITTLERIN_IT_ID, COURSE_VERSICHERUNGSVERMITTLERIN_IT_ID,
) )
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
from vbv_lernwelt.notify.email.email_services import EmailTemplate, send_email
from vbv_lernwelt.shop.const import ( from vbv_lernwelt.shop.const import (
VV_DE_PRODUCT_SKU, VV_DE_PRODUCT_SKU,
VV_FR_PRODUCT_SKU, VV_FR_PRODUCT_SKU,
@ -194,10 +195,29 @@ def update_checkout_state(checkout_info: CheckoutInformation, state: CheckoutSta
checkout_info.save(update_fields=["state"]) checkout_info.save(update_fields=["state"])
def send_vv_welcome_email(checkout_info: CheckoutInformation):
course_names = {
VV_DE_PRODUCT_SKU: "Versicherungsvermittler/-in (Deutsch)",
VV_FR_PRODUCT_SKU: "Intermédiaire dassurance (Français)",
VV_IT_PRODUCT_SKU: "Intermediario/a assicurativo/a (Italiano)",
}
send_email(
recipient_email=checkout_info.user.email,
template=EmailTemplate.WELCOME_MAIL_VV,
template_data={
"course": course_names[checkout_info.product_sku],
"target_url": "https://my.vbv-afa.ch/",
},
template_language=checkout_info.user.language,
fail_silently=True,
)
def create_vv_course_session_user(checkout_info: CheckoutInformation): def create_vv_course_session_user(checkout_info: CheckoutInformation):
logger.info("Creating VV course session user", user_id=checkout_info.user_id) logger.info("Creating VV course session user", user_id=checkout_info.user_id)
CourseSessionUser.objects.get_or_create( _, created = CourseSessionUser.objects.get_or_create(
user=checkout_info.user, user=checkout_info.user,
role=CourseSessionUser.Role.MEMBER, role=CourseSessionUser.Role.MEMBER,
course_session=CourseSession.objects.filter( course_session=CourseSession.objects.filter(
@ -205,6 +225,10 @@ def create_vv_course_session_user(checkout_info: CheckoutInformation):
).first(), ).first(),
) )
if created:
logger.info("VV course session user created", user_id=checkout_info.user_id)
send_vv_welcome_email(checkout_info)
def next_step_response( def next_step_response(
url: str, url: str,