1
0
mirror of https://github.com/django/django.git synced 2025-04-26 02:04:38 +00:00

Refs #25135 -- Removed support for the contrib.admin allow_tags attribute.

Per deprecation timeline.
This commit is contained in:
Tim Graham 2016-12-31 08:26:23 -05:00
parent 7510b872e7
commit d67a46e104
7 changed files with 7 additions and 80 deletions

View File

@ -1,7 +1,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import json import json
import warnings
from django import forms from django import forms
from django.conf import settings from django.conf import settings
@ -14,7 +13,6 @@ from django.db.models.fields.related import ManyToManyRel
from django.forms.utils import flatatt from django.forms.utils import flatatt
from django.template.defaultfilters import capfirst, linebreaksbr from django.template.defaultfilters import capfirst, linebreaksbr
from django.utils import six from django.utils import six
from django.utils.deprecation import RemovedInDjango20Warning
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.html import conditional_escape, format_html from django.utils.html import conditional_escape, format_html
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
@ -218,17 +216,7 @@ class AdminReadonlyField(object):
if hasattr(value, "__html__"): if hasattr(value, "__html__"):
result_repr = value result_repr = value
else: else:
result_repr = force_text(value) result_repr = linebreaksbr(force_text(value))
if getattr(attr, "allow_tags", False):
warnings.warn(
"Deprecated allow_tags attribute used on %s. "
"Use django.utils.html.format_html(), format_html_join(), "
"or django.utils.safestring.mark_safe() instead." % attr,
RemovedInDjango20Warning
)
result_repr = mark_safe(value)
else:
result_repr = linebreaksbr(result_repr)
else: else:
if isinstance(f.remote_field, ManyToManyRel) and value is not None: if isinstance(f.remote_field, ManyToManyRel) and value is not None:
result_repr = ", ".join(map(six.text_type, value.all())) result_repr = ", ".join(map(six.text_type, value.all()))

View File

@ -1,7 +1,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
import warnings
from django.contrib.admin.templatetags.admin_urls import add_preserved_filters from django.contrib.admin.templatetags.admin_urls import add_preserved_filters
from django.contrib.admin.utils import ( from django.contrib.admin.utils import (
@ -18,7 +17,6 @@ from django.template.loader import get_template
from django.templatetags.static import static from django.templatetags.static import static
from django.urls import NoReverseMatch from django.urls import NoReverseMatch
from django.utils import formats from django.utils import formats
from django.utils.deprecation import RemovedInDjango20Warning
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
@ -223,17 +221,8 @@ def items_for_result(cl, result, form):
if f is None or f.auto_created: if f is None or f.auto_created:
if field_name == 'action_checkbox': if field_name == 'action_checkbox':
row_classes = ['action-checkbox'] row_classes = ['action-checkbox']
allow_tags = getattr(attr, 'allow_tags', False)
boolean = getattr(attr, 'boolean', False) boolean = getattr(attr, 'boolean', False)
result_repr = display_for_value(value, empty_value_display, boolean) result_repr = display_for_value(value, empty_value_display, boolean)
if allow_tags:
warnings.warn(
"Deprecated allow_tags attribute used on field {}. "
"Use django.utils.html.format_html(), format_html_join(), "
"or django.utils.safestring.mark_safe() instead.".format(field_name),
RemovedInDjango20Warning
)
result_repr = mark_safe(result_repr)
if isinstance(value, (datetime.date, datetime.time)): if isinstance(value, (datetime.date, datetime.time)):
row_classes.append('nowrap') row_classes.append('nowrap')
else: else:

View File

@ -633,14 +633,6 @@ subclass::
class PersonAdmin(admin.ModelAdmin): class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'colored_name') list_display = ('first_name', 'last_name', 'colored_name')
.. deprecated:: 1.9
In older versions, you could add an ``allow_tags`` attribute to the
method to prevent auto-escaping. This attribute is deprecated as it's
safer to use :func:`~django.utils.html.format_html`,
:func:`~django.utils.html.format_html_join`, or
:func:`~django.utils.safestring.mark_safe` instead.
* As some examples have already demonstrated, when using a callable, a * As some examples have already demonstrated, when using a callable, a
model method, or a ``ModelAdmin`` method, you can customize the column's model method, or a ``ModelAdmin`` method, you can customize the column's
title by adding a ``short_description`` attribute to the callable. title by adding a ``short_description`` attribute to the callable.

View File

@ -309,3 +309,6 @@ these features.
* The ``callable_obj`` keyword argument to * The ``callable_obj`` keyword argument to
``SimpleTestCase.assertRaisesMessage()`` is removed. ``SimpleTestCase.assertRaisesMessage()`` is removed.
* Support for the ``allow_tags`` attribute on ``ModelAdmin`` methods is
removed.

View File

@ -11,11 +11,10 @@ from django.contrib.admin.views.main import ALL_VAR, SEARCH_VAR, ChangeList
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.template import Context, Template from django.template import Context, Template
from django.test import TestCase, ignore_warnings, override_settings from django.test import TestCase, override_settings
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.urls import reverse from django.urls import reverse
from django.utils import formats, six from django.utils import formats, six
from django.utils.deprecation import RemovedInDjango20Warning
from .admin import ( from .admin import (
BandAdmin, ChildAdmin, ChordsBandAdmin, ConcertAdmin, BandAdmin, ChildAdmin, ChordsBandAdmin, ConcertAdmin,
@ -253,34 +252,6 @@ class ChangeListTests(TestCase):
with self.assertRaises(IncorrectLookupParameters): with self.assertRaises(IncorrectLookupParameters):
ChangeList(request, Child, *get_changelist_args(m)) ChangeList(request, Child, *get_changelist_args(m))
@ignore_warnings(category=RemovedInDjango20Warning)
def test_result_list_with_allow_tags(self):
"""
Test for deprecation of allow_tags attribute
"""
new_parent = Parent.objects.create(name='parent')
for i in range(2):
Child.objects.create(name='name %s' % i, parent=new_parent)
request = self.factory.get('/child/')
m = ChildAdmin(Child, custom_site)
def custom_method(self, obj=None):
return 'Unsafe html <br />'
custom_method.allow_tags = True
# Add custom method with allow_tags attribute
m.custom_method = custom_method
m.list_display = ['id', 'name', 'parent', 'custom_method']
cl = ChangeList(request, Child, *get_changelist_args(m))
FormSet = m.get_changelist_formset(request)
cl.formset = FormSet(queryset=cl.result_list)
template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}')
context = Context({'cl': cl})
table_output = template.render(context)
custom_field_html = '<td class="field-custom_method">Unsafe html <br /></td>'
self.assertInHTML(custom_field_html, table_output)
def test_custom_paginator(self): def test_custom_paginator(self):
new_parent = Parent.objects.create(name='parent') new_parent = Parent.objects.create(name='parent')
for i in range(200): for i in range(200):

View File

@ -447,7 +447,7 @@ class PostAdmin(admin.ModelAdmin):
readonly_fields = ( readonly_fields = (
'posted', 'awesomeness_level', 'coolness', 'value', 'posted', 'awesomeness_level', 'coolness', 'value',
'multiline', 'multiline_html', lambda obj: "foo", 'multiline', 'multiline_html', lambda obj: "foo",
'multiline_html_allow_tags', 'readonly_content', 'readonly_content',
) )
inlines = [ inlines = [
@ -470,10 +470,6 @@ class PostAdmin(admin.ModelAdmin):
def multiline_html(self, instance): def multiline_html(self, instance):
return mark_safe("Multiline<br>\nhtml<br>\ncontent") return mark_safe("Multiline<br>\nhtml<br>\ncontent")
def multiline_html_allow_tags(self, instance):
return "Multiline<br>html<br>content<br>with allow tags"
multiline_html_allow_tags.allow_tags = True
class FieldOverridePostForm(forms.ModelForm): class FieldOverridePostForm(forms.ModelForm):
model = FieldOverridePost model = FieldOverridePost

View File

@ -35,9 +35,7 @@ from django.urls import NoReverseMatch, resolve, reverse
from django.utils import formats, six, translation from django.utils import formats, six, translation
from django.utils._os import upath from django.utils._os import upath
from django.utils.cache import get_max_age from django.utils.cache import get_max_age
from django.utils.deprecation import ( from django.utils.deprecation import RemovedInDjango21Warning
RemovedInDjango20Warning, RemovedInDjango21Warning,
)
from django.utils.encoding import force_bytes, force_text, iri_to_uri from django.utils.encoding import force_bytes, force_text, iri_to_uri
from django.utils.html import escape from django.utils.html import escape
from django.utils.http import urlencode from django.utils.http import urlencode
@ -4655,7 +4653,6 @@ class ReadonlyTest(AdminFieldExtractionMixin, TestCase):
def setUp(self): def setUp(self):
self.client.force_login(self.superuser) self.client.force_login(self.superuser)
@ignore_warnings(category=RemovedInDjango20Warning) # for allow_tags deprecation
def test_readonly_get(self): def test_readonly_get(self):
response = self.client.get(reverse('admin:admin_views_post_add')) response = self.client.get(reverse('admin:admin_views_post_add'))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@ -4673,12 +4670,6 @@ class ReadonlyTest(AdminFieldExtractionMixin, TestCase):
self.assertContains(response, 'Multiline<br />test<br />string') self.assertContains(response, 'Multiline<br />test<br />string')
self.assertContains(response, '<div class="readonly">Multiline<br />html<br />content</div>', html=True) self.assertContains(response, '<div class="readonly">Multiline<br />html<br />content</div>', html=True)
self.assertContains(response, 'InlineMultiline<br />test<br />string') self.assertContains(response, 'InlineMultiline<br />test<br />string')
# Remove only this last line when the deprecation completes.
self.assertContains(
response,
'<div class="readonly">Multiline<br />html<br />content<br />with allow tags</div>',
html=True
)
self.assertContains(response, formats.localize(datetime.date.today() - datetime.timedelta(days=7))) self.assertContains(response, formats.localize(datetime.date.today() - datetime.timedelta(days=7)))
@ -4708,7 +4699,6 @@ class ReadonlyTest(AdminFieldExtractionMixin, TestCase):
response = self.client.get(reverse('admin:admin_views_post_change', args=(p.pk,))) response = self.client.get(reverse('admin:admin_views_post_change', args=(p.pk,)))
self.assertContains(response, "%d amount of cool" % p.pk) self.assertContains(response, "%d amount of cool" % p.pk)
@ignore_warnings(category=RemovedInDjango20Warning) # for allow_tags deprecation
def test_readonly_text_field(self): def test_readonly_text_field(self):
p = Post.objects.create( p = Post.objects.create(
title="Readonly test", content="test", title="Readonly test", content="test",
@ -4802,7 +4792,6 @@ class ReadonlyTest(AdminFieldExtractionMixin, TestCase):
field = self.get_admin_readonly_field(response, 'plotdetails') field = self.get_admin_readonly_field(response, 'plotdetails')
self.assertEqual(field.contents(), '-') # default empty value self.assertEqual(field.contents(), '-') # default empty value
@ignore_warnings(category=RemovedInDjango20Warning) # for allow_tags deprecation
def test_readonly_field_overrides(self): def test_readonly_field_overrides(self):
""" """
Regression test for #22087 - ModelForm Meta overrides are ignored by Regression test for #22087 - ModelForm Meta overrides are ignored by
@ -5148,7 +5137,6 @@ class CSSTest(TestCase):
def setUp(self): def setUp(self):
self.client.force_login(self.superuser) self.client.force_login(self.superuser)
@ignore_warnings(category=RemovedInDjango20Warning) # for allow_tags deprecation
def test_field_prefix_css_classes(self): def test_field_prefix_css_classes(self):
""" """
Fields have a CSS class name with a 'field-' prefix. Fields have a CSS class name with a 'field-' prefix.