From 312e488a218a0c115cd23243b328dee5aee45965 Mon Sep 17 00:00:00 2001 From: Alexander Gaevsky Date: Thu, 24 Dec 2015 23:32:53 +0200 Subject: [PATCH] [1.9.x] Fixed #25465 -- Restored line breaks conversion in admin readonly fields. Backport of 69208a5a1c55d42ca0eaffa900be643d9f801089 from master --- django/contrib/admin/helpers.py | 1 + docs/releases/1.8.8.txt | 3 +++ docs/releases/1.9.1.txt | 3 +++ tests/admin_views/admin.py | 4 ++-- tests/admin_views/models.py | 2 ++ tests/admin_views/tests.py | 18 +++++++++++++++++- 6 files changed, 28 insertions(+), 3 deletions(-) diff --git a/django/contrib/admin/helpers.py b/django/contrib/admin/helpers.py index e673199e73..9c3440fe05 100644 --- a/django/contrib/admin/helpers.py +++ b/django/contrib/admin/helpers.py @@ -219,6 +219,7 @@ class AdminReadonlyField(object): result_repr = ", ".join(map(six.text_type, value.all())) else: result_repr = display_for_field(value, f, self.empty_value_display) + result_repr = linebreaksbr(result_repr) return conditional_escape(result_repr) diff --git a/docs/releases/1.8.8.txt b/docs/releases/1.8.8.txt index f3c4e8bba1..8caf5f7ff5 100644 --- a/docs/releases/1.8.8.txt +++ b/docs/releases/1.8.8.txt @@ -48,3 +48,6 @@ Bugfixes ``filter_horizontal`` and ``filter_vertical`` widgets, which could result in inadvertent data loss if a user didn't notice that and then submitted the form (:ticket:`22955`). + +* Fixed a regression in the admin which ignored line breaks in read-only fields + instead of converting them to ``
`` (:ticket:`25465`). diff --git a/docs/releases/1.9.1.txt b/docs/releases/1.9.1.txt index f7fa7cf37c..4fca0f78ab 100644 --- a/docs/releases/1.9.1.txt +++ b/docs/releases/1.9.1.txt @@ -67,3 +67,6 @@ Bugfixes * Fixed ``isnull`` query lookup for ``ForeignObject`` (:ticket:`25972`). + +* Fixed a regression in the admin which ignored line breaks in read-only fields + instead of converting them to ``
`` (:ticket:`25465`). diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py index c2a2ccb352..90603ce828 100644 --- a/tests/admin_views/admin.py +++ b/tests/admin_views/admin.py @@ -387,7 +387,7 @@ class LinkInline(admin.TabularInline): model = Link extra = 1 - readonly_fields = ("posted", "multiline") + readonly_fields = ("posted", "multiline", "readonly_link_content") def multiline(self, instance): return "InlineMultiline\ntest\nstring" @@ -435,7 +435,7 @@ class PostAdmin(admin.ModelAdmin): readonly_fields = ( 'posted', 'awesomeness_level', 'coolness', 'value', 'multiline', 'multiline_html', lambda obj: "foo", - 'multiline_html_allow_tags', + 'multiline_html_allow_tags', 'readonly_content', ) inlines = [ diff --git a/tests/admin_views/models.py b/tests/admin_views/models.py index 9a6b63230a..c105c42e4a 100644 --- a/tests/admin_views/models.py +++ b/tests/admin_views/models.py @@ -451,6 +451,7 @@ class Link(models.Model): posted = models.DateField(default=link_posted_default) url = models.URLField() post = models.ForeignKey("Post", models.CASCADE) + readonly_link_content = models.TextField() class PrePopulatedPost(models.Model): @@ -468,6 +469,7 @@ class PrePopulatedSubPost(models.Model): class Post(models.Model): title = models.CharField(max_length=100, help_text="Some help text for the title (with unicode ŠĐĆŽćžšđ)") content = models.TextField(help_text="Some help text for the content (with unicode ŠĐĆŽćžšđ)") + readonly_content = models.TextField() posted = models.DateField( default=datetime.date.today, help_text="Some help text for the date (with unicode ŠĐĆŽćžšđ)" diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index 05e1e242d9..4f6146c344 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -50,7 +50,7 @@ from .models import ( CustomArticle, CyclicOne, CyclicTwo, DooHickey, Employee, EmptyModel, ExternalSubscriber, Fabric, FancyDoodad, FieldOverridePost, FilteredManager, FooAccount, FoodDelivery, FunkyTag, Gallery, Grommet, - Inquisition, Language, MainPrepopulated, ModelWithStringPrimaryKey, + Inquisition, Language, Link, MainPrepopulated, ModelWithStringPrimaryKey, OtherStory, Paper, Parent, ParentWithDependentChildren, Person, Persona, Picture, Pizza, Plot, PlotDetails, PluggableSearchPerson, Podcast, Post, PrePopulatedPost, Promo, Question, Recommendation, Recommender, @@ -4645,6 +4645,22 @@ class ReadonlyTest(TestCase): response = self.client.get(reverse('admin:admin_views_post_change', args=(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): + p = Post.objects.create( + title="Readonly test", content="test", + readonly_content='test\r\n\r\ntest\r\n\r\ntest\r\n\r\ntest', + ) + Link.objects.create( + url="http://www.djangoproject.com", post=p, + readonly_link_content="test\r\nlink", + ) + response = self.client.get(reverse('admin:admin_views_post_change', args=(p.pk,))) + # Checking readonly field. + self.assertContains(response, 'test

test

test

test') + # Checking readonly field in inline. + self.assertContains(response, 'test
link') + def test_readonly_post(self): data = { "title": "Django Got Readonly Fields",