diff options
author | Claude Paroz <claude@2xlibre.net> | 2015-12-26 19:51:22 +0100 |
---|---|---|
committer | Claude Paroz <claude@2xlibre.net> | 2016-01-08 20:34:59 +0100 |
commit | cf7894be88f6c27680ef80796b883f6e3b709b8b (patch) | |
tree | 6620fd9dea735a2b91ccde0a7168d3098823e0fb /tests/admin_utils | |
parent | 56aaae58a746eb39d5e92ba60f59f4c750a8e1a8 (diff) | |
download | django-cf7894be88f6c27680ef80796b883f6e3b709b8b.tar.gz |
Fixed #21113 -- Made LogEntry.change_message language independent
Thanks Tim Graham for the review.
Diffstat (limited to 'tests/admin_utils')
-rw-r--r-- | tests/admin_utils/admin.py | 13 | ||||
-rw-r--r-- | tests/admin_utils/models.py | 5 | ||||
-rw-r--r-- | tests/admin_utils/test_logentry.py | 88 | ||||
-rw-r--r-- | tests/admin_utils/tests.py | 8 |
4 files changed, 104 insertions, 10 deletions
diff --git a/tests/admin_utils/admin.py b/tests/admin_utils/admin.py index 37232e3268..a161322bc2 100644 --- a/tests/admin_utils/admin.py +++ b/tests/admin_utils/admin.py @@ -1,7 +1,18 @@ from django.contrib import admin -from .models import Article, ArticleProxy +from .models import Article, ArticleProxy, Site + + +class ArticleInline(admin.TabularInline): + model = Article + fields = ['title'] + + +class SiteAdmin(admin.ModelAdmin): + inlines = [ArticleInline] + site = admin.AdminSite(name='admin') site.register(Article) site.register(ArticleProxy) +site.register(Site, SiteAdmin) diff --git a/tests/admin_utils/models.py b/tests/admin_utils/models.py index a4fe85291c..87060cbff8 100644 --- a/tests/admin_utils/models.py +++ b/tests/admin_utils/models.py @@ -1,6 +1,7 @@ from django.db import models from django.utils import six from django.utils.encoding import python_2_unicode_compatible +from django.utils.translation import ugettext_lazy as _ @python_2_unicode_compatible @@ -17,8 +18,8 @@ class Article(models.Model): """ site = models.ForeignKey(Site, models.CASCADE, related_name="admin_articles") title = models.CharField(max_length=100) - title2 = models.CharField(max_length=100, verbose_name="another name") - created = models.DateTimeField() + hist = models.CharField(max_length=100, verbose_name=_("History")) + created = models.DateTimeField(null=True) def test_from_model(self): return "nothing" diff --git a/tests/admin_utils/test_logentry.py b/tests/admin_utils/test_logentry.py index 70f0de7595..efafefc479 100644 --- a/tests/admin_utils/test_logentry.py +++ b/tests/admin_utils/test_logentry.py @@ -1,5 +1,7 @@ +# -*- coding: utf-8 -*- from __future__ import unicode_literals +import json from datetime import datetime from django.contrib.admin.models import ADDITION, CHANGE, DELETION, LogEntry @@ -8,7 +10,7 @@ from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.test import TestCase, override_settings from django.urls import reverse -from django.utils import six +from django.utils import six, translation from django.utils.encoding import force_bytes from django.utils.html import escape @@ -28,7 +30,7 @@ class LogEntryTests(TestCase): self.a1 = Article.objects.create( site=self.site, title="Title", - created=datetime(2008, 3, 18, 11, 54, 58), + created=datetime(2008, 3, 18, 11, 54), ) content_type_pk = ContentType.objects.get_for_model(Article).pk LogEntry.objects.log_action( @@ -47,6 +49,86 @@ class LogEntryTests(TestCase): logentry.save() self.assertEqual(logentry.action_time, action_time) + def test_logentry_change_message(self): + """ + LogEntry.change_message is stored as a dumped JSON structure to be able + to get the message dynamically translated at display time. + """ + post_data = { + 'site': self.site.pk, 'title': 'Changed', 'hist': 'Some content', + 'created_0': '2008-03-18', 'created_1': '11:54', + } + change_url = reverse('admin:admin_utils_article_change', args=[quote(self.a1.pk)]) + response = self.client.post(change_url, post_data) + self.assertRedirects(response, reverse('admin:admin_utils_article_changelist')) + logentry = LogEntry.objects.filter(content_type__model__iexact='article').latest('action_time') + self.assertEqual(logentry.get_change_message(), 'Changed title and hist.') + with translation.override('fr'): + self.assertEqual(logentry.get_change_message(), 'Modification de title et hist.') + + add_url = reverse('admin:admin_utils_article_add') + post_data['title'] = 'New' + response = self.client.post(add_url, post_data) + self.assertRedirects(response, reverse('admin:admin_utils_article_changelist')) + logentry = LogEntry.objects.filter(content_type__model__iexact='article').latest('action_time') + self.assertEqual(logentry.get_change_message(), 'Added.') + with translation.override('fr'): + self.assertEqual(logentry.get_change_message(), 'Ajout.') + + def test_logentry_change_message_formsets(self): + """ + All messages for changed formsets are logged in a change message. + """ + a2 = Article.objects.create( + site=self.site, + title="Title second article", + created=datetime(2012, 3, 18, 11, 54), + ) + post_data = { + 'domain': 'example.com', # domain changed + 'admin_articles-TOTAL_FORMS': '5', + 'admin_articles-INITIAL_FORMS': '2', + 'admin_articles-MIN_NUM_FORMS': '0', + 'admin_articles-MAX_NUM_FORMS': '1000', + # Changed title for 1st article + 'admin_articles-0-id': str(self.a1.pk), + 'admin_articles-0-site': str(self.site.pk), + 'admin_articles-0-title': 'Changed Title', + # Second article is deleted + 'admin_articles-1-id': str(a2.pk), + 'admin_articles-1-site': str(self.site.pk), + 'admin_articles-1-title': 'Title second article', + 'admin_articles-1-DELETE': 'on', + # A new article is added + 'admin_articles-2-site': str(self.site.pk), + 'admin_articles-2-title': 'Added article', + } + change_url = reverse('admin:admin_utils_site_change', args=[quote(self.site.pk)]) + response = self.client.post(change_url, post_data) + self.assertRedirects(response, reverse('admin:admin_utils_site_changelist')) + self.assertQuerysetEqual(Article.objects.filter(pk=a2.pk), []) + logentry = LogEntry.objects.filter(content_type__model__iexact='site').latest('action_time') + self.assertEqual( + json.loads(logentry.change_message), + [ + {"changed": {"fields": ["domain"]}}, + {"added": {"object": "Article object", "name": "article"}}, + {"changed": {"fields": ["title"], "object": "Article object", "name": "article"}}, + {"deleted": {"object": "Article object", "name": "article"}}, + ] + ) + self.assertEqual( + logentry.get_change_message(), + 'Changed domain. Added article "Article object". ' + 'Changed title for article "Article object". Deleted article "Article object".' + ) + with translation.override('fr'): + self.assertEqual( + logentry.get_change_message(), + 'Modification de domain. Article « Article object » ajouté. ' + 'Modification de title pour l\'objet article « Article object ». Article « Article object » supprimé.' + ) + def test_logentry_get_edited_object(self): """ LogEntry.get_edited_object() returns the edited object of a LogEntry @@ -114,7 +196,7 @@ class LogEntryTests(TestCase): """ proxy_content_type = ContentType.objects.get_for_model(ArticleProxy, for_concrete_model=False) post_data = { - 'site': self.site.pk, 'title': "Foo", 'title2': "Bar", + 'site': self.site.pk, 'title': "Foo", 'hist': "Bar", 'created_0': '2015-12-25', 'created_1': '00:00', } changelist_url = reverse('admin:admin_utils_articleproxy_changelist') diff --git a/tests/admin_utils/tests.py b/tests/admin_utils/tests.py index 6e054a8537..694c529b76 100644 --- a/tests/admin_utils/tests.py +++ b/tests/admin_utils/tests.py @@ -203,12 +203,12 @@ class UtilsTests(SimpleTestCase): "title" ) self.assertEqual( - label_for_field("title2", Article), - "another name" + label_for_field("hist", Article), + "History" ) self.assertEqual( - label_for_field("title2", Article, return_attr=True), - ("another name", None) + label_for_field("hist", Article, return_attr=True), + ("History", None) ) self.assertEqual( |