From 682e435c5f334bc0211b12f05398fe79e4e72713 Mon Sep 17 00:00:00 2001
From: Adrian Holovaty <adrian@holovaty.com>
Date: Mon, 27 Nov 2006 01:55:24 +0000
Subject: [PATCH] newforms: Changed Form.errors to be a property rather than a
 function. Refs #3026

git-svn-id: http://code.djangoproject.com/svn/django/trunk@4116 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 django/newforms/forms.py             | 17 +++++++++--------
 tests/regressiontests/forms/tests.py | 24 ++++++++++++------------
 2 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/django/newforms/forms.py b/django/newforms/forms.py
index f04e04926a..f58ce2c563 100644
--- a/django/newforms/forms.py
+++ b/django/newforms/forms.py
@@ -56,19 +56,20 @@ class Form(object):
             raise KeyError('Key %r not found in Form' % name)
         return BoundField(self, field, name)
 
-    def errors(self):
+    def _errors(self):
         "Returns an ErrorDict for self.data"
         if self.__errors is None:
             self.full_clean()
         return self.__errors
+    errors = property(_errors)
 
     def is_valid(self):
         """
         Returns True if the form has no errors. Otherwise, False. This exists
         solely for convenience, so client code can use positive logic rather
-        than confusing negative logic ("if not form.errors()").
+        than confusing negative logic ("if not form.errors").
         """
-        return not bool(self.errors())
+        return not bool(self.errors)
 
     def as_table(self):
         "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
@@ -81,9 +82,9 @@ class Form(object):
     def as_table_with_errors(self):
         "Returns this form rendered as HTML <tr>s, with errors."
         output = []
-        if self.errors().get(NON_FIELD_ERRORS):
+        if self.errors.get(NON_FIELD_ERRORS):
             # Errors not corresponding to a particular field are displayed at the top.
-            output.append(u'<tr><td colspan="2"><ul>%s</ul></td></tr>' % u'\n'.join([u'<li>%s</li>' % e for e in self.errors()[NON_FIELD_ERRORS]]))
+            output.append(u'<tr><td colspan="2"><ul>%s</ul></td></tr>' % u'\n'.join([u'<li>%s</li>' % e for e in self.errors[NON_FIELD_ERRORS]]))
         for name, field in self.fields.items():
             bf = BoundField(self, field, name)
             if bf.errors:
@@ -94,9 +95,9 @@ class Form(object):
     def as_ul_with_errors(self):
         "Returns this form rendered as HTML <li>s, with errors."
         output = []
-        if self.errors().get(NON_FIELD_ERRORS):
+        if self.errors.get(NON_FIELD_ERRORS):
             # Errors not corresponding to a particular field are displayed at the top.
-            output.append(u'<li><ul>%s</ul></li>' % u'\n'.join([u'<li>%s</li>' % e for e in self.errors()[NON_FIELD_ERRORS]]))
+            output.append(u'<li><ul>%s</ul></li>' % u'\n'.join([u'<li>%s</li>' % e for e in self.errors[NON_FIELD_ERRORS]]))
         for name, field in self.fields.items():
             bf = BoundField(self, field, name)
             line = u'<li>'
@@ -162,7 +163,7 @@ class BoundField(object):
         if there are none.
         """
         try:
-            return self._form.errors()[self._name]
+            return self._form.errors[self._name]
         except KeyError:
             return ErrorList()
     errors = property(_errors)
diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py
index e588b6572b..3d7543badd 100644
--- a/tests/regressiontests/forms/tests.py
+++ b/tests/regressiontests/forms/tests.py
@@ -1163,13 +1163,13 @@ u''
 <li><ul><li>This field is required.</li></ul>Birthday: <input type="text" name="birthday" /></li>
 
 >>> p = Person({'first_name': u'John', 'last_name': u'Lennon', 'birthday': u'1940-10-9'})
->>> p.errors()
+>>> p.errors
 {}
 >>> p.is_valid()
 True
->>> p.errors().as_ul()
+>>> p.errors.as_ul()
 u''
->>> p.errors().as_text()
+>>> p.errors.as_text()
 u''
 >>> p.clean()
 {'first_name': u'John', 'last_name': u'Lennon', 'birthday': datetime.date(1940, 10, 9)}
@@ -1197,13 +1197,13 @@ u'<tr><td>First name:</td><td><input type="text" name="first_name" value="John"
 u'<li>First name: <input type="text" name="first_name" value="John" /></li>\n<li>Last name: <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" /></li>\n<li>Birthday: <input type="text" name="birthday" /></li>'
 
 >>> p = Person({'last_name': u'Lennon'})
->>> p.errors()
+>>> p.errors
 {'first_name': [u'This field is required.'], 'birthday': [u'This field is required.']}
 >>> p.is_valid()
 False
->>> p.errors().as_ul()
+>>> p.errors.as_ul()
 u'<ul class="errorlist"><li>first_name<ul class="errorlist"><li>This field is required.</li></ul></li><li>birthday<ul class="errorlist"><li>This field is required.</li></ul></li></ul>'
->>> print p.errors().as_text()
+>>> print p.errors.as_text()
 * first_name
   * This field is required.
 * birthday
@@ -1385,13 +1385,13 @@ Field.clean(), the clean_XXX() method should return the cleaned value:
 ...            raise ValidationError(u'Please make sure your passwords match.')
 ...        return self.clean_data['password2']
 >>> f = UserRegistration()
->>> f.errors()
+>>> f.errors
 {'username': [u'This field is required.'], 'password1': [u'This field is required.'], 'password2': [u'This field is required.']}
 >>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'bar'})
->>> f.errors()
+>>> f.errors
 {'password2': [u'Please make sure your passwords match.']}
 >>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'})
->>> f.errors()
+>>> f.errors
 {}
 >>> f.clean()
 {'username': u'adrian', 'password1': u'foo', 'password2': u'foo'}
@@ -1414,10 +1414,10 @@ Form.clean() still needs to return a dictionary of all clean data:
 <tr><td>Username:</td><td><input type="text" name="username" /></td></tr>
 <tr><td>Password1:</td><td><input type="password" name="password1" /></td></tr>
 <tr><td>Password2:</td><td><input type="password" name="password2" /></td></tr>
->>> f.errors()
+>>> f.errors
 {'username': [u'This field is required.'], 'password1': [u'This field is required.'], 'password2': [u'This field is required.']}
 >>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'bar'})
->>> f.errors()
+>>> f.errors
 {'__all__': [u'Please make sure your passwords match.']}
 >>> print f.as_table()
 <tr><td>Username:</td><td><input type="text" name="username" value="adrian" /></td></tr>
@@ -1434,7 +1434,7 @@ Form.clean() still needs to return a dictionary of all clean data:
 <li>Password1: <input type="password" name="password1" value="foo" /></li>
 <li>Password2: <input type="password" name="password2" value="bar" /></li>
 >>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'})
->>> f.errors()
+>>> f.errors
 {}
 >>> f.clean()
 {'username': u'adrian', 'password1': u'foo', 'password2': u'foo'}