Skip to content

Return full path URL (including .html) on /api/v2/docurl/ endpoint #6082

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Apr 7, 2020
Merged
Show file tree
Hide file tree
Changes from 3 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
4 changes: 3 additions & 1 deletion readthedocs/api/v2/views/core_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,12 @@ def docurl(request):

Example::

GET https://readthedocs.org/api/v2/docurl/?project=requests&version=latest&doc=index
GET https://readthedocs.org/api/v2/docurl/?project=requests&version=latest&doc=index&path=index.html
"""
project = request.GET.get('project')
version = request.GET.get('version', LATEST)
doc = request.GET.get('doc', 'index')
path = request.GET.get('path', '')
if project is None:
return Response(
{'error': 'Need project and doc'},
Expand All @@ -42,5 +43,6 @@ def docurl(request):
project=project,
version=version.slug,
page=doc,
path=path,
),
})
14 changes: 12 additions & 2 deletions readthedocs/core/templatetags/core_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,20 @@ def gravatar(email, size=48):


@register.simple_tag(name='doc_url')
def make_document_url(project, version=None, page=''):
def make_document_url(project, version=None, page='', path=''):
"""
Create a URL for a Project, Version and page (and/or path).

:param page: is the name of the document as Sphinx call it (e.g.
/config-file/v1) (note that the extension is not present)
:param path: is the full path of the page (e.g. /section/configuration.html)

:returns: URL to the page (e.g. https://docs.domain.com/en/latest/section/configuration.html)
"""
if not project:
return ''
return resolve(project=project, version_slug=version, filename=page)
filename = path or page
return resolve(project=project, version_slug=version, filename=filename)


@register.filter(is_safe=True)
Expand Down
21 changes: 18 additions & 3 deletions readthedocs/rtd_tests/tests/test_core_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ def setUp(self):
self.pip_abc_url_index = url_base.format(version='/en/abc/index.html')
self.pip_abc_fr_url = url_base.format(version='/fr/abc/')
self.pip_abc_fr_url_index = url_base.format(version='/fr/abc/index.html')
self.pip_abc_xyz_page_url = url_base.format(version='/en/abc/xyz')
self.pip_abc_xyz_fr_page_url = url_base.format(version='/fr/abc/xyz')
self.pip_abc_xyz_page_url = url_base.format(version='/en/abc/xyz.html')
self.pip_abc_xyz_fr_page_url = url_base.format(version='/fr/abc/xyz.html')
self.pip_latest_document_url = url_base.format(version='/en/latest/document')
self.pip_latest_document_page_url = url_base.format(version='/en/latest/document.html')

Expand Down Expand Up @@ -77,11 +77,26 @@ def test_translation_project_and_version_and_page(self):
url = core_tags.make_document_url(proj, 'abc', 'index.html')
self.assertEqual(url, self.pip_abc_fr_url_index)

def test_sphinx_project_documentation_type(self):
proj = Project.objects.get(slug='pip')

proj.documentation_type = 'sphinx'
url = core_tags.make_document_url(proj, LATEST, 'document')
self.assertEqual(url, self.pip_latest_document_page_url)

proj.documentation_type = 'sphinx_htmldir'
url = core_tags.make_document_url(proj, LATEST, 'document')
self.assertEqual(url, self.pip_latest_document_url)

proj.documentation_type = 'sphinx_singlehtml'
url = core_tags.make_document_url(proj, LATEST, 'document')
self.assertEqual(url, self.pip_latest_document_url)

def test_mkdocs(self):
proj = Project.objects.get(slug='pip')
proj.documentation_type = 'mkdocs'
url = core_tags.make_document_url(proj, LATEST, 'document')
self.assertEqual(url, self.pip_latest_document_url)
self.assertEqual(url, self.pip_latest_document_page_url)

def test_mkdocs_no_directory_urls(self):
proj = Project.objects.get(slug='pip')
Expand Down