1
0
mirror of https://github.com/django/django.git synced 2024-12-22 17:16:24 +00:00

Fixed #35867, Refs #2411 -- Allowed links in admindocs view details summary.

This commit is contained in:
sai-ganesh-03 2024-10-31 19:10:00 +05:30 committed by Sarah Boyce
parent 4fcbdb11b1
commit 968397228f
6 changed files with 32 additions and 6 deletions

View File

@ -15,7 +15,7 @@
<h1>{{ name }}</h1> <h1>{{ name }}</h1>
<h2 class="subhead">{{ summary|striptags }}</h2> <h2 class="subhead">{{ summary }}</h2>
{{ body }} {{ body }}

View File

@ -242,3 +242,7 @@ def remove_non_capturing_groups(pattern):
final_pattern += pattern[prev_end:start] final_pattern += pattern[prev_end:start]
prev_end = end prev_end = end
return final_pattern + pattern[prev_end:] return final_pattern + pattern[prev_end:]
def strip_p_tags(value):
return mark_safe(value.replace("<p>", "").replace("</p>", ""))

View File

@ -30,7 +30,7 @@ from django.utils.inspect import (
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import TemplateView from django.views.generic import TemplateView
from .utils import get_view_name from .utils import get_view_name, strip_p_tags
# Exclude methods starting with these strings from documentation # Exclude methods starting with these strings from documentation
MODEL_METHODS_EXCLUDE = ("_", "add_", "delete", "save", "set_") MODEL_METHODS_EXCLUDE = ("_", "add_", "delete", "save", "set_")
@ -195,7 +195,7 @@ class ViewDetailView(BaseAdminDocsView):
**{ **{
**kwargs, **kwargs,
"name": view, "name": view,
"summary": title, "summary": strip_p_tags(title),
"body": body, "body": body,
"meta": metadata, "meta": metadata,
} }
@ -384,7 +384,7 @@ class ModelDetailView(BaseAdminDocsView):
**{ **{
**kwargs, **kwargs,
"name": opts.label, "name": opts.label,
"summary": title, "summary": strip_p_tags(title),
"description": body, "description": body,
"fields": fields, "fields": fields,
"methods": methods, "methods": methods,

View File

@ -89,6 +89,18 @@ class AdminDocViewTests(TestDataMixin, AdminDocsTestCase):
# View docstring # View docstring
self.assertContains(response, "Base view for admindocs views.") self.assertContains(response, "Base view for admindocs views.")
def testview_docstring_links(self):
summary = (
'<h2 class="subhead">This is a view for '
'<a class="reference external" href="/admindocs/models/myapp.company/">'
"myapp.Company</a></h2>"
)
url = reverse(
"django-admindocs-views-detail", args=["admin_docs.views.CompanyView"]
)
response = self.client.get(url)
self.assertContains(response, summary, html=True)
@override_settings(ROOT_URLCONF="admin_docs.namespace_urls") @override_settings(ROOT_URLCONF="admin_docs.namespace_urls")
def test_namespaced_view_detail(self): def test_namespaced_view_detail(self):
url = reverse( url = reverse(
@ -408,9 +420,9 @@ class TestModelDetailView(TestDataMixin, AdminDocsTestCase):
def test_model_docstring_renders_correctly(self): def test_model_docstring_renders_correctly(self):
summary = ( summary = (
'<h2 class="subhead"><p>Stores information about a person, related to ' '<h2 class="subhead">Stores information about a person, related to '
'<a class="reference external" href="/admindocs/models/myapp.company/">' '<a class="reference external" href="/admindocs/models/myapp.company/">'
"myapp.Company</a>.</p></h2>" "myapp.Company</a>.</h2>"
) )
subheading = "<p><strong>Notes</strong></p>" subheading = "<p><strong>Notes</strong></p>"
body = ( body = (

View File

@ -14,6 +14,7 @@ urlpatterns = [
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path("admindocs/", include("django.contrib.admindocs.urls")), path("admindocs/", include("django.contrib.admindocs.urls")),
path("", include(ns_patterns, namespace="test")), path("", include(ns_patterns, namespace="test")),
path("company/", views.CompanyView.as_view()),
path("xview/func/", views.xview_dec(views.xview)), path("xview/func/", views.xview_dec(views.xview)),
path("xview/class/", views.xview_dec(views.XViewClass.as_view())), path("xview/class/", views.xview_dec(views.XViewClass.as_view())),
path("xview/callable_object/", views.xview_dec(views.XViewCallableObject())), path("xview/callable_object/", views.xview_dec(views.XViewCallableObject())),

View File

@ -18,3 +18,12 @@ class XViewClass(View):
class XViewCallableObject(View): class XViewCallableObject(View):
def __call__(self, request): def __call__(self, request):
return HttpResponse() return HttpResponse()
class CompanyView(View):
"""
This is a view for :model:`myapp.Company`
"""
def get(self, request):
return HttpResponse()