Skip to content

Commit

Permalink
Fixed #31527 -- Allowed admindocs index to handle non-string URLconfs.
Browse files Browse the repository at this point in the history
  • Loading branch information
jimxie28 authored and carltongibson committed Feb 4, 2021
1 parent e17bdb9 commit ce60d28
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 5 deletions.
8 changes: 5 additions & 3 deletions django/contrib/admindocs/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from pathlib import Path

from django.apps import apps
from django.conf import settings
from django.contrib import admin
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.admindocs import utils
Expand Down Expand Up @@ -120,8 +119,11 @@ class ViewIndexView(BaseAdminDocsView):

def get_context_data(self, **kwargs):
views = []
urlconf = import_module(settings.ROOT_URLCONF)
view_functions = extract_views_from_urlpatterns(urlconf.urlpatterns)
url_resolver = get_resolver(get_urlconf())
try:
view_functions = extract_views_from_urlpatterns(url_resolver.url_patterns)
except ImproperlyConfigured:
view_functions = []
for (func, regex, namespace, name) in view_functions:
views.append({
'full_name': get_view_name(func),
Expand Down
3 changes: 2 additions & 1 deletion docs/releases/4.0.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ Minor features
:mod:`django.contrib.admindocs`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* ...
* The admindocs now allows esoteric setups where :setting:`ROOT_URLCONF` is not
a string.

:mod:`django.contrib.auth`
~~~~~~~~~~~~~~~~~~~~~~~~~~
Expand Down
19 changes: 18 additions & 1 deletion tests/admin_docs/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@
import unittest

from django.conf import settings
from django.contrib import admin
from django.contrib.admindocs import utils, views
from django.contrib.admindocs.views import get_return_data_type, simplify_regex
from django.contrib.sites.models import Site
from django.db import models
from django.db.models import fields
from django.test import SimpleTestCase, modify_settings, override_settings
from django.test.utils import captured_stderr
from django.urls import reverse
from django.urls import include, path, reverse
from django.utils.functional import SimpleLazyObject

from .models import Company, Person
from .tests import AdminDocsTestCase, TestDataMixin
Expand Down Expand Up @@ -136,6 +138,21 @@ def test_no_sites_framework(self):
response = self.client.get(reverse('django-admindocs-views-index'))
self.assertContains(response, 'View documentation')

def test_callable_urlconf(self):
"""
Index view should correctly resolve view patterns when ROOT_URLCONF is
not a string.
"""
def urlpatterns():
return (
path('admin/doc/', include('django.contrib.admindocs.urls')),
path('admin/', admin.site.urls),
)

with self.settings(ROOT_URLCONF=SimpleLazyObject(urlpatterns)):
response = self.client.get(reverse('django-admindocs-views-index'))
self.assertEqual(response.status_code, 200)


@override_settings(TEMPLATES=[{
'NAME': 'ONE',
Expand Down

0 comments on commit ce60d28

Please sign in to comment.