From 885f575320911f1403248ffe61aa20d5163d16c6 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Wed, 21 Oct 2026 18:28:25 +0300 Subject: [PATCH] Don't show unpublished releases as superseded --- apps/downloads/tests/test_views.py | 15 +++++++++++++++ apps/downloads/views.py | 5 +++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/apps/downloads/tests/test_views.py b/apps/downloads/tests/test_views.py index f7f86129c..b5eb75246 100644 --- a/apps/downloads/tests/test_views.py +++ b/apps/downloads/tests/test_views.py @@ -1,3 +1,4 @@ +import datetime as dt from unittest import mock from django.conf import settings @@ -82,6 +83,20 @@ def test_download_release_detail_superseded(self): self.assertContains(response, "has been superseded by") self.assertContains(response, latest_release.name) + def test_download_release_detail_draft_not_superseded(self): + """Test that an unpublished (draft) release does not show a superseded notice.""" + draft = Release.objects.create( + version=Release.PYTHON3, + name="Python 3.10.20", + is_published=False, + release_date=dt.datetime.fromisoformat("2025-12-02T00:00Z"), + ) + url = reverse("download:download_release_detail", kwargs={"release_slug": draft.slug}) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + self.assertNotIn("latest_in_series", response.context) + self.assertNotContains(response, "has been superseded by") + def test_download_os_list(self): url = reverse("download:download_os_list", kwargs={"slug": self.linux.slug}) response = self.client.get(url) diff --git a/apps/downloads/views.py b/apps/downloads/views.py index 01dd4a33d..d6c1a4c4c 100644 --- a/apps/downloads/views.py +++ b/apps/downloads/views.py @@ -239,9 +239,10 @@ def get_context_data(self, **kwargs): context["release_files"].extend(list(self.object.files.exclude(os__slug="source").order_by("os__slug", "name"))) # Find the latest release in the feature series (such as 3.14.x) - # to show a "superseded by" notice on older releases + # to show a "superseded by" notice on older releases. + # Unpublished (draft) releases are not yet out, so they can't be superseded. version = self.object.get_version() - if version and self.object.version == Release.PYTHON3: + if version and self.object.is_published and self.object.version == Release.PYTHON3: match = re.match(r"^3\.(\d+)", version) if match: minor_version = int(match.group(1))