diff --git a/pipsevents/settings.py b/pipsevents/settings.py index 785a875e..01c9d93a 100644 --- a/pipsevents/settings.py +++ b/pipsevents/settings.py @@ -523,3 +523,5 @@ def show_toolbar(request): # pragma: no cover CART_TIMEOUT_MINUTES = env("CART_TIMEOUT_MINUTES", default=15) SHOW_MEMBERSHIPS = env.bool("SHOW_MEMBERSHIPS", False) + +NOTIFY_STUDIO_FOR_NEW_MEMBERSHIPS = env.bool("NOTIFY_STUDIO_FOR_NEW_MEMBERSHIPS", True) diff --git a/stripe_payments/emails.py b/stripe_payments/emails.py index bb9c9fe8..c929e77e 100644 --- a/stripe_payments/emails.py +++ b/stripe_payments/emails.py @@ -105,12 +105,16 @@ def send_updated_membership_email_to_support(user_membership, new_price_id, old_ ) -def _send_subscription_email(event_object, template_name, subject, user_membership=None): +def _send_subscription_email(event_object, template_name, subject, user_membership=None, to_email=None): if user_membership is None: user, user_membership = _get_user_from_membership(event_object) else: user = user_membership.user + if to_email is None: + to = [user.email] + else: + to = [to_email] ctx = { 'user': user, 'user_membership': user_membership, @@ -119,7 +123,7 @@ def _send_subscription_email(event_object, template_name, subject, user_membersh send_email( f'{settings.ACCOUNT_EMAIL_SUBJECT_PREFIX} {subject}', txt_template=f'stripe_payments/email/{template_name}.txt', - to_email=[user.email], + to_email=to, html_template=f'stripe_payments/email/{template_name}.html', extra_ctx=ctx ) @@ -138,3 +142,12 @@ def send_subscription_renewal_upcoming_email(event_object): def send_subscription_created_email(user_membership): _send_subscription_email(None, "subscription_created", "Your membership has been set up", user_membership=user_membership) + if settings.NOTIFY_STUDIO_FOR_NEW_MEMBERSHIPS: + _send_subscription_email( + None, + "subscription_created_to_studio", + "A new membership has been set up", + user_membership=user_membership, + to_email=settings.DEFAULT_STUDIO_EMAIL + ) + \ No newline at end of file diff --git a/stripe_payments/templates/stripe_payments/email/subscription_created_to_studio.html b/stripe_payments/templates/stripe_payments/email/subscription_created_to_studio.html new file mode 100644 index 00000000..e93a8a65 --- /dev/null +++ b/stripe_payments/templates/stripe_payments/email/subscription_created_to_studio.html @@ -0,0 +1,8 @@ +{% extends 'email_base.html' %} + +{% block messagecontent %} +

A new membership has been set up:

+

Membership: {{ user_membership.membership.name }}

+

User: {{ user_membership.user.first_name }} {{ user_membership.user.last_name }}

+

Start date: {{ user_membership.start_date|date:'d M Y' }}

+{% endblock %} \ No newline at end of file diff --git a/stripe_payments/templates/stripe_payments/email/subscription_created_to_studio.txt b/stripe_payments/templates/stripe_payments/email/subscription_created_to_studio.txt new file mode 100644 index 00000000..b751b681 --- /dev/null +++ b/stripe_payments/templates/stripe_payments/email/subscription_created_to_studio.txt @@ -0,0 +1,6 @@ +{% include "account/email/do_not_reply.txt" %} + +A new membership has been set up: +Membership: {{ user_membership.membership.name }} +User: {{ user_membership.user.first_name }} {{ user_membership.user.last_name }} +Start date: {{ user_membership.start_date|date:'d M Y' }} diff --git a/stripe_payments/tests/test_stripe_webhook_views.py b/stripe_payments/tests/test_stripe_webhook_views.py index e278d3fd..ff41c4e1 100644 --- a/stripe_payments/tests/test_stripe_webhook_views.py +++ b/stripe_payments/tests/test_stripe_webhook_views.py @@ -346,11 +346,18 @@ def test_webhook_subscription_created_setup_pending( assert user_membership.subscription_status == "setup_pending" +@pytest.mark.parametrize( + "studio_email", + ( + True, False + ) +) @patch("booking.models.membership_models.StripeConnector", MockConnector) @patch("stripe_payments.views.webhook.stripe.Webhook") def test_webhook_setup_intent_succeeded_for_subscription_with_user_membership( - mock_webhook, get_mock_webhook_event, client, configured_stripe_user + mock_webhook, get_mock_webhook_event, client, configured_stripe_user, settings, studio_email ): + settings.NOTIFY_STUDIO_FOR_NEW_MEMBERSHIPS = studio_email membership = baker.make(Membership, name="membership") user_membership = baker.make( UserMembership, @@ -366,7 +373,12 @@ def test_webhook_setup_intent_succeeded_for_subscription_with_user_membership( ) resp = client.post(webhook_url, data={}, HTTP_STRIPE_SIGNATURE="foo") assert resp.status_code == 200, resp.content - assert len(mail.outbox) == 1 + if studio_email: + assert len(mail.outbox) == 2 + assert "A new membership has been set up" in mail.outbox[1].subject + assert mail.outbox[1].to == [settings.DEFAULT_STUDIO_EMAIL] + else: + assert len(mail.outbox) == 1 assert "Your membership has been set up" in mail.outbox[0].subject user_membership.refresh_from_db() assert user_membership.pending_setup_intent is None @@ -501,15 +513,22 @@ def test_webhook_subscription_updated_status_changed_to_active_from_cancelled( assert paid_booking.membership is None +@pytest.mark.parametrize( + "studio_email", + [ + True, False + ] +) @pytest.mark.freeze_time("2024-02-26") @patch("booking.models.membership_models.StripeConnector", MockConnector) @patch("stripe_payments.views.webhook.stripe.Webhook") def test_webhook_subscription_updated_status_changed_to_active_from_incomplete( - mock_webhook, get_mock_webhook_event, client, configured_stripe_user + mock_webhook, get_mock_webhook_event, client, configured_stripe_user, settings, studio_email ): mock_webhook.construct_event.return_value = get_mock_webhook_event( webhook_event_type="customer.subscription.updated" ) + settings.NOTIFY_STUDIO_FOR_NEW_MEMBERSHIPS = studio_email membership = baker.make(Membership, name="membership1") # booking with no membership yet @@ -538,7 +557,12 @@ def test_webhook_subscription_updated_status_changed_to_active_from_incomplete( ) resp = client.post(webhook_url, data={}, HTTP_STRIPE_SIGNATURE="foo") assert resp.status_code == 200, resp.content - assert len(mail.outbox) == 1 + if studio_email: + assert len(mail.outbox) == 2 + assert "A new membership has been set up" in mail.outbox[1].subject + assert mail.outbox[1].to == [settings.DEFAULT_STUDIO_EMAIL] + else: + assert len(mail.outbox) == 1 assert "Your membership has been set up" in mail.outbox[0].subject user_membership.refresh_from_db() assert user_membership.subscription_status == "active"