Skip to content

Commit fcee4fe

Browse files
committed
chore: centralize and improve subscription state logic
1 parent d1f5a34 commit fcee4fe

8 files changed

Lines changed: 85 additions & 47 deletions

File tree

core/views.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@
4646

4747
from . import context_processors
4848
from .mixins import V3Mixin, iter_v3_views
49-
from mailing_list.mixins import MailingListCardMixin
49+
from mailing_list.mixins import (
50+
MailingListCardMixin,
51+
get_subscription_state_count_and_email,
52+
)
5053
from .asciidoc import convert_adoc_to_html
5154
from .boostrenderer import (
5255
convert_img_paths,
@@ -2230,14 +2233,30 @@ def get_context_data(self, **kwargs):
22302233
context["demo_quick_subscribe_url"] = self.request.build_absolute_uri(
22312234
reverse("mailing-list-quick-subscribe")
22322235
)
2233-
context["demo_subscribed_lists"] = set(
2234-
UserMailingListSubscription.objects.filter(
2235-
user=self.request.user, list_id__in=_settings.MAILMAN_LISTS
2236-
).values_list("list_id", flat=True)
2237-
)
2236+
2237+
mailing_list_state = None
2238+
2239+
if self.request.user.is_authenticated:
2240+
mailing_list_state = get_subscription_state_count_and_email(
2241+
self.request.user, _settings.MAILMAN_LISTS
2242+
)
2243+
context["demo_subscribed_lists"] = set(
2244+
UserMailingListSubscription.objects.filter(
2245+
user=self.request.user, list_id__in=_settings.MAILMAN_LISTS
2246+
).values_list("list_id", flat=True)
2247+
)
2248+
else:
2249+
context["demo_subscribed_lists"] = set()
2250+
2251+
print(f"\n\n\n\n\n{mailing_list_state}\n\n\n\n\n")
2252+
22382253
context["demo_mailing_list_card_list_id"] = _demo_card_list_id
2239-
context["demo_mailing_list_card_is_subscribed"] = (
2240-
_demo_card_list_id in context["demo_subscribed_lists"]
2254+
context["demo_mailing_list_card_state"] = mailing_list_state[0]
2255+
context["demo_subscription_count"] = (
2256+
mailing_list_state[1] if mailing_list_state else 0
2257+
)
2258+
context["demo_subscribed_lists_email"] = (
2259+
mailing_list_state[2] if mailing_list_state else ""
22412260
)
22422261
# V3 paths registry
22432262
v3_paths = [

mailing_list/mixins.py

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Union, Tuple
2+
13
from django.conf import settings
24
from django.urls import reverse
35

@@ -7,16 +9,50 @@
79
_DEFAULT_LIST_ID = "boost.lists.boost.org"
810

911

12+
def get_subscription_state_count_and_email(
13+
user, list_ids
14+
) -> Tuple[Union[str, None], int, Union[str, None]]:
15+
"""Return the subscription state for a single user/list pair.
16+
17+
Returns:
18+
"pending" — a subscription record exists with PENDING status
19+
"active" — a subscription record exists with ACTIVE status
20+
None — user is not authenticated or has no subscription for list_id
21+
"""
22+
if not user.is_authenticated:
23+
return None, 0, None
24+
25+
subscriptions = list(
26+
UserMailingListSubscription.objects.filter(user=user, list_id__in=list_ids)
27+
)
28+
29+
pending_subs = [
30+
sub for sub in subscriptions if sub.status == SubscriptionStatus.PENDING
31+
]
32+
pending_count = len(pending_subs)
33+
34+
active_subs = [
35+
sub for sub in subscriptions if sub.status == SubscriptionStatus.ACTIVE
36+
]
37+
active_count = len(active_subs)
38+
39+
if pending_count > 0:
40+
return SubscriptionStatus.PENDING, pending_count, subscriptions[0].email
41+
elif active_count > 0:
42+
return SubscriptionStatus.ACTIVE, active_count, subscriptions[0].email
43+
else:
44+
return None, 0, None
45+
46+
1047
class MailingListCardMixin:
1148
"""Injects mailing-list card context into any class-based view.
1249
1350
Adds the variables needed by v3/includes/_mailing_list_card.html:
1451
mailing_list_card_subscribe_url
1552
mailing_list_card_list_id
16-
mailing_list_card_state (authenticated users only — "pending" or None)
17-
mailing_list_card_user_email (authenticated users only)
18-
mailing_list_card_is_subscribed (authenticated users only — True only when ACTIVE)
19-
mailing_list_card_manage_url (authenticated users only)
53+
mailing_list_card_state ("pending", "active", or None)
54+
mailing_list_card_user_email (authenticated users only)
55+
mailing_list_card_manage_url (authenticated users only)
2056
mailing_list_card_subscription_count (authenticated users only — ACTIVE count only)
2157
"""
2258

@@ -31,31 +67,11 @@ def get_context_data(self, **kwargs):
3167

3268
if request.user.is_authenticated:
3369
managed_lists = set(settings.MAILMAN_LISTS)
34-
subscription = UserMailingListSubscription.objects.filter(
35-
user=request.user, list_id=_DEFAULT_LIST_ID
36-
).first()
37-
38-
is_subscribed = False
39-
card_state = None
40-
user_email = ""
41-
42-
if subscription:
43-
user_email = subscription.email or ""
44-
if subscription.status == SubscriptionStatus.ACTIVE:
45-
is_subscribed = True
46-
else:
47-
card_state = "pending"
48-
49-
context["mailing_list_card_is_subscribed"] = is_subscribed
50-
context["mailing_list_card_state"] = card_state
51-
context["mailing_list_card_user_email"] = user_email
52-
context["mailing_list_card_subscription_count"] = (
53-
UserMailingListSubscription.objects.filter(
54-
user=request.user,
55-
list_id__in=managed_lists,
56-
status=SubscriptionStatus.ACTIVE,
57-
).count()
58-
)
70+
state = get_subscription_state_count_and_email(request.user, managed_lists)
71+
72+
context["mailing_list_card_state"] = state[0]
73+
context["mailing_list_card_subscription_count"] = state[1]
74+
context["mailing_list_card_user_email"] = state[2]
5975
context["mailing_list_card_manage_url"] = request.build_absolute_uri(
6076
reverse("profile-account")
6177
)

templates/v3/community.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
{% include "v3/includes/_post_card.html" with heading="Posts from the Boost community" items=posts variant="card" theme="teal" primary_cta_label="View all posts" primary_cta_url=news_url %}
3939
</div>
4040
<div class="community-masonry__cell community-masonry__cell--mailing">
41-
{% include "v3/includes/_mailing_list_card.html" with subscribe_url=mailing_list_card_subscribe_url list_id=mailing_list_card_list_id is_subscribed=mailing_list_card_is_subscribed state=mailing_list_card_state user_email=mailing_list_card_user_email manage_url=mailing_list_card_manage_url subscription_count=mailing_list_card_subscription_count %}
41+
{% include "v3/includes/_mailing_list_card.html" with subscribe_url=mailing_list_card_subscribe_url list_id=mailing_list_card_list_id state=mailing_list_card_state user_email=mailing_list_card_user_email manage_url=mailing_list_card_manage_url subscription_count=mailing_list_card_subscription_count %}
4242
</div>
4343
</div>
4444
</div>

templates/v3/examples/_v3_example_section.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ <h3>{{ section_title }}</h3>
608608
{% with section_title="Mailing List Card" %}
609609
<div class="v3-examples-section__block" id="{{ section_title|slugify }}">
610610
<h3>{{ section_title }}</h3>
611-
<div class="v3-examples-section__example-box">{% include "v3/includes/_mailing_list_card.html" with subscribe_url=demo_quick_subscribe_url list_id=demo_mailing_list_card_list_id is_subscribed=demo_mailing_list_card_is_subscribed user_email=request.user.email %}</div>
611+
<div class="v3-examples-section__example-box">{% include "v3/includes/_mailing_list_card.html" with subscribe_url=demo_quick_subscribe_url list_id=demo_mailing_list_card_list_id state=demo_mailing_list_card_state user_email=demo_subscribed_lists_email subscription_count=demo_subscription_count %}</div>
612612
</div>
613613
{% endwith %}
614614

templates/v3/includes/_mailing_list_card.html

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
Variables:
44
subscribe_url — (required) POST endpoint; build via request.build_absolute_uri(reverse("mailing-list-quick-subscribe"))
55
list_id — (optional) mailing list ID; defaults to "boost.lists.boost.org"
6-
is_subscribed — (optional) whether the current user is already subscribed to list_id
6+
state — "active" | "pending" | "error" | None
7+
"active" — user is subscribed; shows success card
8+
"pending" — confirmation email sent; shows pending card
9+
"error" — form submission failed; shows form with error_message
10+
None — default; shows subscribe form
711
user_email — (optional) email used in the subscription
8-
manage_url — (optional) URL for managing subscriptions; shown in success card
12+
manage_url — (optional) URL for managing subscriptions; shown in success/pending card
913
subscription_count — (optional) number of lists subscribed to; shown in success card
10-
state — (internal) "error" | "pending" when re-rendered by the view
11-
error_message — (internal) error text shown when state="error"
14+
error_message — error text shown when state="error"
1215
{% endcomment %}
13-
{% if is_subscribed %}
16+
{% if state == "active" %}
1417
{% include "v3/mailing_list/_subscribe_success_card.html" with email=user_email manage_url=manage_url subscription_count=subscription_count only %}
1518
{% elif state == "pending" %}
1619
<div class="basic-card card">

templates/v3/learn_page.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ <h1>Start anywhere. Learn everything. Build anything.</h1>
4949
{% endwith %}
5050
</div>
5151
<div class="item-e">
52-
{% include 'v3/includes/_mailing_list_card.html' with subscribe_url=mailing_list_card_subscribe_url list_id=mailing_list_card_list_id is_subscribed=mailing_list_card_is_subscribed state=mailing_list_card_state user_email=mailing_list_card_user_email manage_url=mailing_list_card_manage_url subscription_count=mailing_list_card_subscription_count %}
52+
{% include 'v3/includes/_mailing_list_card.html' with subscribe_url=mailing_list_card_subscribe_url list_id=mailing_list_card_list_id state=mailing_list_card_state user_email=mailing_list_card_user_email manage_url=mailing_list_card_manage_url subscription_count=mailing_list_card_subscription_count %}
5353
</div>
5454
</div>
5555
</div>

templates/v3/libraries/library-subpage.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
{% include "v3/includes/_post_card.html" with heading="Latest "|add:object.display_name|add:" posts" items=library_posts variant="card" theme="teal" layout="horizontal" primary_cta_label="View all posts" primary_cta_url="/news/" %}
5454
</div>
5555
<div class="item-b">
56-
{% include "v3/includes/_mailing_list_card.html" with subscribe_url=mailing_list_card_subscribe_url list_id=mailing_list_card_list_id is_subscribed=mailing_list_card_is_subscribed state=mailing_list_card_state user_email=mailing_list_card_user_email manage_url=mailing_list_card_manage_url subscription_count=mailing_list_card_subscription_count %}
56+
{% include "v3/includes/_mailing_list_card.html" with subscribe_url=mailing_list_card_subscribe_url list_id=mailing_list_card_list_id state=mailing_list_card_state user_email=mailing_list_card_user_email manage_url=mailing_list_card_manage_url subscription_count=mailing_list_card_subscription_count %}
5757
</div>
5858
</div>
5959

templates/v3/release_detail.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
{% endif %}
3535

3636
<section class="release-detail__bottom-cards" aria-label="Community and resources">
37-
{% include "v3/includes/_mailing_list_card.html" with subscribe_url=mailing_list_card_subscribe_url list_id=mailing_list_card_list_id is_subscribed=mailing_list_card_is_subscribed state=mailing_list_card_state user_email=mailing_list_card_user_email manage_url=mailing_list_card_manage_url subscription_count=mailing_list_card_subscription_count %}
37+
{% include "v3/includes/_mailing_list_card.html" with subscribe_url=mailing_list_card_subscribe_url list_id=mailing_list_card_list_id state=mailing_list_card_state user_email=mailing_list_card_user_email manage_url=mailing_list_card_manage_url subscription_count=mailing_list_card_subscription_count %}
3838

3939
{% include "v3/includes/_basic_card.html" with title="Want to fix bugs, review code, maintain libraries, and propose new features?" text="Read our contributors guide and join the Boost community." primary_button_url="/contribute" primary_button_label="Start here" primary_button_style="green" theme="green" only %}
4040
{% large_static 'img/v3/home-page/heros.png' as image_url %}

0 commit comments

Comments
 (0)