diff --git a/basket/news/api.py b/basket/news/api.py index 548f7b77..fd7e85e3 100644 --- a/basket/news/api.py +++ b/basket/news/api.py @@ -162,7 +162,6 @@ def recover_user(request, body: RecoverUserSchema): tasks.send_recovery_message.delay( body.email, - user_data["token"], user_data.get("lang", "en") or "en", user_data.get("email_id"), ) diff --git a/basket/news/backends/braze.py b/basket/news/backends/braze.py index 6fa034ea..f7332217 100644 --- a/basket/news/backends/braze.py +++ b/basket/news/backends/braze.py @@ -23,20 +23,8 @@ BRAZE_OPTIMAL_DELAY = timedelta(minutes=5) -# These tasks cannot be placed in basket/news/tasks.py because it would +# This task cannot be placed in basket/news/tasks.py because it would # create a circular dependency. -@rq_task -def migrate_external_id_task(current_external_id, new_external_id): - braze.interface.migrate_external_id( - [ - { - "current_external_id": current_external_id, - "new_external_id": new_external_id, - } - ] - ) - - @rq_task def add_fxa_id_alias_task(external_id, fxa_id): braze.interface.add_fxa_id_alias(external_id, fxa_id) @@ -366,7 +354,6 @@ def __init__(self, interface): def get( self, - email_id=None, token=None, email=None, fxa_id=None, @@ -381,18 +368,6 @@ def get( @return: dict, or None if not found """ - # If we only have a token or fxa_id and the Braze migrations for them haven't been - # completed we won't be able to look up the user. We add a temporary shim here which - # will fetch the email from CTMS. This shim can be disabled/removed after the migrations - # are complete. - if not email and settings.BRAZE_CTMS_SHIM_ENABLE: - try: - ctms_response = ctms.get(token=token, fxa_id=fxa_id) - if ctms_response: - email = ctms_response.get("email") - except Exception: - log.warn("Unable to fetch email from CTMS in braze.get shim") - user_response = self.interface.export_users( email, [ @@ -424,6 +399,20 @@ def get( return self.from_vendor(user_data, subscriptions) + # If we only have an outdated token or the Braze fxa_id migrations haven't been + # completed we won't be able to look up the user. We add a temporary shim here which + # will fetch the email from CTMS. This shim can be disabled/removed after the migration + # is complete. + elif not email and (fxa_id or token) and settings.BRAZE_CTMS_SHIM_ENABLE: + try: + ctms_response = ctms.get(token=token, fxa_id=fxa_id) + if ctms_response: + ctms_email = ctms_response.get("email") + if ctms_email: + return self.get(email=ctms_email) + except Exception: + log.warn("Unable to fetch email from CTMS in braze.get shim") + def add(self, data): """ Create a user record. @@ -441,14 +430,6 @@ def add(self, data): enqueue_in=BRAZE_OPTIMAL_DELAY, ) - token = data.get("token") - if token and settings.BRAZE_PARALLEL_WRITE_ENABLE: - migrate_external_id_task.delay( - external_id, - token, - enqueue_in=BRAZE_OPTIMAL_DELAY, - ) - return {"email": {"email_id": external_id}} def update(self, existing_data, update_data): @@ -539,7 +520,8 @@ def from_vendor(self, braze_user_data, subscription_groups): "last_modified_date": user_attributes.get("updated_at"), "optin": braze_user_data.get("email_subscribe") == "opted_in", "optout": braze_user_data.get("email_subscribe") == "unsubscribed", - "token": user_attributes.get("basket_token"), + "token": braze_user_data["external_id"], + "ctms_legacy_token": user_attributes.get("basket_token"), "fxa_service": user_attributes.get("fxa_first_service"), "fxa_lang": user_attributes.get("fxa_lang"), "fxa_primary_email": user_attributes.get("fxa_primary_email"), @@ -563,9 +545,7 @@ def to_vendor(self, basket_user_data=None, update_data=None, events=None): country = process_country(updated_user_data.get("country") or None) language = process_lang(updated_user_data.get("lang") or None) - external_id = ( - updated_user_data.get("token") if not existing_user_data and settings.BRAZE_ONLY_WRITE_ENABLE else updated_user_data.get("email_id") - ) + external_id = updated_user_data.get("email_id") if not external_id: raise ValueError("Missing Braze external_id") @@ -593,7 +573,7 @@ def to_vendor(self, basket_user_data=None, update_data=None, events=None): "subscription_groups": subscription_groups, "user_attributes_v1": [ { - "basket_token": updated_user_data.get("token"), + "basket_token": updated_user_data.get("ctms_legacy_token") or updated_user_data.get("token"), "created_at": {"$time": updated_user_data.get("created_date", now)}, "email_lang": language, "mailing_country": country, diff --git a/basket/news/backends/ctms.py b/basket/news/backends/ctms.py index cb77db6b..b681b709 100644 --- a/basket/news/backends/ctms.py +++ b/basket/news/backends/ctms.py @@ -854,6 +854,10 @@ def get( alt_ids = [] if token: alt_ids.append({"basket_token": token}) + + # While we transition from `basket_token` to `external_id` / `email_id` the + # token passed in can either be a `basket_token` or an `external_id` / `email_id`. + alt_ids.append({"email_id": token}) if email: alt_ids.append({"primary_email": email}) if fxa_id: diff --git a/basket/news/management/commands/process_fxa_queue.py b/basket/news/management/commands/process_fxa_queue.py index 52489469..847e88fe 100644 --- a/basket/news/management/commands/process_fxa_queue.py +++ b/basket/news/management/commands/process_fxa_queue.py @@ -11,6 +11,7 @@ import sentry_sdk from basket import metrics +from basket.news.backends.braze import BRAZE_OPTIMAL_DELAY from basket.news.tasks import ( fxa_delete, fxa_email_changed, @@ -101,28 +102,28 @@ def handle(self, *args, **options): msg.delete() continue + enqueue_in = BRAZE_OPTIMAL_DELAY if should_delay_execution(event_type, event) else None try: if settings.BRAZE_PARALLEL_WRITE_ENABLE: pre_generated_token = generate_token() - pre_generated_email_id = generate_token() FXA_EVENT_TYPES[event_type].delay( event, use_braze_backend=True, should_send_tx_messages=False, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, + enqueue_in=enqueue_in, ) FXA_EVENT_TYPES[event_type].delay( event, use_braze_backend=False, should_send_tx_messages=True, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) elif settings.BRAZE_ONLY_WRITE_ENABLE: FXA_EVENT_TYPES[event_type].delay( event, use_braze_backend=True, + enqueue_in=enqueue_in, ) else: FXA_EVENT_TYPES[event_type].delay( @@ -142,3 +143,16 @@ def handle(self, *args, **options): msg.delete() except KeyboardInterrupt: sys.exit("\nBuh bye") + + +def should_delay_execution(event_type, event): + """ + Braze can take up to 5 minutes to add an fxa_id alias. We use this function + to determine if an event relies on the fxa_id alias and should be delayed. + """ + if event_type == "primaryEmailChanged": + return True + elif event.get("uid") and not event.get("email"): + return True + else: + return False diff --git a/basket/news/tasks.py b/basket/news/tasks.py index abdd4f26..cc614236 100644 --- a/basket/news/tasks.py +++ b/basket/news/tasks.py @@ -48,7 +48,6 @@ def fxa_email_changed( data, use_braze_backend=False, pre_generated_token=None, - pre_generated_email_id=None, **kwargs, ): ts = data["ts"] @@ -83,8 +82,8 @@ def fxa_email_changed( "fxa_id": fxa_id, "fxa_primary_email": email, } - if pre_generated_email_id: - data["email_id"] = pre_generated_email_id + if pre_generated_token: + data["email_id"] = pre_generated_token backend_data = data.copy() contact = None @@ -125,7 +124,6 @@ def fxa_verified( use_braze_backend=False, should_send_tx_messages=True, pre_generated_token=None, - pre_generated_email_id=None, ): """Add new FxA users""" # if we're not using the sandbox ignore testing domains @@ -169,7 +167,6 @@ def fxa_verified( use_braze_backend=use_braze_backend, should_send_tx_messages=should_send_tx_messages, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) @@ -179,7 +176,6 @@ def fxa_newsletters_update( use_braze_backend=False, should_send_tx_messages=True, pre_generated_token=None, - pre_generated_email_id=None, ): email = data["email"] fxa_id = data["uid"] @@ -199,7 +195,6 @@ def fxa_newsletters_update( use_braze_backend=use_braze_backend, should_send_tx_messages=should_send_tx_messages, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) @@ -209,7 +204,6 @@ def fxa_login( use_braze_backend=False, should_send_tx_messages=True, pre_generated_token=None, - pre_generated_email_id=None, ): email = data["email"] # if we're not using the sandbox ignore testing domains @@ -230,7 +224,6 @@ def fxa_login( use_braze_backend=use_braze_backend, should_send_tx_messages=should_send_tx_messages, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) @@ -253,7 +246,6 @@ def upsert_user( use_braze_backend=False, should_send_tx_messages=True, pre_generated_token=None, - pre_generated_email_id=None, ): """ Update or insert (upsert) a contact record @@ -275,7 +267,6 @@ def upsert_user( use_braze_backend=use_braze_backend, should_send_tx_messages=should_send_tx_messages, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) @@ -286,7 +277,6 @@ def upsert_contact( use_braze_backend=False, should_send_tx_messages=True, pre_generated_token=None, - pre_generated_email_id=None, ): """ Update or insert (upsert) a contact record @@ -304,7 +294,15 @@ def upsert_contact( newsletters = parse_newsletters_csv(data.get("newsletters")) cur_newsletters = user_data and user_data.get("newsletters") - if user_data and data.get("token") and user_data.get("token") != data["token"]: + if ( + user_data + and data.get("token") + and data["token"] + not in [ + user_data.get("token"), + user_data.get("ctms_legacy_token"), + ] + ): # We were passed a token but it doesn't match the user. return None, None @@ -374,8 +372,8 @@ def upsert_contact( # no user found. create new one. token = update_data["token"] = pre_generated_token or generate_token() - if pre_generated_email_id: - update_data["email_id"] = pre_generated_email_id + if pre_generated_token: + update_data["email_id"] = pre_generated_token if settings.MAINTENANCE_MODE: if use_braze_backend: @@ -384,9 +382,9 @@ def upsert_contact( ctms_add_or_update.delay(update_data) else: if use_braze_backend: - new_user = braze.add(update_data) + braze.add(update_data) else: - new_user = ctms.add(update_data) + ctms.add(update_data) if send_confirm and settings.SEND_CONFIRM_MESSAGES and should_send_tx_messages: send_confirm_message.delay( @@ -394,7 +392,6 @@ def upsert_contact( token, data.get("lang", "en-US"), send_confirm, - new_user and new_user.get("email", {}).get("email_id") or None, ) return token, True @@ -440,7 +437,6 @@ def upsert_contact( token, update_data.get("lang", user_data.get("lang", "en-US")), send_confirm, - user_data.get("email_id"), ) return token, False @@ -495,13 +491,13 @@ def send_tx_messages(email, lang, message_ids): @rq_task -def send_confirm_message(email, token, lang, message_type, email_id): +def send_confirm_message(email, token, lang, message_type): lang = lang.strip() lang = lang or "en-US" message_id = f"newsletter-confirm-{message_type}" txm = BrazeTxEmailMessage.objects.get_message(message_id, lang) if txm: - send_tx_message(email, txm.message_id, txm.language, user_data={"basket_token": token, "email_id": email_id}) + send_tx_message(email, txm.message_id, txm.language, user_data={"basket_token": token, "email_id": token}) @rq_task @@ -559,11 +555,11 @@ def update_custom_unsub(token, reason, use_braze_backend=False): @rq_task -def send_recovery_message(email, token, lang, email_id): +def send_recovery_message(email, lang, token): message_id = "account-recovery" txm = BrazeTxEmailMessage.objects.get_message(message_id, lang) if txm: - user_data = {"basket_token": token, "email_id": email_id} + user_data = {"basket_token": token, "email_id": token} send_tx_message(email, txm.message_id, txm.language, user_data=user_data) diff --git a/basket/news/tests/api/test_users_recover.py b/basket/news/tests/api/test_users_recover.py index 669b7047..3c89c796 100644 --- a/basket/news/tests/api/test_users_recover.py +++ b/basket/news/tests/api/test_users_recover.py @@ -57,7 +57,7 @@ def test_good_email(self): assert resp.status_code == 200, resp.content data = resp.json() self.validate_schema(data, OkSchema) - mock_send.assert_called_with(self.email, self.token, "en", self.email_id) + mock_send.assert_called_with(self.email, "en", self.email_id) # 4xx errors diff --git a/basket/news/tests/test_braze.py b/basket/news/tests/test_braze.py index 3b4456b6..deaa865b 100644 --- a/basket/news/tests/test_braze.py +++ b/basket/news/tests/test_braze.py @@ -1,7 +1,6 @@ from collections import namedtuple from unittest import mock -from django.test.utils import override_settings from django.utils import timezone import pytest @@ -305,7 +304,8 @@ def test_braze_exception_500(braze_client): "last_modified_date": "2022-02-01", "optin": True, "optout": False, - "token": "abc", + "token": "123", + "ctms_legacy_token": "abc", "fxa_service": "test", "fxa_lang": "en", "fxa_primary_email": "test2@example.com", @@ -471,58 +471,6 @@ def test_to_vendor_with_updates_and_no_user_data(mock_newsletter_languages, mock assert braze_instance.to_vendor(None, update_data) == expected -@override_settings(BRAZE_ONLY_WRITE_ENABLE=True) -@mock.patch( - "basket.news.newsletters._newsletters", - return_value=mock_newsletters, -) -@mock.patch( - "basket.news.newsletters.newsletter_languages", - return_value=["en"], -) -def test_to_vendor_with_updates_and_no_user_data_in_braze_only_write(mock_newsletter_languages, mock_newsletters, braze_client): - braze_instance = Braze(braze_client) - dt = timezone.now() - update_data = {"newsletters": {"bar-news": True}, "email": "test@example.com", "token": "abc", "email_id": "123", "unsub_reason": "unsub"} - expected = { - "attributes": [ - { - "_update_existing_only": False, - "email": "test@example.com", - "external_id": "abc", - "language": "en", - "email_subscribe": "subscribed", - "subscription_groups": [ - {"subscription_group_id": "78fe6671-9f94-48bd-aaf3-7e873536c3e6", "subscription_state": "subscribed"}, - ], - "update_timestamp": dt.isoformat(), - "user_attributes_v1": [ - { - "email_lang": "en", - "created_at": { - "$time": dt.isoformat(), - }, - "basket_token": "abc", - "fxa_first_service": None, - "fxa_lang": None, - "fxa_primary_email": None, - "fxa_created_at": None, - "has_fxa": False, - "fxa_deleted": None, - "mailing_country": None, - "updated_at": { - "$time": dt.isoformat(), - }, - "unsub_reason": "unsub", - } - ], - } - ] - } - with freeze_time(dt): - assert braze_instance.to_vendor(None, update_data) == expected - - def test_to_vendor_throws_exception_for_missing_external_id(braze_client): braze_instance = Braze(braze_client) update_data = { @@ -762,72 +710,6 @@ def test_braze_add_with_fxa_id(add_fxa_id, mock_newsletters, braze_client): ) -@override_settings(BRAZE_PARALLEL_WRITE_ENABLE=True) -@mock.patch( - "basket.news.newsletters._newsletters", - return_value=mock_newsletters, -) -@mock.patch( - "basket.news.backends.braze.migrate_external_id_task.delay", -) -def test_braze_add_with_external_id_migration(migrate_external_id, mock_newsletters, braze_client): - braze_instance = Braze(braze_client) - new_user = { - "email": "test@example.com", - "email_id": "123", - "token": "abc", - "newsletters": {"foo-news": True}, - "country": "US", - } - - with requests_mock.mock() as m: - m.register_uri("POST", "http://test.com/users/track", json={}) - expected = {"email": {"email_id": new_user["email_id"]}} - with freeze_time(): - response = braze_instance.add(new_user) - api_requests = m.request_history - assert response == expected - assert api_requests[0].url == "http://test.com/users/track" - assert api_requests[0].json() == braze_instance.to_vendor(None, new_user) - migrate_external_id.assert_called_once_with( - "123", - "abc", - enqueue_in=braze.BRAZE_OPTIMAL_DELAY, - ) - - -@override_settings(BRAZE_PARALLEL_WRITE_ENABLE=True) -@mock.patch( - "basket.news.newsletters._newsletters", - return_value=mock_newsletters, -) -@mock.patch( - "basket.news.backends.braze.migrate_external_id_task.delay", -) -def test_braze_add_migrates_external_id(migrate_external_id, mock_newsletters, braze_client): - braze_instance = Braze(braze_client) - new_user = { - "email": "test@example.com", - "email_id": "123", - "token": "abc", - "newsletters": {"foo-news": True}, - "country": "US", - } - with requests_mock.mock() as m: - m.register_uri("POST", "http://test.com/users/track", json={}) - m.register_uri( - "POST", - "http://test.com/users/external_ids/rename", - json={ - "message": "success", - "external_ids": ["abc"], - }, - ) - braze_instance.add(new_user) - - migrate_external_id.assert_called_once() - - @mock.patch( "basket.news.newsletters._newsletters", return_value=mock_newsletters, diff --git a/basket/news/tests/test_ctms.py b/basket/news/tests/test_ctms.py index 0639d1fb..4178165c 100644 --- a/basket/news/tests/test_ctms.py +++ b/basket/news/tests/test_ctms.py @@ -1278,9 +1278,10 @@ def test_get_by_token(self): ctms = CTMS(interface) user_data = ctms.get(token=token) assert user_data == self.TEST_BASKET_FORMAT - interface.session.get.assert_called_once_with( - "/ctms", - params={"basket_token": token}, + interface.session.get.assert_has_calls( + [ + call("/ctms", params={"basket_token": "token"}), + ], ) def test_get_by_token_not_found(self): @@ -1387,13 +1388,14 @@ def test_get_by_amo_id_multiple_contacts(self): def test_get_by_several_ids_none_then_one(self): """If multiple alt IDs are passed, the second is tried on miss.""" interface = Mock(spec_set=["get_by_alternate_id"]) - interface.get_by_alternate_id.side_effect = ([], [self.TEST_CTMS_CONTACT]) + interface.get_by_alternate_id.side_effect = ([], [], [self.TEST_CTMS_CONTACT]) ctms = CTMS(interface) user_data = ctms.get(token="some-token", email="some-email@example.com") assert user_data == self.TEST_BASKET_FORMAT interface.get_by_alternate_id.assert_has_calls( [ call(basket_token="some-token"), + call(email_id="some-token"), call(primary_email="some-email@example.com"), ], ) @@ -1401,13 +1403,14 @@ def test_get_by_several_ids_none_then_one(self): def test_get_by_several_ids_both_none(self): """If multiple alt IDs are passed and all miss, None is returned.""" interface = Mock(spec_set=["get_by_alternate_id"]) - interface.get_by_alternate_id.side_effect = ([], []) + interface.get_by_alternate_id.side_effect = ([], [], []) ctms = CTMS(interface) user_data = ctms.get(token="some-token", email="some-email@example.com") assert user_data is None interface.get_by_alternate_id.assert_has_calls( [ call(basket_token="some-token"), + call(email_id="some-token"), call(primary_email="some-email@example.com"), ], ) diff --git a/basket/news/tests/test_tasks.py b/basket/news/tests/test_tasks.py index 0bc2550a..fb8c1311 100644 --- a/basket/news/tests/test_tasks.py +++ b/basket/news/tests/test_tasks.py @@ -608,9 +608,9 @@ def test_send_tx_messages_with_map(mock_model, mock_braze, metricsmock): @patch("basket.news.models.BrazeTxEmailMessage.objects.get_message") def test_send_confirm_message(mock_get_message, mock_braze, metricsmock): mock_get_message.return_value = BrazeTxEmailMessage(message_id="newsletter-confirm-fx", language="en-US") - send_confirm_message("test@example.com", "abc123", "en", "fx", "fed654") + send_confirm_message("test@example.com", "abc123", "en", "fx") mock_braze.interface.track_user.assert_called_once_with( - "test@example.com", event="send-newsletter-confirm-fx-en-US", user_data={"basket_token": "abc123", "email_id": "fed654"} + "test@example.com", event="send-newsletter-confirm-fx-en-US", user_data={"basket_token": "abc123", "email_id": "abc123"} ) metricsmock.assert_incr_once("news.tasks.send_tx_message", tags=["message_id:newsletter-confirm-fx", "language:en-US"]) @@ -619,8 +619,8 @@ def test_send_confirm_message(mock_get_message, mock_braze, metricsmock): @patch("basket.news.models.BrazeTxEmailMessage.objects.get_message") def test_send_recovery_message(mock_get_message, mock_braze, metricsmock): mock_get_message.return_value = BrazeTxEmailMessage(message_id="newsletter-confirm-fx", language="en-US") - send_recovery_message("test@example.com", "abc123", "en", "fed654") + send_recovery_message("test@example.com", "en", "fed654") mock_braze.interface.track_user.assert_called_once_with( - "test@example.com", event="send-newsletter-confirm-fx-en-US", user_data={"basket_token": "abc123", "email_id": "fed654"} + "test@example.com", event="send-newsletter-confirm-fx-en-US", user_data={"basket_token": "fed654", "email_id": "fed654"} ) metricsmock.assert_incr_once("news.tasks.send_tx_message", tags=["message_id:newsletter-confirm-fx", "language:en-US"]) diff --git a/basket/news/tests/test_upsert_user.py b/basket/news/tests/test_upsert_user.py index b441d32b..892d7ae1 100644 --- a/basket/news/tests/test_upsert_user.py +++ b/basket/news/tests/test_upsert_user.py @@ -268,7 +268,7 @@ def test_send_confirm(self, get_user_mock, ctms_mock, confirm_mock): update_data["token"] = ANY ctms_mock.add.assert_called_with(update_data) update_data["email_id"] = email_id - confirm_mock.delay.assert_called_with(self.email, ANY, "en", "moz", email_id) + confirm_mock.delay.assert_called_with(self.email, ANY, "en", "moz") def test_send_fx_confirm(self, get_user_mock, ctms_mock, confirm_mock): """Subscribing to a Fx newsletter should send a Fx confirm email""" @@ -296,7 +296,7 @@ def test_send_fx_confirm(self, get_user_mock, ctms_mock, confirm_mock): update_data["token"] = ANY ctms_mock.add.assert_called_with(update_data) update_data["email_id"] = email_id - confirm_mock.delay.assert_called_with(self.email, ANY, "en", "fx", email_id) + confirm_mock.delay.assert_called_with(self.email, ANY, "en", "fx") def test_send_moz_confirm(self, get_user_mock, ctms_mock, confirm_mock): """Subscribing to a Fx and moz newsletters should send a moz confirm email""" @@ -333,7 +333,7 @@ def test_send_moz_confirm(self, get_user_mock, ctms_mock, confirm_mock): update_data["token"] = ANY ctms_mock.add.assert_called_with(update_data) update_data["email_id"] = email_id - confirm_mock.delay.assert_called_with(self.email, ANY, "en", "moz", email_id) + confirm_mock.delay.assert_called_with(self.email, ANY, "en", "moz") def test_no_send_confirm_newsletter( self, @@ -500,7 +500,7 @@ def test_new_subscription_with_ctms_conflict( update_data["newsletters"] = {"slug": True} update_data["token"] = ANY ctms_mock.add.assert_called_with(update_data) - confirm_mock.delay.assert_called_with(self.email, ANY, "en", "moz", None) + confirm_mock.delay.assert_called_with(self.email, ANY, "en", "moz") def test_new_user_subscribes_to_mofo_newsletter( self, diff --git a/basket/news/tests/test_views.py b/basket/news/tests/test_views.py index ea9e0747..5d9f3252 100644 --- a/basket/news/tests/test_views.py +++ b/basket/news/tests/test_views.py @@ -707,7 +707,6 @@ def test_known_email(self, mock_send_recovery_message_task, mock_get_user_data): self.assertEqual(200, resp.status_code) mock_send_recovery_message_task.assert_called_with( email, - "el-dudarino", "en", "fed654", ) diff --git a/basket/news/utils.py b/basket/news/utils.py index 1d88c64f..829fbdcb 100644 --- a/basket/news/utils.py +++ b/basket/news/utils.py @@ -240,6 +240,7 @@ def language_code_is_valid(code): "has_fxa", "fxa_deleted", "unsub_reason", + "ctms_legacy_token", ] diff --git a/basket/news/views.py b/basket/news/views.py index 1f9814c0..16d0e632 100644 --- a/basket/news/views.py +++ b/basket/news/views.py @@ -146,7 +146,6 @@ def handler( should_send_tx_messages=True, extra_metrics_tags=None, pre_generated_token=None, - pre_generated_email_id=None, ): if extra_metrics_tags is None: extra_metrics_tags = [] @@ -188,7 +187,6 @@ def handler( use_braze_backend=use_braze_backend, should_send_tx_messages=should_send_tx_messages, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, )[0] except Exception as e: metrics.incr("news.views.fxa_callback", tags=["status:error", "error:upsert_contact", *extra_metrics_tags]) @@ -201,7 +199,6 @@ def handler( if settings.BRAZE_PARALLEL_WRITE_ENABLE: pre_generated_token = generate_token() - pre_generated_email_id = generate_token() try: handler( email, @@ -210,7 +207,6 @@ def handler( should_send_tx_messages=False, extra_metrics_tags=["backend:braze"], pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) except Exception as e: sentry_sdk.capture_exception(e) @@ -221,7 +217,6 @@ def handler( use_braze_backend=False, should_send_tx_messages=True, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) elif settings.BRAZE_ONLY_WRITE_ENABLE: return handler( @@ -370,7 +365,6 @@ def handler( rate_limit_increment=True, extra_metrics_tags=None, pre_generated_token=None, - pre_generated_email_id=None, ): allowed_body_keys = [ "email", @@ -479,13 +473,11 @@ def handler( rate_limit_increment=rate_limit_increment, extra_metrics_tags=extra_metrics_tags, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) # We are doing parallel writes and want the token/email_id # to be same in both CTMS and Braze so we eagerly generate them now. pre_generated_token = generate_token() - pre_generated_email_id = generate_token() if settings.BRAZE_PARALLEL_WRITE_ENABLE: try: @@ -496,7 +488,6 @@ def handler( rate_limit_increment=False, extra_metrics_tags=["backend:braze"], pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) except Exception as e: sentry_sdk.capture_exception(e) @@ -507,7 +498,6 @@ def handler( should_send_tx_messages=True, rate_limit_increment=True, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) elif settings.BRAZE_ONLY_WRITE_ENABLE: return handler( @@ -760,7 +750,7 @@ def send_recovery_message(request): lang = user_data.get("lang", "en") or "en" email_id = user_data.get("email_id") - tasks.send_recovery_message.delay(email, user_data["token"], lang, email_id) + tasks.send_recovery_message.delay(email, lang, email_id) return HttpResponseJSON({"status": "ok"}) @@ -972,7 +962,6 @@ def update_user_task( rate_limit_increment=True, extra_metrics_tags=None, pre_generated_token=None, - pre_generated_email_id=None, ): """Call the update_user task async with the right parameters. @@ -1081,7 +1070,6 @@ def update_user_task( use_braze_backend=use_braze_backend, should_send_tx_messages=should_send_tx_messages, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) # have to error since we can't return a token return HttpResponseJSON( @@ -1122,7 +1110,6 @@ def update_user_task( use_braze_backend=use_braze_backend, should_send_tx_messages=should_send_tx_messages, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) return HttpResponseJSON({"status": "ok", "token": token, "created": created}) else: @@ -1132,6 +1119,5 @@ def update_user_task( use_braze_backend=use_braze_backend, should_send_tx_messages=should_send_tx_messages, pre_generated_token=pre_generated_token, - pre_generated_email_id=pre_generated_email_id, ) return HttpResponseJSON({"status": "ok"})