diff --git a/downloads/tests/test_models.py b/downloads/tests/test_models.py index b89b2ecce..1c8e9ba47 100644 --- a/downloads/tests/test_models.py +++ b/downloads/tests/test_models.py @@ -1,3 +1,5 @@ +import datetime as dt + from ..models import Release, ReleaseFile from .base import BaseDownloadTests @@ -56,6 +58,22 @@ def test_python3(self): self.assertIn(self.hidden_release, versions) self.assertIn(self.pre_release, versions) + def test_latest_python3(self): + latest_3 = Release.objects.latest_python3() + self.assertEqual(latest_3, self.python_3) + self.assertNotEqual(latest_3, self.python_3_10_18) + + latest_3_10 = Release.objects.latest_python3(minor_version=10) + self.assertEqual(latest_3_10, self.python_3) + self.assertNotEqual(latest_3_10, self.python_3_10_18) + + latest_3_8 = Release.objects.latest_python3(minor_version=8) + self.assertEqual(latest_3_8, self.python_3_8_20) + self.assertNotEqual(latest_3_8, self.python_3_8_19) + + latest_3_99 = Release.objects.latest_python3(minor_version=99) + self.assertIsNone(latest_3_99) + def test_get_version(self): self.assertEqual(self.release_275.name, 'Python 2.7.5') self.assertEqual(self.release_275.get_version(), '2.7.5') diff --git a/downloads/tests/test_views.py b/downloads/tests/test_views.py index c42572d13..1fbb687d0 100644 --- a/downloads/tests/test_views.py +++ b/downloads/tests/test_views.py @@ -82,6 +82,19 @@ def test_latest_redirects(self): response = self.client.get(url) self.assertRedirects(response, latest_python3.get_absolute_url()) + def test_latest_python3x_redirects(self): + url = reverse("download:download_latest_python3x", kwargs={"minor": "10"}) + response = self.client.get(url) + self.assertRedirects(response, self.python_3.get_absolute_url()) + + url = reverse("download:download_latest_python3x", kwargs={"minor": "8"}) + response = self.client.get(url) + self.assertRedirects(response, self.python_3_8_20.get_absolute_url()) + + url = reverse("download:download_latest_python3x", kwargs={"minor": "99"}) + response = self.client.get(url) + self.assertRedirects(response, reverse("download:download")) + def test_redirect_page_object_to_release_detail_page(self): self.release_275.release_page = None self.release_275.save() diff --git a/downloads/urls.py b/downloads/urls.py index 4b2d573bf..75dcef211 100644 --- a/downloads/urls.py +++ b/downloads/urls.py @@ -5,7 +5,7 @@ urlpatterns = [ re_path(r'latest/python2/?$', views.DownloadLatestPython2.as_view(), name='download_latest_python2'), re_path(r'latest/python3/?$', views.DownloadLatestPython3.as_view(), name='download_latest_python3'), - re_path(r'latest/python3\.(?P\d+)/?$', views.DownloadLatestPython3x.as_view(), name='download_latest_python3x'), + re_path(r'latest/python3\.(?P\d+)/?$', views.DownloadLatestPython3.as_view(), name='download_latest_python3x'), re_path(r'latest/pymanager/?$', views.DownloadLatestPyManager.as_view(), name='download_latest_pymanager'), re_path(r'latest/?$', views.DownloadLatestPython3.as_view(), name='download_latest_python3'), path('operating-systems/', views.DownloadFullOSList.as_view(), name='download_full_os_list'), diff --git a/downloads/views.py b/downloads/views.py index 5d8da9461..1d69a234c 100644 --- a/downloads/views.py +++ b/downloads/views.py @@ -30,40 +30,21 @@ def get_redirect_url(self, **kwargs): class DownloadLatestPython3(RedirectView): - """ Redirect to latest Python 3 release """ - permanent = False - - def get_redirect_url(self, **kwargs): - try: - latest_python3 = Release.objects.latest_python3() - except Release.DoesNotExist: - latest_python3 = None + """Redirect to latest Python 3 release, optionally for a specific minor""" - if latest_python3: - return latest_python3.get_absolute_url() - else: - return reverse('download') - - -class DownloadLatestPython3x(RedirectView): - """ Redirect to latest Python 3.x release for a specific minor version """ permanent = False def get_redirect_url(self, **kwargs): minor_version = kwargs.get('minor') - if not minor_version: - return reverse('downloads:download') - try: - minor_version_int = int(minor_version) + minor_version_int = int(minor_version) if minor_version else None latest_release = Release.objects.latest_python3(minor_version_int) except (ValueError, Release.DoesNotExist): latest_release = None if latest_release: return latest_release.get_absolute_url() - else: - return reverse('downloads:download') + return reverse("downloads:download") class DownloadLatestPyManager(RedirectView):