From d41a12a77d2830e62a1d0f7bc0ca525e8b8aaa76 Mon Sep 17 00:00:00 2001 From: Pujan Thapa Date: Tue, 24 Feb 2026 14:54:54 +0100 Subject: [PATCH 1/4] Fix #2645: Add permanent redirects for legacy sponsorship pages --- pydotorg/tests/test_views.py | 8 ++++++++ pydotorg/urls.py | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pydotorg/tests/test_views.py b/pydotorg/tests/test_views.py index b21c54b57..5f9387b1c 100644 --- a/pydotorg/tests/test_views.py +++ b/pydotorg/tests/test_views.py @@ -34,3 +34,11 @@ def test_download_index(self): self.assertContains(response, "Browse Python 3.6.0 Documentation") self.assertContains(response, "https://docs.python.org/3/whatsnew/3.6.html") self.assertContains(response, "What's new in Python 3.6") + + def test_legacy_sponsor_redirects(self): + """Test that old sponsorship pages correctly redirect to modern active ones.""" + response = self.client.get("/psf/sponsorship-old/") + self.assertRedirects(response, "/psf/sponsors/", status_code=301) + + response = self.client.get("/psf/forms/sponsor-application/") + self.assertRedirects(response, "/sponsors/application/", status_code=301) diff --git a/pydotorg/urls.py b/pydotorg/urls.py index 3cb9f32ea..e91f08852 100644 --- a/pydotorg/urls.py +++ b/pydotorg/urls.py @@ -5,7 +5,7 @@ from django.contrib import admin from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.urls import include, path, re_path -from django.views.generic.base import TemplateView +from django.views.generic.base import RedirectView, TemplateView from apps.cms.views import custom_404 from apps.downloads.views import ReleaseEditButton @@ -35,6 +35,14 @@ path("blogs/", include("apps.blogs.urls")), path("inner/", TemplateView.as_view(template_name="python/inner.html"), name="inner"), # other section landing pages + path( + "psf/sponsorship-old/", + RedirectView.as_view(url="/psf/sponsors/", permanent=True), + ), + path( + "psf/forms/sponsor-application/", + RedirectView.as_view(url="/sponsors/application/", permanent=True), + ), path("psf-landing/", TemplateView.as_view(template_name="psf/index.html"), name="psf-landing"), path("psf/sponsors/", TemplateView.as_view(template_name="psf/sponsors-list.html"), name="psf-sponsors"), path("docs-landing/", TemplateView.as_view(template_name="docs/index.html"), name="docs-landing"), From 2b3ff5768ac5b5f438309a7a189ea0176460b0af Mon Sep 17 00:00:00 2001 From: Pujan Thapa Date: Tue, 10 Mar 2026 09:08:16 +0545 Subject: [PATCH 2/4] Fix #2645: Add permanent redirects for legacy sponsorship pages Address Copilot PR feedback: use url patterns and reverse for sponsors redirects --- pydotorg/tests/test_views.py | 14 ++++++++++++-- pydotorg/urls.py | 4 ++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pydotorg/tests/test_views.py b/pydotorg/tests/test_views.py index 5f9387b1c..440e68792 100644 --- a/pydotorg/tests/test_views.py +++ b/pydotorg/tests/test_views.py @@ -38,7 +38,17 @@ def test_download_index(self): def test_legacy_sponsor_redirects(self): """Test that old sponsorship pages correctly redirect to modern active ones.""" response = self.client.get("/psf/sponsorship-old/") - self.assertRedirects(response, "/psf/sponsors/", status_code=301) + self.assertRedirects( + response, + reverse("psf-sponsors"), + status_code=301, + fetch_redirect_response=False, + ) response = self.client.get("/psf/forms/sponsor-application/") - self.assertRedirects(response, "/sponsors/application/", status_code=301) + self.assertRedirects( + response, + reverse("new_sponsorship_application"), + status_code=301, + fetch_redirect_response=False, + ) diff --git a/pydotorg/urls.py b/pydotorg/urls.py index e91f08852..018bb652b 100644 --- a/pydotorg/urls.py +++ b/pydotorg/urls.py @@ -37,11 +37,11 @@ # other section landing pages path( "psf/sponsorship-old/", - RedirectView.as_view(url="/psf/sponsors/", permanent=True), + RedirectView.as_view(pattern_name="psf-sponsors", permanent=True), ), path( "psf/forms/sponsor-application/", - RedirectView.as_view(url="/sponsors/application/", permanent=True), + RedirectView.as_view(pattern_name="new_sponsorship_application", permanent=True), ), path("psf-landing/", TemplateView.as_view(template_name="psf/index.html"), name="psf-landing"), path("psf/sponsors/", TemplateView.as_view(template_name="psf/sponsors-list.html"), name="psf-sponsors"), From f1a3280175b47d55711bda91a2a2bae0ab6de220 Mon Sep 17 00:00:00 2001 From: Pujan Thapa Date: Thu, 6 Aug 2026 10:30:38 +0200 Subject: [PATCH 3/4] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- pydotorg/tests/test_views.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/pydotorg/tests/test_views.py b/pydotorg/tests/test_views.py index 440e68792..997b60f39 100644 --- a/pydotorg/tests/test_views.py +++ b/pydotorg/tests/test_views.py @@ -37,18 +37,17 @@ def test_download_index(self): def test_legacy_sponsor_redirects(self): """Test that old sponsorship pages correctly redirect to modern active ones.""" - response = self.client.get("/psf/sponsorship-old/") - self.assertRedirects( - response, - reverse("psf-sponsors"), - status_code=301, - fetch_redirect_response=False, + redirect_cases = ( + ("/psf/sponsorship-old/", "psf-sponsors"), + ("/psf/forms/sponsor-application/", "new_sponsorship_application"), ) - response = self.client.get("/psf/forms/sponsor-application/") - self.assertRedirects( - response, - reverse("new_sponsorship_application"), - status_code=301, - fetch_redirect_response=False, - ) + for source_path, target_name in redirect_cases: + with self.subTest(source_path=source_path, target_name=target_name): + response = self.client.get(source_path) + self.assertRedirects( + response, + reverse(target_name), + status_code=301, + fetch_redirect_response=False, + ) From 539e36d781f334e152d3d51e18894353ed203f41 Mon Sep 17 00:00:00 2001 From: Pujan Thapa Date: Thu, 6 Aug 2026 10:31:16 +0200 Subject: [PATCH 4/4] Update pydotorg/urls.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- pydotorg/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pydotorg/urls.py b/pydotorg/urls.py index 018bb652b..5cbeab864 100644 --- a/pydotorg/urls.py +++ b/pydotorg/urls.py @@ -37,7 +37,7 @@ # other section landing pages path( "psf/sponsorship-old/", - RedirectView.as_view(pattern_name="psf-sponsors", permanent=True), + RedirectView.as_view(url="/psf/sponsorship/", permanent=True), ), path( "psf/forms/sponsor-application/",