Skip to content

Commit 827e653

Browse files
authored
Resolver: allow to ignore custom domains (#9089)
This is useful if we want to get all domains this project can be served from (we have project.domains, but we are missing the "normal" one). Specially, I'm going to use this on .com.
1 parent 84cb805 commit 827e653

File tree

3 files changed

+46
-21
lines changed

3 files changed

+46
-21
lines changed

readthedocs/core/resolver.py

+17-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
"""URL resolver for documentation."""
22

3-
import structlog
43
from urllib.parse import urlunparse
54

5+
import structlog
66
from django.conf import settings
77

8-
from readthedocs.core.utils.extend import SettingsOverrideObject
98
from readthedocs.builds.constants import EXTERNAL
9+
from readthedocs.core.utils.extend import SettingsOverrideObject
1010

1111
log = structlog.get_logger(__name__)
1212

@@ -152,11 +152,18 @@ def resolve_path(
152152
urlconf=urlconf or project.urlconf,
153153
)
154154

155-
def resolve_domain(self, project):
155+
def resolve_domain(self, project, use_canonical_domain=True):
156+
"""
157+
Get the domain from where the documentation of ``project`` is served from.
158+
159+
:param project: Project object
160+
:param bool use_canonical_domain: If `True` use its canonical custom domain if available.
161+
"""
156162
canonical_project = self._get_canonical_project(project)
157-
domain = canonical_project.get_canonical_custom_domain()
158-
if domain:
159-
return domain.domain
163+
if use_canonical_domain and self._use_cname(canonical_project):
164+
domain = canonical_project.get_canonical_custom_domain()
165+
if domain:
166+
return domain.domain
160167

161168
if self._use_subdomain():
162169
return self._get_project_subdomain(canonical_project)
@@ -345,6 +352,10 @@ def _use_subdomain(self):
345352
"""Make decision about whether to use a subdomain to serve docs."""
346353
return settings.USE_SUBDOMAIN and settings.PUBLIC_DOMAIN is not None
347354

355+
def _use_cname(self, project):
356+
"""Test if to allow direct serving for project on CNAME."""
357+
return True
358+
348359

349360
class Resolver(SettingsOverrideObject):
350361

readthedocs/projects/models.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -731,9 +731,9 @@ def alias(self):
731731
if self.is_subproject:
732732
return self.superprojects.first().alias
733733

734-
def subdomain(self):
734+
def subdomain(self, use_canonical_domain=True):
735735
"""Get project subdomain from resolver."""
736-
return resolve_domain(self)
736+
return resolve_domain(self, use_canonical_domain=use_canonical_domain)
737737

738738
def get_downloads(self):
739739
downloads = {}

readthedocs/rtd_tests/tests/test_resolver.py

+27-13
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
1-
from unittest import mock
2-
31
import django_dynamic_fixture as fixture
42
import pytest
53
from django.test import TestCase, override_settings
64

75
from readthedocs.builds.constants import EXTERNAL
8-
from readthedocs.core.resolver import (
9-
Resolver,
10-
resolve,
11-
resolve_domain,
12-
resolve_path,
13-
)
6+
from readthedocs.core.resolver import Resolver, resolve, resolve_domain, resolve_path
147
from readthedocs.projects.constants import PRIVATE
158
from readthedocs.projects.models import Domain, Project, ProjectRelationship
169
from readthedocs.rtd_tests.utils import create_user
@@ -359,7 +352,10 @@ def test_domain_resolver(self):
359352
url = resolve_domain(project=self.pip)
360353
self.assertEqual(url, 'pip.readthedocs.org')
361354

362-
@override_settings(PRODUCTION_DOMAIN='readthedocs.org')
355+
@override_settings(
356+
PRODUCTION_DOMAIN="readthedocs.org",
357+
PUBLIC_DOMAIN="readthedocs.io",
358+
)
363359
def test_domain_resolver_with_domain_object(self):
364360
self.domain = fixture.get(
365361
Domain,
@@ -374,14 +370,23 @@ def test_domain_resolver_with_domain_object(self):
374370
url = resolve_domain(project=self.pip)
375371
self.assertEqual(url, 'docs.foobar.com')
376372

377-
@override_settings(PRODUCTION_DOMAIN='readthedocs.org')
373+
url = resolve_domain(project=self.pip, use_canonical_domain=False)
374+
self.assertEqual(url, "pip.readthedocs.io")
375+
376+
@override_settings(
377+
PRODUCTION_DOMAIN="readthedocs.org",
378+
PUBLIC_DOMAIN="readthedocs.io",
379+
)
378380
def test_domain_resolver_subproject(self):
379381
with override_settings(USE_SUBDOMAIN=False):
380382
url = resolve_domain(project=self.subproject)
381383
self.assertEqual(url, 'readthedocs.org')
382384
with override_settings(USE_SUBDOMAIN=True):
383385
url = resolve_domain(project=self.subproject)
384-
self.assertEqual(url, 'pip.readthedocs.org')
386+
self.assertEqual(url, "pip.readthedocs.io")
387+
388+
url = resolve_domain(project=self.subproject, use_canonical_domain=False)
389+
self.assertEqual(url, "pip.readthedocs.io")
385390

386391
@override_settings(PRODUCTION_DOMAIN='readthedocs.org')
387392
def test_domain_resolver_subproject_itself(self):
@@ -404,14 +409,20 @@ def test_domain_resolver_subproject_itself(self):
404409
url = resolve_domain(project=self.pip)
405410
self.assertEqual(url, 'pip.readthedocs.org')
406411

407-
@override_settings(PRODUCTION_DOMAIN='readthedocs.org')
412+
@override_settings(
413+
PRODUCTION_DOMAIN="readthedocs.org",
414+
PUBLIC_DOMAIN="readthedocs.io",
415+
)
408416
def test_domain_resolver_translation(self):
409417
with override_settings(USE_SUBDOMAIN=False):
410418
url = resolve_domain(project=self.translation)
411419
self.assertEqual(url, 'readthedocs.org')
412420
with override_settings(USE_SUBDOMAIN=True):
413421
url = resolve_domain(project=self.translation)
414-
self.assertEqual(url, 'pip.readthedocs.org')
422+
self.assertEqual(url, "pip.readthedocs.io")
423+
424+
url = resolve_domain(project=self.translation, use_canonical_domain=False)
425+
self.assertEqual(url, "pip.readthedocs.io")
415426

416427
@override_settings(PRODUCTION_DOMAIN='readthedocs.org')
417428
def test_domain_resolver_translation_itself(self):
@@ -444,6 +455,9 @@ def test_domain_public(self):
444455
self.assertEqual(url, 'readthedocs.org')
445456
with override_settings(USE_SUBDOMAIN=True):
446457
url = resolve_domain(project=self.translation)
458+
self.assertEqual(url, "pip.public.readthedocs.org")
459+
460+
url = resolve_domain(project=self.translation, use_canonical_domain=False)
447461
self.assertEqual(url, 'pip.public.readthedocs.org')
448462

449463
@override_settings(

0 commit comments

Comments
 (0)