From faceca7075d72d55f0eebc586049fb634cd46129 Mon Sep 17 00:00:00 2001
From: Russell Keith-Magee <russell@keith-magee.com>
Date: Sun, 11 Apr 2010 08:35:04 +0000
Subject: [PATCH] Fixed #13301 -- Corrected problem with capitalization of
 changelist row headers in admin. Thanks to emyller for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12947 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 django/contrib/admin/helpers.py               | 13 +++++++++----
 .../contrib/admin/templatetags/admin_list.py  |  1 -
 django/contrib/admin/util.py                  |  5 +++--
 tests/regressiontests/admin_util/models.py    |  2 +-
 tests/regressiontests/admin_util/tests.py     | 19 ++++++++++---------
 tests/regressiontests/admin_views/models.py   |  7 +++++--
 tests/regressiontests/admin_views/tests.py    |  1 +
 7 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/django/contrib/admin/helpers.py b/django/contrib/admin/helpers.py
index c38023b6fd..52d01839cc 100644
--- a/django/contrib/admin/helpers.py
+++ b/django/contrib/admin/helpers.py
@@ -7,6 +7,7 @@ from django.core.exceptions import ObjectDoesNotExist
 from django.db.models.fields import FieldDoesNotExist
 from django.db.models.fields.related import ManyToManyRel
 from django.forms.util import flatatt
+from django.template.defaultfilters import capfirst
 from django.utils.encoding import force_unicode, smart_unicode
 from django.utils.html import escape, conditional_escape
 from django.utils.safestring import mark_safe
@@ -132,8 +133,12 @@ class AdminReadonlyField(object):
         # Make self.field look a little bit like a field. This means that
         # {{ field.name }} must be a useful class name to identify the field.
         # For convenience, store other field-related data here too.
+        if callable(field):
+            class_name = field.__name__ != '<lambda>' and field.__name__ or ''
+        else:
+            class_name = field
         self.field = {
-            'name': force_unicode(label != '--' and label or ''),
+            'name': class_name,
             'label': label,
             'field': field,
         }
@@ -147,8 +152,8 @@ class AdminReadonlyField(object):
         attrs = {}
         if not self.is_first:
             attrs["class"] = "inline"
-        label = forms.forms.pretty_name(self.field['label'])
-        contents = force_unicode(escape(label)) + u":"
+        label = self.field['label']
+        contents = capfirst(force_unicode(escape(label))) + u":"
         return mark_safe('<label%(attrs)s>%(contents)s</label>' % {
             "attrs": flatatt(attrs),
             "contents": contents,
@@ -213,7 +218,7 @@ class InlineAdminFormSet(object):
                 continue
             if field in self.readonly_fields:
                 label = label_for_field(field, self.opts.model, self.model_admin)
-                yield (False, forms.forms.pretty_name(label))
+                yield (False, label)
             else:
                 field = self.formset.form.base_fields[field]
                 yield (field.widget.is_hidden, field.label)
diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py
index b1ab7d543c..3f0b9c6360 100644
--- a/django/contrib/admin/templatetags/admin_list.py
+++ b/django/contrib/admin/templatetags/admin_list.py
@@ -88,7 +88,6 @@ def result_headers(cl):
                     "class_attrib": mark_safe(' class="action-checkbox-column"')
                 }
                 continue
-            header = pretty_name(header)
 
             # It is a non-field, but perhaps one that is sortable
             admin_order_field = getattr(attr, "admin_order_field", None)
diff --git a/django/contrib/admin/util.py b/django/contrib/admin/util.py
index f727626a03..776a6f0f42 100644
--- a/django/contrib/admin/util.py
+++ b/django/contrib/admin/util.py
@@ -1,5 +1,6 @@
 from django.core.exceptions import ObjectDoesNotExist
 from django.db import models
+from django.forms.forms import pretty_name
 from django.utils import formats
 from django.utils.html import escape
 from django.utils.safestring import mark_safe
@@ -303,9 +304,9 @@ def label_for_field(name, model, model_admin=None, return_attr=False):
                 if attr.__name__ == "<lambda>":
                     label = "--"
                 else:
-                    label = attr.__name__
+                    label = pretty_name(attr.__name__)
             else:
-                label = name
+                label = pretty_name(name)
     if return_attr:
         return (label, attr)
     else:
diff --git a/tests/regressiontests/admin_util/models.py b/tests/regressiontests/admin_util/models.py
index e81f7bbc25..493e1271ad 100644
--- a/tests/regressiontests/admin_util/models.py
+++ b/tests/regressiontests/admin_util/models.py
@@ -16,7 +16,7 @@ class Article(models.Model):
 
     def test_from_model_with_override(self):
         return "nothing"
-    test_from_model_with_override.short_description = "not what you expect"
+    test_from_model_with_override.short_description = "not What you Expect"
 
 class Count(models.Model):
     num = models.PositiveSmallIntegerField()
diff --git a/tests/regressiontests/admin_util/tests.py b/tests/regressiontests/admin_util/tests.py
index f874b318f9..5ea0ac585e 100644
--- a/tests/regressiontests/admin_util/tests.py
+++ b/tests/regressiontests/admin_util/tests.py
@@ -157,7 +157,7 @@ class UtilTests(unittest.TestCase):
             "another name"
         )
         self.assertEquals(
-            label_for_field("title2", Article, return_attr=True), 
+            label_for_field("title2", Article, return_attr=True),
             ("another name", None)
         )
 
@@ -179,24 +179,24 @@ class UtilTests(unittest.TestCase):
             return "nothing"
         self.assertEquals(
             label_for_field(test_callable, Article),
-            "test_callable"
+            "Test callable"
         )
         self.assertEquals(
             label_for_field(test_callable, Article, return_attr=True),
-            ("test_callable", test_callable)
+            ("Test callable", test_callable)
         )
 
         self.assertEquals(
             label_for_field("test_from_model", Article),
-            "test_from_model"
+            "Test from model"
         )
         self.assertEquals(
             label_for_field("test_from_model", Article, return_attr=True),
-            ("test_from_model", Article.test_from_model)
+            ("Test from model", Article.test_from_model)
         )
         self.assertEquals(
             label_for_field("test_from_model_with_override", Article),
-            "not what you expect"
+            "not What you Expect"
         )
 
         self.assertEquals(
@@ -207,15 +207,16 @@ class UtilTests(unittest.TestCase):
         class MockModelAdmin(object):
             def test_from_model(self, obj):
                 return "nothing"
-            test_from_model.short_description = "not really the model"
+            test_from_model.short_description = "not Really the Model"
+
         self.assertEquals(
             label_for_field("test_from_model", Article, model_admin=MockModelAdmin),
-            "not really the model"
+            "not Really the Model"
         )
         self.assertEquals(
             label_for_field("test_from_model", Article,
                 model_admin = MockModelAdmin,
                 return_attr = True
             ),
-            ("not really the model", MockModelAdmin.test_from_model)
+            ("not Really the Model", MockModelAdmin.test_from_model)
         )
diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py
index be5782886f..a2700ba747 100644
--- a/tests/regressiontests/admin_views/models.py
+++ b/tests/regressiontests/admin_views/models.py
@@ -474,7 +474,7 @@ class Post(models.Model):
 
 class PostAdmin(admin.ModelAdmin):
     list_display = ['title', 'public']
-    readonly_fields = ('posted', 'awesomeness_level', 'coolness', lambda obj: "foo")
+    readonly_fields = ('posted', 'awesomeness_level', 'coolness', 'value', lambda obj: "foo")
 
     inlines = [
         LinkInline
@@ -486,6 +486,9 @@ class PostAdmin(admin.ModelAdmin):
         else:
             return "Unkown coolness."
 
+    def value(self, instance):
+        return 1000
+    value.short_description = 'Value in $US'
 
 class Gadget(models.Model):
     name = models.CharField(max_length=100)
@@ -567,7 +570,7 @@ class CyclicTwo(models.Model):
         return self.name
 
 class Topping(models.Model):
-    name = models.CharField(max_length=20) 
+    name = models.CharField(max_length=20)
 
 class Pizza(models.Model):
     name = models.CharField(max_length=20)
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index 8749fee5ce..23964a949c 100644
--- a/tests/regressiontests/admin_views/tests.py
+++ b/tests/regressiontests/admin_views/tests.py
@@ -1970,6 +1970,7 @@ class ReadonlyTest(TestCase):
         self.assertContains(response, '<div class="form-row coolness">')
         self.assertContains(response, '<div class="form-row awesomeness_level">')
         self.assertContains(response, '<div class="form-row posted">')
+        self.assertContains(response, '<div class="form-row value">')
         self.assertContains(response, '<div class="form-row ">')
 
         p = Post.objects.create(title="I worked on readonly_fields", content="Its good stuff")