summaryrefslogtreecommitdiff
path: root/tests/admin_utils
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2015-12-26 19:51:22 +0100
committerClaude Paroz <claude@2xlibre.net>2016-01-08 20:34:59 +0100
commitcf7894be88f6c27680ef80796b883f6e3b709b8b (patch)
tree6620fd9dea735a2b91ccde0a7168d3098823e0fb /tests/admin_utils
parent56aaae58a746eb39d5e92ba60f59f4c750a8e1a8 (diff)
downloaddjango-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.py13
-rw-r--r--tests/admin_utils/models.py5
-rw-r--r--tests/admin_utils/test_logentry.py88
-rw-r--r--tests/admin_utils/tests.py8
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(