Skip to content

Commit 800f7b1

Browse files
authored
Merge pull request #2270 from rtfd/fix-subproject-lookup-with-alias
Fix subproject slug lookup with alias.
2 parents 4839fbc + 5e985cf commit 800f7b1

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

readthedocs/core/views/serve.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
from readthedocs.builds.models import Version
3434
from readthedocs.projects import constants
35-
from readthedocs.projects.models import Project
35+
from readthedocs.projects.models import Project, ProjectRelationship
3636
from readthedocs.core.symlink import PrivateSymlink, PublicSymlink
3737
from readthedocs.core.resolver import resolve, resolve_path
3838
from readthedocs.privacy.loader import AdminPermission
@@ -59,7 +59,15 @@ def inner_view(request, subproject=None, subproject_slug=None, *args, **kwargs):
5959
try:
6060
subproject = Project.objects.get(slug=subproject_slug)
6161
except Project.DoesNotExist:
62-
raise Http404
62+
try:
63+
# Depends on a project passed into kwargs
64+
rel = ProjectRelationship.objects.get(
65+
parent=kwargs['project'],
66+
alias=subproject_slug,
67+
)
68+
subproject = rel.child
69+
except (ProjectRelationship.DoesNotExist, KeyError):
70+
raise Http404
6371
return view_func(request, subproject=subproject, *args, **kwargs)
6472
return inner_view
6573

readthedocs/rtd_tests/tests/test_subprojects.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
import mock
2+
13
from django.test import TestCase
4+
from django.test.utils import override_settings
25
from django.contrib.auth.models import User
36

47
from readthedocs.projects.forms import SubprojectForm
58
from readthedocs.projects.models import Project
9+
from readthedocs.rtd_tests.utils import create_user
610

711
from django_dynamic_fixture import get
812

@@ -56,3 +60,33 @@ def test_admin_of_subproject_can_add_it(self):
5660
self.assertEqual(
5761
[r.child for r in project.subprojects.all()],
5862
[subproject])
63+
64+
65+
@override_settings(PUBLIC_DOMAIN='readthedocs.org')
66+
class ResolverBase(TestCase):
67+
68+
def setUp(self):
69+
with mock.patch('readthedocs.projects.models.broadcast'):
70+
with mock.patch('readthedocs.projects.models.update_static_metadata'):
71+
self.owner = create_user(username='owner', password='test')
72+
self.tester = create_user(username='tester', password='test')
73+
self.pip = get(Project, slug='pip', users=[self.owner], main_language_project=None)
74+
self.subproject = get(Project, slug='sub', language='ja', users=[
75+
self.owner], main_language_project=None)
76+
self.translation = get(Project, slug='trans', language='ja', users=[
77+
self.owner], main_language_project=None)
78+
self.pip.add_subproject(self.subproject)
79+
self.pip.translations.add(self.translation)
80+
81+
@override_settings(PRODUCTION_DOMAIN='readthedocs.org')
82+
def test_resolver_subproject_alias(self):
83+
relation = self.pip.subprojects.first()
84+
relation.alias = 'sub_alias'
85+
relation.save()
86+
with override_settings(USE_SUBDOMAIN=False):
87+
resp = self.client.get('/docs/pip/projects/sub_alias/')
88+
self.assertEqual(resp.status_code, 302)
89+
self.assertEqual(
90+
resp._headers['location'][1],
91+
'http://readthedocs.org/docs/pip/projects/sub_alias/ja/latest/'
92+
)

0 commit comments

Comments
 (0)