Skip to content

Commit

Permalink
Redirect /download/releases/X.Y.Z to /downloads/release/python-XYZ
Browse files Browse the repository at this point in the history
Also, migrate content in the former into the latter.

Fixes #956
  • Loading branch information
berkerpeksag committed Sep 23, 2017
1 parent 63c67f3 commit dbd9d71
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 2 deletions.
53 changes: 53 additions & 0 deletions downloads/migrations/0005_move_release_page_content.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2017-09-23 10:13
from __future__ import unicode_literals

from django.db import migrations

MARKER = '.. Migrated from Release.release_page field.\n\n'


def migrate_old_content(apps, schema_editor):
Release = apps.get_model('downloads', 'Release')
db_alias = schema_editor.connection.alias
releases = Release.objects.using(db_alias).filter(
release_page__isnull=False,
)
for release in releases:
content = '\n'.join(release.release_page.content.raw.splitlines()[3:])
release.content = MARKER + content
release.release_page = None
release.save()


def delete_migrated_content(apps, schema_editor):
Release = apps.get_model('downloads', 'Release')
Page = apps.get_model('pages', 'Page')
db_alias = schema_editor.connection.alias
releases = Release.objects.using(db_alias).filter(
release_page__isnull=True,
content__startswith=MARKER,
)
for release in releases:
try:
name = release.name
if 'Release' not in name:
name = release.name + ' Release'
page = Page.objects.get(title=name)
except (Page.DoesNotExist, Page.MultipleObjectsReturned):
continue
else:
release.release_page = page
release.content = ''
release.save()


class Migration(migrations.Migration):

dependencies = [
('downloads', '0004_auto_20170821_2000'),
]

operations = [
migrations.RunPython(migrate_old_content, delete_migrated_content),
]
2 changes: 1 addition & 1 deletion downloads/tests/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class BaseDownloadTests(DownloadMixin):

def setUp(self):
self.release_275_page = Page.objects.create(
title='Python 2.7.5',
title='Python 2.7.5 Release',
path='download/releases/2.7.5',
content='whatever',
is_published=True,
Expand Down
15 changes: 14 additions & 1 deletion downloads/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
}


class DownloadViewsTests(BaseDownloadTests):
class DownloadViewsTests(BaseDownloadTests, TestCase):
def test_download_full_os_list(self):
url = reverse('download:download_full_os_list')
response = self.client.get(url)
Expand Down Expand Up @@ -64,6 +64,19 @@ def test_latest_redirects(self):
response = self.client.get(url)
self.assertRedirects(response, latest_python3.get_absolute_url())

def test_redirect_page_object_to_release_detail_page(self):
self.release_275.release_page = None
self.release_275.save()
response = self.client.get(self.release_275_page.get_absolute_url())
self.assertRedirects(
response,
reverse(
'download:download_release_detail',
kwargs={'release_slug': self.release_275.slug},
),
status_code=301,
)


class RegressionTests(DownloadMixin, TestCase):
"""These tests are for bugs found by Sentry."""
Expand Down
26 changes: 26 additions & 0 deletions pages/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import re

from django.http import HttpResponsePermanentRedirect
from django.urls import reverse
from django.views.generic import DetailView

from downloads.models import Release
from .models import Page


Expand Down Expand Up @@ -37,3 +42,24 @@ def get_extra_context(self, *args, **kwargs):
context = self.super().get_extra_context(*args, **kwargs)
context['in_pages_app'] = True
return context

def get(self, request, *args, **kwargs):
# Redirect '/download/releases/X.Y.Z' to
# '/downloads/release/python-XYZ/' if the latter URL doesn't have
# 'release_page' (which points to the former URL) field set.
# See #956 for details.
matched = re.match(r'/download/releases/([\d.]+)/$', self.request.path)
if matched is not None:
release_slug = 'python-{}'.format(matched.group(1).replace('.', ''))
try:
Release.objects.get(slug=release_slug, release_page__isnull=True)
except Release.DoesNotExist:
pass
else:
return HttpResponsePermanentRedirect(
reverse(
'download:download_release_detail',
kwargs={'release_slug': release_slug},
)
)
return super().get(request, *args, **kwargs)

0 comments on commit dbd9d71

Please sign in to comment.