Skip to content

Commit b51e4f8

Browse files
authored
Add 'superseded by' notice to older Python 3 releases (#2827)
1 parent 652484d commit b51e4f8

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

downloads/tests/test_views.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,37 @@ def test_download_release_detail(self):
4646
response = self.client.get(url)
4747
self.assertEqual(response.status_code, 404)
4848

49+
def test_download_release_detail_not_superseded(self):
50+
"""Test that latest releases and Python 2 do not show a superseded notice."""
51+
for release in [self.python_3, self.python_3_8_20, self.release_275]:
52+
with self.subTest(release=release.name):
53+
url = reverse(
54+
"download:download_release_detail",
55+
kwargs={"release_slug": release.slug},
56+
)
57+
response = self.client.get(url)
58+
self.assertEqual(response.status_code, 200)
59+
self.assertNotIn("latest_in_series", response.context)
60+
self.assertNotContains(response, "has been superseded by")
61+
62+
def test_download_release_detail_superseded(self):
63+
"""Test that older releases show a superseded notice."""
64+
tests = [
65+
(self.python_3_10_18, self.python_3),
66+
(self.python_3_8_19, self.python_3_8_20),
67+
]
68+
for old_release, latest_release in tests:
69+
with self.subTest(release=old_release.name):
70+
url = reverse(
71+
"download:download_release_detail",
72+
kwargs={"release_slug": old_release.slug},
73+
)
74+
response = self.client.get(url)
75+
self.assertEqual(response.status_code, 200)
76+
self.assertEqual(response.context["latest_in_series"], latest_release)
77+
self.assertContains(response, "has been superseded by")
78+
self.assertContains(response, latest_release.name)
79+
4980
def test_download_os_list(self):
5081
url = reverse('download:download_os_list', kwargs={'slug': self.linux.slug})
5182
response = self.client.get(url)

downloads/views.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Any
22

3+
import re
34
from datetime import datetime
45

56
from django.db.models import Case, IntegerField, Prefetch, When
@@ -216,6 +217,17 @@ def get_context_data(self, **kwargs):
216217
)
217218
)
218219

220+
# Find the latest release in the feature series (such as 3.14.x)
221+
# to show a "superseded by" notice on older releases
222+
version = self.object.get_version()
223+
if version and self.object.version == Release.PYTHON3:
224+
match = re.match(r"^3\.(\d+)", version)
225+
if match:
226+
minor_version = int(match.group(1))
227+
latest_in_series = Release.objects.latest_python3(minor_version)
228+
if latest_in_series and latest_in_series.pk != self.object.pk:
229+
context["latest_in_series"] = latest_in_series
230+
219231
return context
220232

221233

templates/downloads/release_detail.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@
2626
<h1 class="page-title">{{ release.name }}</h1>
2727
</header>
2828

29-
<p><strong>Release Date:</strong> {{ release.release_date|date }}</p>
29+
{% if latest_in_series %}
30+
<p><strong>Note:</strong> {{ release.name }} has been superseded by <a href="{{ latest_in_series.get_absolute_url }}">{{ latest_in_series.name }}</a>.</p>
31+
{% endif %}
32+
33+
<p><strong>Release date:</strong> {{ release.release_date|date }}</p>
3034

3135
{% if release.content.raw %}
3236
{{ release.content.rendered|safe }}

0 commit comments

Comments
 (0)