Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions downloads/tests/test_models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import datetime as dt

from ..models import Release, ReleaseFile
from .base import BaseDownloadTests

Expand Down Expand Up @@ -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')
Expand Down
13 changes: 13 additions & 0 deletions downloads/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
2 changes: 1 addition & 1 deletion downloads/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -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<minor>\d+)/?$', views.DownloadLatestPython3x.as_view(), name='download_latest_python3x'),
re_path(r'latest/python3\.(?P<minor>\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'),
Expand Down
25 changes: 3 additions & 22 deletions downloads/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down