def get_email_confirmation_email_data( user: users_models.User, token: users_models.Token ) -> Union[dict, SendinblueTransactionalEmailData]: expiration_timestamp = int(token.expirationDate.timestamp()) email_confirmation_link = generate_firebase_dynamic_link( path="signup-confirmation", params={"token": token.value, "expiration_timestamp": expiration_timestamp, "email": user.email}, ) # 18 hard coded because the email template only talks about the 18 years old case deposit_amount = deposit_conf.GRANTED_DEPOSIT_AMOUNT_BY_AGE_AND_VERSION[18][2] if not FeatureToggle.ENABLE_SENDINBLUE_TRANSACTIONAL_EMAILS.is_active(): return { "Mj-TemplateID": 2015423, "Mj-TemplateLanguage": True, "Mj-campaign": "confirmation-compte", "Mj-trackclick": 1, "Vars": { "nativeAppLink": email_confirmation_link, "isEligible": int(user.is_eligible), "isMinor": int(user.dateOfBirth + relativedelta(years=18) > datetime.today()), "depositAmount": int(deposit_amount), }, } return SendinblueTransactionalEmailData( template=TransactionalEmail.EMAIL_CONFIRMATION.value, params={ "CONFIRMATION_LINK": email_confirmation_link, }, )
def make_fraud_suspicion_data( ) -> Union[dict, SendinblueTransactionalEmailData]: if not FeatureToggle.ENABLE_SENDINBLUE_TRANSACTIONAL_EMAILS.is_active(): return { "Mj-TemplateID": 2905960, "Mj-TemplateLanguage": True, "Mj-campaign": "dossier-en-analyse", } return SendinblueTransactionalEmailData( template=TransactionalEmail.FRAUD_SUSPICION.value, params={})
def get_duplicate_beneficiary_pre_subscription_rejected_data( ) -> Union[dict, SendinblueTransactionalEmailData]: if not FeatureToggle.ENABLE_SENDINBLUE_TRANSACTIONAL_EMAILS.is_active(): return { "Mj-TemplateID": 1530996, "Mj-TemplateLanguage": True, } return SendinblueTransactionalEmailData( template=TransactionalEmail. EMAIL_DUPLICATE_BENEFICIARY_PRE_SUBCRIPTION_REJECTED.value, params={}, )
def get_accepted_as_underage_beneficiary_email_data( user: User) -> Optional[SendinblueTransactionalEmailData]: if not FeatureToggle.ENABLE_SENDINBLUE_TRANSACTIONAL_EMAILS.is_active(): return None if user.has_active_deposit is None: raise ValueError("Beneficiary should have a deposit") deposit_amount = user.deposit.amount return SendinblueTransactionalEmailData( template=TransactionalEmail.ACCEPTED_AS_EAC_BENEFICIARY.value, params={ "FIRSTNAME": user.firstName, "CREDIT": int(deposit_amount), }, )
def get_information_email_change_data( first_name: str) -> Union[dict, SendinblueTransactionalEmailData]: if not FeatureToggle.ENABLE_SENDINBLUE_TRANSACTIONAL_EMAILS.is_active(): return { "MJ-TemplateID": 2066067, "MJ-TemplateLanguage": True, "Vars": { "beneficiary_name": first_name, }, } return SendinblueTransactionalEmailData( template=TransactionalEmail.EMAIL_CHANGE_REQUEST.value, params={ "FIRSTNAME": first_name, }, )
def get_user_credit_email_data( user: User) -> Union[dict, SendinblueTransactionalEmailData]: if not user.has_active_deposit: raise Exception("The user has no active deposit") deposit_amount = user.deposit.amount if not FeatureToggle.ENABLE_SENDINBLUE_TRANSACTIONAL_EMAILS.is_active(): return { "Mj-TemplateID": 2016025, "Mj-TemplateLanguage": True, "Mj-campaign": "confirmation-credit", "Vars": { "depositAmount": int(deposit_amount), }, } return SendinblueTransactionalEmailData( template=TransactionalEmail.GRANT_USER_CREDIT, params={ "CREDIT": int(deposit_amount), }, )
class SendinblueBackendTest: recipients = ["*****@*****.**", "*****@*****.**"] mock_template = Template( id_prod=1, id_not_prod=10, tags=["this_is_such_a_great_tag", "it_would_be_a_pity_if_anything_happened_to_it"] ) params = {"Name": "Lucy", "City": "Kennet", "OtherCharacteristics": "Awsomeness"} data = SendinblueTransactionalEmailData(template=mock_template, params=params) expected_sent_data = SendTransactionalEmailRequest( recipients=recipients, params=params, template_id=data.template.id, tags=data.template.tags, ) def _get_backend(self, path_str): return import_string(path_str) @patch("pcapi.core.mails.backends.sendinblue.send_transactional_email_task.delay") @pytest.mark.parametrize( "backend_import_string", ( "pcapi.core.mails.backends.sendinblue.SendinblueBackend", "pcapi.core.mails.backends.sendinblue.ToDevSendinblueBackend", ), ) def test_send_mail(self, mock_send_transactional_email_task, backend_import_string): backend = self._get_backend(backend_import_string) result = backend().send_mail(recipients=self.recipients, data=self.data) assert list(mock_send_transactional_email_task.call_args[0][0].recipients) == list( self.expected_sent_data.recipients ) assert mock_send_transactional_email_task.call_args[0][0].params == self.expected_sent_data.params assert mock_send_transactional_email_task.call_args[0][0].template_id == self.expected_sent_data.template_id assert mock_send_transactional_email_task.call_args[0][0].tags == self.expected_sent_data.tags assert result.successful
def get_accepted_as_beneficiary_email_data( user: User) -> Union[dict, SendinblueTransactionalEmailData]: if not user.has_active_deposit: raise ValueError("Beneficiary should have a deposit") deposit_amount = user.deposit.amount if not FeatureToggle.ENABLE_SENDINBLUE_TRANSACTIONAL_EMAILS.is_active(): return { "Mj-TemplateID": 2016025, "Mj-TemplateLanguage": True, "Mj-campaign": "confirmation-credit", "Vars": { "depositAmount": int(deposit_amount), }, } return SendinblueTransactionalEmailData( template=TransactionalEmail.ACCEPTED_AS_BENEFICIARY.value, params={ "CREDIT": int(deposit_amount), }, )
def retrieve_data_for_reset_password_native_app_email( user: User, token: Token ) -> typing.Union[dict, SendinblueTransactionalEmailData]: reset_password_link = generate_firebase_dynamic_link( path="mot-de-passe-perdu", params={ "token": token.value, "expiration_timestamp": int(token.expirationDate.timestamp()), "email": user.email, }, ) if not FeatureToggle.ENABLE_SENDINBLUE_TRANSACTIONAL_EMAILS.is_active(): return { "MJ-TemplateID": 1838526, "MJ-TemplateLanguage": True, "Mj-trackclick": 1, "Vars": {"native_app_link": reset_password_link}, } return SendinblueTransactionalEmailData( template=TransactionalEmail.NEW_PASSWORD_REQUEST.value, params={"NATIVE_APP_LINK": reset_password_link} )