Skip to content

Commit

Permalink
Email studio for new memberships
Browse files Browse the repository at this point in the history
  • Loading branch information
rebkwok committed Aug 26, 2024
1 parent 2829604 commit a518728
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 6 deletions.
2 changes: 2 additions & 0 deletions pipsevents/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
17 changes: 15 additions & 2 deletions stripe_payments/emails.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
)
Expand All @@ -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
)

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{% extends 'email_base.html' %}

{% block messagecontent %}
<p>A new membership has been set up:</p>
<p><strong>Membership:</strong> {{ user_membership.membership.name }}</p>
<p><strong>User:</strong> {{ user_membership.user.first_name }} {{ user_membership.user.last_name }}</p>
<p><strong>Start date:</strong> {{ user_membership.start_date|date:'d M Y' }}</p>
{% endblock %}
Original file line number Diff line number Diff line change
@@ -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' }}
32 changes: 28 additions & 4 deletions stripe_payments/tests/test_stripe_webhook_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit a518728

Please sign in to comment.