changeset 75:a652394445e1

Refactored the way header/footer validation is done again.
author Atul Varma <varmaa@toolness.com>
date Tue, 11 Mar 2008 21:20:17 -0500
parents ec926b106c68
children 1aa3bc05f05e
files PersonasBackend/personas/forms.py PersonasBackend/personas/models.py
diffstat 2 files changed, 71 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/PersonasBackend/personas/forms.py	Tue Mar 11 19:05:51 2008 -0500
+++ b/PersonasBackend/personas/forms.py	Tue Mar 11 21:20:17 2008 -0500
@@ -12,20 +12,9 @@
         exclude = ["owner", "status"]
 
     def clean( self ):
-        for name in ["header", "footer"]:
-            num_filled = models.get_num_filled(
-                self.cleaned_data["%s_img_url" % name],
-                self.cleaned_data["%s_img_file" % name],
-                )
-            if num_filled == 0:
-                raise ValidationError(
-                    "Please enter a URL for the %s or "
-                    "upload a file." % name
-                    )
-            elif num_filled == 2:
-                raise ValidationError(
-                    "Please enter a URL for the %s or "
-                    "upload a file, but not both." % name
-                    )
+        try:
+            models.ensure_header_and_footer_are_valid( self.cleaned_data )
+        except ValueError, e:
+            raise ValidationError( e.message )
 
         return self.cleaned_data
--- a/PersonasBackend/personas/models.py	Tue Mar 11 19:05:51 2008 -0500
+++ b/PersonasBackend/personas/models.py	Tue Mar 11 21:20:17 2008 -0500
@@ -55,6 +55,71 @@
 from django.contrib.auth.models import User
 from django.contrib.sites.models import Site
 
+def ensure_header_and_footer_are_valid( form_data ):
+    """
+    Given a dictionry that corresponds to the form data for a Persona,
+    raises a ValueError if there's any problems with the way the
+    header/footer information have been filled out.
+
+    Examples:
+
+      >>> form_data = {
+      ...   'header_img_url' : u'',
+      ...   'header_img_file' : u'',
+      ...   'footer_img_url' : u'',
+      ...   'footer_img_file' : u''
+      ... }
+      >>> ensure_header_and_footer_are_valid( form_data )
+      Traceback (most recent call last):
+      ...
+      ValueError: Please enter a URL for the header or upload a file.
+
+      >>> form_data['header_img_url'] = u'http://mystuff.com/img.jpg'
+      >>> ensure_header_and_footer_are_valid( form_data )
+      Traceback (most recent call last):
+      ...
+      ValueError: Please enter a URL for the footer or upload a file.
+
+      >>> form_data['footer_img_url'] = u'http://mystuff.com/img2.jpg'
+      >>> ensure_header_and_footer_are_valid( form_data )
+
+      >>> form_data['footer_img_file'] = u'img3.jpg'
+      >>> ensure_header_and_footer_are_valid( form_data )
+      Traceback (most recent call last):
+      ...
+      ValueError: You can't submit both a URL and a file for the footer.
+    """
+
+    for name in ["header", "footer"]:
+        num_filled = get_num_filled(
+            form_data["%s_img_url" % name],
+            form_data["%s_img_file" % name],
+            )
+        if num_filled == 0:
+            raise ValueError(
+                "Please enter a URL for the %s or "
+                "upload a file." % name
+                )
+        elif num_filled == 2:
+            raise ValueError(
+                "You can't submit both a URL and a "
+                "file for the %s." % name
+                )
+
+def header_and_footer_validator( field_data, all_data ):
+    """
+    Old-style forms Django validator wrapper for
+    ensure_header_and_footer_are_valid().  This is needed because
+    Django's admin interface currently uses old-style forms.
+    """
+
+    from django.core import validators
+
+    try:
+        ensure_header_and_footer_are_valid( all_data )
+    except ValueError, e:
+        raise validators.ValidationError( e.message )
+
 def get_num_filled( arg1, arg2 ):
     """
     Returns how many of the given arguments evaluate to a boolean
@@ -151,6 +216,7 @@
     name = models.CharField(
         max_length=MAX_NAME_LENGTH,
         blank=False,
+        validator_list = [header_and_footer_validator],
         )
 
     owner = models.ForeignKey(
@@ -365,16 +431,7 @@
           u'test.png'
         """
 
-        for name in ["header", "footer"]:
-            num_filled = get_num_filled(
-                getattr( self, "%s_img_url" % name ),
-                getattr( self, "%s_img_file" % name ),
-                )
-            if num_filled != 1:
-                raise AssertionError(
-                    "%d field(s) for %s is/are filled." % (num_filled,
-                                                           name)
-                    )
+        ensure_header_and_footer_are_valid( self.__dict__ )
 
         if updater:
             self.updater = updater