Skip to content

Commit d49a357

Browse files
committed
Return full path URL (including .html) on /api/v2/docurl/ endpoint
`make_document_url` had a behavior and it was returning invalid URL when the `page` argument was a docname (the case when used by the Embed API endpoint). This commit consider both cases for this attribute (filename page: index.html, or document name: config/v2) and decide if the `.html` extension needs to be added based on the builder --`documentation_type` (sphinx, sphinx_htmldir, mkdocs, etc) used for the project.
1 parent b1a8a80 commit d49a357

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

readthedocs/core/templatetags/core_tags.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,23 @@ def gravatar(email, size=48):
3838

3939
@register.simple_tag(name='doc_url')
4040
def make_document_url(project, version=None, page=''):
41+
"""
42+
Create a URL for a Project, Version and page.
43+
44+
``page`` could be the name of the document as Sphinx call it (e.g.
45+
/config-file/v1) (note that the extension is not present) or the filename of
46+
the page (e.g. index.html). We need to detect which is the case and add the
47+
.html extension when it's a docname.
48+
"""
4149
if not project:
4250
return ''
43-
return resolve(project=project, version_slug=version, filename=page)
51+
52+
if page and not page.endswith('.html'):
53+
if project.documentation_type in ('sphinx', 'mkdocs'):
54+
page = f'{page}.html'
55+
56+
path = resolve(project=project, version_slug=version, filename=page)
57+
return path
4458

4559

4660
@register.filter(is_safe=True)

readthedocs/rtd_tests/tests/test_core_tags.py

+18-3
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ def setUp(self):
2727
self.pip_abc_url_index = url_base.format(version='/en/abc/index.html')
2828
self.pip_abc_fr_url = url_base.format(version='/fr/abc/')
2929
self.pip_abc_fr_url_index = url_base.format(version='/fr/abc/index.html')
30-
self.pip_abc_xyz_page_url = url_base.format(version='/en/abc/xyz')
31-
self.pip_abc_xyz_fr_page_url = url_base.format(version='/fr/abc/xyz')
30+
self.pip_abc_xyz_page_url = url_base.format(version='/en/abc/xyz.html')
31+
self.pip_abc_xyz_fr_page_url = url_base.format(version='/fr/abc/xyz.html')
3232
self.pip_latest_document_url = url_base.format(version='/en/latest/document')
3333
self.pip_latest_document_page_url = url_base.format(version='/en/latest/document.html')
3434

@@ -79,11 +79,26 @@ def test_translation_project_and_version_and_page(self):
7979
url = core_tags.make_document_url(proj, 'abc', 'index.html')
8080
self.assertEqual(url, self.pip_abc_fr_url_index)
8181

82+
def test_sphinx_project_documentation_type(self):
83+
proj = Project.objects.get(slug='pip')
84+
85+
proj.documentation_type = 'sphinx'
86+
url = core_tags.make_document_url(proj, LATEST, 'document')
87+
self.assertEqual(url, self.pip_latest_document_page_url)
88+
89+
proj.documentation_type = 'sphinx_htmldir'
90+
url = core_tags.make_document_url(proj, LATEST, 'document')
91+
self.assertEqual(url, self.pip_latest_document_url)
92+
93+
proj.documentation_type = 'sphinx_singlehtml'
94+
url = core_tags.make_document_url(proj, LATEST, 'document')
95+
self.assertEqual(url, self.pip_latest_document_url)
96+
8297
def test_mkdocs(self):
8398
proj = Project.objects.get(slug='pip')
8499
proj.documentation_type = 'mkdocs'
85100
url = core_tags.make_document_url(proj, LATEST, 'document')
86-
self.assertEqual(url, self.pip_latest_document_url)
101+
self.assertEqual(url, self.pip_latest_document_page_url)
87102

88103
def test_mkdocs_no_directory_urls(self):
89104
proj = Project.objects.get(slug='pip')

0 commit comments

Comments
 (0)