From 3752fa15e803524451890b7b1d77829556d6a3b5 Mon Sep 17 00:00:00 2001
From: chenzichan <1532886617@qq.com>
Date: Thu, 23 Oct 2025 17:59:34 +0800
Subject: [PATCH 1/7] Fix PSF membership link (#2787) with dynamic logic
---
templates/includes/authenticated.html | 15 ++++++++++-
users/tests/test_membership_links.py | 36 +++++++++++++++++++++++++++
2 files changed, 50 insertions(+), 1 deletion(-)
create mode 100644 users/tests/test_membership_links.py
diff --git a/templates/includes/authenticated.html b/templates/includes/authenticated.html
index 82d5b38f6..a0bf3fedb 100644
--- a/templates/includes/authenticated.html
+++ b/templates/includes/authenticated.html
@@ -7,7 +7,20 @@
Edit your user profile
Change your password
{% if request.user.has_membership %}
- Edit your PSF Basic membership
+
+
+ {% if user.is_authenticated %}
+ {% if user.has_membership %}
+ Edit your membership
+ {% else %}
+ Join PSF Membership
+ {% endif %}
+ {% else %}
+
+ Login to manage membership
+
+ {% endif %}
+
{% else %}
Become a PSF Basic member
{% endif %}
diff --git a/users/tests/test_membership_links.py b/users/tests/test_membership_links.py
new file mode 100644
index 000000000..234832c65
--- /dev/null
+++ b/users/tests/test_membership_links.py
@@ -0,0 +1,36 @@
+from django.test import TestCase, RequestFactory
+from django.template import Context, Template
+from django.contrib.auth import get_user_model
+from django.contrib.auth.models import AnonymousUser
+from users.models import Membership
+
+User = get_user_model()
+
+class MembershipLinkTests(TestCase):
+
+ def setUp(self):
+ self.factory = RequestFactory()
+ self.user = User.objects.create_user(username='testuser', password='123')
+ self.template = Template("""
+ {% include 'includes/authenticated.html' %}
+ """)
+
+ def render_template(self, user):
+ request = self.factory.get('/')
+ request.user = user
+ return self.template.render(Context({'user': user, 'request': request}))
+
+ def test_anonymous_user(self):
+ html = self.render_template(AnonymousUser())
+ # Anonymous users should see "Sign In"
+ self.assertIn('Sign In', html)
+
+ def test_logged_in_non_member(self):
+ html = self.render_template(self.user)
+ # Logged-in but not a member -> should see the membership join link
+ self.assertIn('Become a PSF Basic member', html)
+
+ def test_logged_in_member(self):
+ Membership.objects.create(creator=self.user)
+ html = self.render_template(self.user)
+ self.assertIn('Edit your PSF Basic membership', html)
From c502c3008989ea382c0e0c88914257dade5f762c Mon Sep 17 00:00:00 2001
From: Chen Zichan <139482965+czc0407@users.noreply.github.com>
Date: Thu, 23 Oct 2025 19:39:11 +0800
Subject: [PATCH 2/7] Update templates/includes/authenticated.html
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
---
templates/includes/authenticated.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/templates/includes/authenticated.html b/templates/includes/authenticated.html
index a0bf3fedb..4f2259b86 100644
--- a/templates/includes/authenticated.html
+++ b/templates/includes/authenticated.html
@@ -13,7 +13,7 @@
{% if user.has_membership %}
Edit your membership
{% else %}
- Join PSF Membership
+ Join the PSF
{% endif %}
{% else %}
From 1783b27b2e97878adb667485473686417b6b453d Mon Sep 17 00:00:00 2001
From: Chen Zichan <139482965+czc0407@users.noreply.github.com>
Date: Thu, 23 Oct 2025 19:39:21 +0800
Subject: [PATCH 3/7] Update templates/includes/authenticated.html
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
---
templates/includes/authenticated.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/templates/includes/authenticated.html b/templates/includes/authenticated.html
index 4f2259b86..7698dce20 100644
--- a/templates/includes/authenticated.html
+++ b/templates/includes/authenticated.html
@@ -17,7 +17,7 @@
{% endif %}
{% else %}
- Login to manage membership
+ Log in to manage membership
{% endif %}
From 355ed4401f55ffd3349866d5a9a7507074c982ea Mon Sep 17 00:00:00 2001
From: Chen Zichan <139482965+czc0407@users.noreply.github.com>
Date: Thu, 23 Oct 2025 19:39:28 +0800
Subject: [PATCH 4/7] Update templates/includes/authenticated.html
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
---
templates/includes/authenticated.html | 1 -
1 file changed, 1 deletion(-)
diff --git a/templates/includes/authenticated.html b/templates/includes/authenticated.html
index 7698dce20..e7cb23106 100644
--- a/templates/includes/authenticated.html
+++ b/templates/includes/authenticated.html
@@ -8,7 +8,6 @@
Change your password
{% if request.user.has_membership %}
-
{% if user.is_authenticated %}
{% if user.has_membership %}
Edit your membership
From 16c307b3260f3e43bc2f57e65ad721352d5c3c2c Mon Sep 17 00:00:00 2001
From: chenzichan <1532886617@qq.com>
Date: Thu, 23 Oct 2025 21:15:22 +0800
Subject: [PATCH 5/7] Fix: correct membership link text to match expected test
string
---
templates/includes/authenticated.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/templates/includes/authenticated.html b/templates/includes/authenticated.html
index e7cb23106..662872a27 100644
--- a/templates/includes/authenticated.html
+++ b/templates/includes/authenticated.html
@@ -10,7 +10,7 @@
{% if user.is_authenticated %}
{% if user.has_membership %}
- Edit your membership
+ Edit your PSF Basic membership
{% else %}
Join the PSF
{% endif %}
From df1830210cc02cd7a5874e14728ce7db69161265 Mon Sep 17 00:00:00 2001
From: chenzichan <1532886617@qq.com>
Date: Thu, 23 Oct 2025 21:38:29 +0800
Subject: [PATCH 6/7] chore: ignore virtual environment
---
.gitignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.gitignore b/.gitignore
index a9eca9d19..e694f1a17 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,3 +27,4 @@ __pycache__
.DS_Store
.envrc
.state/
+venv*/
From f4d5a5806c36e80f988ec86b60804818624c84f3 Mon Sep 17 00:00:00 2001
From: Jacob Coffee
Date: Tue, 4 Nov 2025 11:15:54 -0600
Subject: [PATCH 7/7] Update .gitignore
---
.gitignore | 1 -
1 file changed, 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index e694f1a17..a9eca9d19 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,4 +27,3 @@ __pycache__
.DS_Store
.envrc
.state/
-venv*/