Mercurial > personas_backend
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