diff --git a/readthedocs/core/views/serve.py b/readthedocs/core/views/serve.py index 6c828dc5011..245b0bba137 100644 --- a/readthedocs/core/views/serve.py +++ b/readthedocs/core/views/serve.py @@ -155,8 +155,9 @@ def serve_docs( try: version = project.versions.public(request.user).get(slug=version_slug) except Version.DoesNotExist: - # Properly raise a 404 if the version doesn't exist & a 401 if it does - if project.versions.filter(slug=version_slug).exists(): + # Properly raise a 404 if the version doesn't exist (or is inactive) and + # a 401 if it does + if project.versions.filter(slug=version_slug, active=True).exists(): return _serve_401(request, project) raise Http404('Version does not exist.') filename = resolve_path( diff --git a/readthedocs/rtd_tests/tests/test_redirects.py b/readthedocs/rtd_tests/tests/test_redirects.py index a4611b34f77..7595d147568 100644 --- a/readthedocs/rtd_tests/tests/test_redirects.py +++ b/readthedocs/rtd_tests/tests/test_redirects.py @@ -1,5 +1,4 @@ from __future__ import absolute_import -from django.core.urlresolvers import reverse from django.http import Http404 from django.test import TestCase from django.test.utils import override_settings @@ -9,6 +8,7 @@ from mock import patch from readthedocs.builds.constants import LATEST +from readthedocs.builds.models import Version from readthedocs.projects.models import Project from readthedocs.redirects.models import Redirect @@ -185,6 +185,31 @@ def test_redirect_exact_with_rest(self): self.assertEqual( r['Location'], 'http://pip.readthedocs.org/en/master/guides/install.html') + @override_settings(USE_SUBDOMAIN=True) + def test_redirect_inactive_version(self): + """ + Inactive Version (``active=False``) should redirect properly. + + The function that servers the page should return 404 when serving a page + of an inactive version and the redirect system should work. + """ + version = get( + Version, + slug='oldversion', + project=self.pip, + active=False, + ) + Redirect.objects.create( + project=self.pip, + redirect_type='exact', + from_url='/en/oldversion/', + to_url='/en/newversion/', + ) + r = self.client.get('/en/oldversion/', HTTP_HOST='pip.readthedocs.org') + self.assertEqual(r.status_code, 302) + self.assertEqual( + r['Location'], 'http://pip.readthedocs.org/en/newversion/') + @override_settings(USE_SUBDOMAIN=True) def test_redirect_keeps_version_number(self): Redirect.objects.create(