From 151426692ec35035247bc3cd2447b536b4ef4236 Mon Sep 17 00:00:00 2001 From: Boulder Sprinters Date: Tue, 15 May 2007 16:03:18 +0000 Subject: boulder-oracle-sprint: Merged to [5245] git-svn-id: http://code.djangoproject.com/svn/django/branches/boulder-oracle-sprint@5246 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/formtools/preview.py | 11 +++-- django/core/management.py | 8 ++-- django/newforms/forms.py | 18 ++++---- django/newforms/models.py | 12 ++--- docs/newforms.txt | 28 +++++------ extras/django_bash_completion | 60 ++++++++++++------------ tests/modeltests/model_forms/models.py | 14 +++--- tests/regressiontests/forms/regressions.py | 2 +- tests/regressiontests/forms/tests.py | 74 +++++++++++++++--------------- 9 files changed, 115 insertions(+), 112 deletions(-) diff --git a/django/contrib/formtools/preview.py b/django/contrib/formtools/preview.py index daecba7928..351d991762 100644 --- a/django/contrib/formtools/preview.py +++ b/django/contrib/formtools/preview.py @@ -24,7 +24,7 @@ Usage Subclass FormPreview and define a done() method: - def done(self, request, clean_data): + def done(self, request, cleaned_data): # ... This method takes an HttpRequest object and a dictionary of the form data after @@ -113,7 +113,7 @@ class FormPreview(object): if f.is_valid(): if self.security_hash(request, f) != request.POST.get(self.unused_name('hash')): return self.failed_hash(request) # Security hash failed. - return self.done(request, f.clean_data) + return self.done(request, f.cleaned_data) else: return render_to_response(self.form_template, {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state}, @@ -160,6 +160,9 @@ class FormPreview(object): # METHODS SUBCLASSES MUST OVERRIDE ######################################## - def done(self, request, clean_data): - "Does something with the clean_data and returns an HttpResponseRedirect." + def done(self, request, cleaned_data): + """ + Does something with the cleaned_data and returns an + HttpResponseRedirect. + """ raise NotImplementedError('You must define a done() method on your %s subclass.' % self.__class__.__name__) diff --git a/django/core/management.py b/django/core/management.py index 79e57ff0c8..c786c51011 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -637,7 +637,7 @@ def syncdb(verbosity=1, interactive=True): # Install the 'initialdata' fixture, using format discovery load_data(['initial_data'], verbosity=verbosity) syncdb.help_doc = "Create the database tables for all apps in INSTALLED_APPS whose tables haven't already been created." -syncdb.args = '[--verbosity] [--interactive]' +syncdb.args = '[--verbosity] [--noinput]' def get_admin_index(app): "Returns admin-index template snippet (in list form) for the given app." @@ -731,7 +731,7 @@ The full error: """ % (app_name, app_name)) + style.ERROR_OUTPUT(str(e)) + '\n') else: print "Reset cancelled." reset.help_doc = "Executes ``sqlreset`` for the given app(s) in the current database." -reset.args = '[--interactive]' + APP_ARGS +reset.args = '[--noinput]' + APP_ARGS def flush(verbosity=1, interactive=True): "Returns all tables in the database to the same state they were in immediately after syncdb." @@ -792,7 +792,7 @@ The full error: """ % settings.DATABASE_NAME + style.ERROR_OUTPUT(str(e)) + '\n' else: print "Flush cancelled." flush.help_doc = "Executes ``sqlflush`` on the current database." -flush.args = '[--verbosity] [--interactive]' +flush.args = '[--verbosity] [--noinput]' def _start_helper(app_or_project, name, directory, other_name=''): other = {'project': 'app', 'app': 'project'}[app_or_project] @@ -1511,7 +1511,7 @@ def dump_data(app_labels, format='json', indent=None): except Exception, e: sys.stderr.write(style.ERROR("Unable to serialize database: %s\n" % e)) dump_data.help_doc = 'Output the contents of the database as a fixture of the given format' -dump_data.args = '[--format]' + APP_ARGS +dump_data.args = '[--format] [--indent]' + APP_ARGS # Utilities for command-line script diff --git a/django/newforms/forms.py b/django/newforms/forms.py index f624e005e9..0923cd50ea 100644 --- a/django/newforms/forms.py +++ b/django/newforms/forms.py @@ -169,13 +169,13 @@ class BaseForm(StrAndUnicode): def full_clean(self): """ - Cleans all of self.data and populates self.__errors and self.clean_data. + Cleans all of self.data and populates self.__errors and self.cleaned_data. """ errors = ErrorDict() if not self.is_bound: # Stop further processing. self.__errors = errors return - self.clean_data = {} + self.cleaned_data = {} for name, field in self.fields.items(): # value_from_datadict() gets the data from the dictionary. # Each widget type knows how to retrieve its own data, because some @@ -183,18 +183,18 @@ class BaseForm(StrAndUnicode): value = field.widget.value_from_datadict(self.data, self.add_prefix(name)) try: value = field.clean(value) - self.clean_data[name] = value - if hasattr(self, 'do_clean_%s' % name): - value = getattr(self, 'do_clean_%s' % name)() - self.clean_data[name] = value + self.cleaned_data[name] = value + if hasattr(self, 'clean_%s' % name): + value = getattr(self, 'clean_%s' % name)() + self.cleaned_data[name] = value except ValidationError, e: errors[name] = e.messages try: - self.clean_data = self.clean() + self.cleaned_data = self.clean() except ValidationError, e: errors[NON_FIELD_ERRORS] = e.messages if errors: - delattr(self, 'clean_data') + delattr(self, 'cleaned_data') self.__errors = errors def clean(self): @@ -204,7 +204,7 @@ class BaseForm(StrAndUnicode): not be associated with a particular field; it will have a special-case association with the field named '__all__'. """ - return self.clean_data + return self.cleaned_data class Form(BaseForm): "A collection of Fields, plus their associated data." diff --git a/django/newforms/models.py b/django/newforms/models.py index ea99ca9ea0..9d7d027031 100644 --- a/django/newforms/models.py +++ b/django/newforms/models.py @@ -14,7 +14,7 @@ __all__ = ('save_instance', 'form_for_model', 'form_for_instance', 'form_for_fie def save_instance(form, instance, fields=None, fail_message='saved', commit=True): """ - Saves bound Form ``form``'s clean_data into model instance ``instance``. + Saves bound Form ``form``'s cleaned_data into model instance ``instance``. Assumes ``form`` has a field for every non-AutoField database field in ``instance``. If commit=True, then the changes to ``instance`` will be @@ -24,20 +24,20 @@ def save_instance(form, instance, fields=None, fail_message='saved', commit=True opts = instance.__class__._meta if form.errors: raise ValueError("The %s could not be %s because the data didn't validate." % (opts.object_name, fail_message)) - clean_data = form.clean_data + cleaned_data = form.cleaned_data for f in opts.fields: - if not f.editable or isinstance(f, models.AutoField) or not f.name in clean_data: + if not f.editable or isinstance(f, models.AutoField) or not f.name in cleaned_data: continue if fields and f.name not in fields: continue - setattr(instance, f.name, clean_data[f.name]) + setattr(instance, f.name, cleaned_data[f.name]) if commit: instance.save() for f in opts.many_to_many: if fields and f.name not in fields: continue - if f.name in clean_data: - setattr(instance, f.attname, clean_data[f.name]) + if f.name in cleaned_data: + setattr(instance, f.attname, cleaned_data[f.name]) # GOTCHA: If many-to-many data is given and commit=False, the many-to-many # data will be lost. This happens because a many-to-many options cannot be # set on an object until after it's saved. Maybe we should raise an diff --git a/docs/newforms.txt b/docs/newforms.txt index 7c861ed405..ed43670960 100644 --- a/docs/newforms.txt +++ b/docs/newforms.txt @@ -230,7 +230,7 @@ object. Regardless of whether you pass it a string in the format it's valid. Once you've created a ``Form`` instance with a set of data and validated it, -you can access the clean data via the ``clean_data`` attribute of the ``Form`` +you can access the clean data via the ``cleaned_data`` attribute of the ``Form`` object:: >>> data = {'subject': 'hello', @@ -240,7 +240,7 @@ object:: >>> f = ContactForm(data) >>> f.is_valid() True - >>> f.clean_data + >>> f.cleaned_data {'cc_myself': True, 'message': u'Hi there', 'sender': u'foo@example.com', 'subject': u'hello'} Note that any text-based field -- such as ``CharField`` or ``EmailField`` -- @@ -248,7 +248,7 @@ always cleans the input into a Unicode string. We'll cover the encoding implications later in this document. If your data does *not* validate, your ``Form`` instance will not have a -``clean_data`` attribute:: +``cleaned_data`` attribute:: >>> data = {'subject': '', ... 'message': 'Hi there', @@ -257,15 +257,15 @@ If your data does *not* validate, your ``Form`` instance will not have a >>> f = ContactForm(data) >>> f.is_valid() False - >>> f.clean_data + >>> f.cleaned_data Traceback (most recent call last): ... - AttributeError: 'ContactForm' object has no attribute 'clean_data' + AttributeError: 'ContactForm' object has no attribute 'cleaned_data' -``clean_data`` will always *only* contain a key for fields defined in the +``cleaned_data`` will always *only* contain a key for fields defined in the ``Form``, even if you pass extra data when you define the ``Form``. In this example, we pass a bunch of extra fields to the ``ContactForm`` constructor, -but ``clean_data`` contains only the form's fields:: +but ``cleaned_data`` contains only the form's fields:: >>> data = {'subject': 'hello', ... 'message': 'Hi there', @@ -277,13 +277,13 @@ but ``clean_data`` contains only the form's fields:: >>> f = ContactForm(data) >>> f.is_valid() True - >>> f.clean_data # Doesn't contain extra_field_1, etc. + >>> f.cleaned_data # Doesn't contain extra_field_1, etc. {'cc_myself': True, 'message': u'Hi there', 'sender': u'foo@example.com', 'subject': u'hello'} -``clean_data`` will include a key and value for *all* fields defined in the +``cleaned_data`` will include a key and value for *all* fields defined in the ``Form``, even if the data didn't include a value for fields that are not required. In this example, the data dictionary doesn't include a value for the -``nick_name`` field, but ``clean_data`` includes it, with an empty value:: +``nick_name`` field, but ``cleaned_data`` includes it, with an empty value:: >>> class OptionalPersonForm(Form): ... first_name = CharField() @@ -293,10 +293,10 @@ required. In this example, the data dictionary doesn't include a value for the >>> f = OptionalPersonForm(data) >>> f.is_valid() True - >>> f.clean_data + >>> f.cleaned_data {'nick_name': u'', 'first_name': u'John', 'last_name': u'Lennon'} -In this above example, the ``clean_data`` value for ``nick_name`` is set to an +In this above example, the ``cleaned_data`` value for ``nick_name`` is set to an empty string, because ``nick_name`` is ``CharField``, and ``CharField``\s treat empty values as an empty string. Each field type knows what its "blank" value is -- e.g., for ``DateField``, it's ``None`` instead of the empty string. @@ -308,10 +308,10 @@ It's meaningless to request "clean" data in a form with no data, but, for the record, here's what happens with unbound forms:: >>> f = ContactForm() - >>> f.clean_data + >>> f.cleaned_data Traceback (most recent call last): ... - AttributeError: 'ContactForm' object has no attribute 'clean_data' + AttributeError: 'ContactForm' object has no attribute 'cleaned_data' Outputting forms as HTML ------------------------ diff --git a/extras/django_bash_completion b/extras/django_bash_completion index 64d8961ca7..8906609a68 100644 --- a/extras/django_bash_completion +++ b/extras/django_bash_completion @@ -42,13 +42,13 @@ _django_completion() prev="${COMP_WORDS[COMP_CWORD-1]}" # Standalone options - opts="--help --settings --pythonpath --version" + opts="--help --settings --pythonpath --noinput --noreload --format --indent --verbosity --adminmedia --version" # Actions actions="adminindex createcachetable dbshell diffsettings \ - inspectdb install reset runfcgi runserver \ - shell sql sqlall sqlclear sqlindexes sqlinitialdata \ + dumpdata flush inspectdb loaddata reset runfcgi runserver \ + shell sql sqlall sqlclear sqlcustom sqlflush sqlindexes \ sqlreset sqlsequencereset startapp startproject \ - syncdb validate" + syncdb test validate" # Action's options action_shell_opts="--plain" action_runfcgi_opts="host port socket method maxspare minspare maxchildren daemonize pidfile workdir" @@ -84,33 +84,33 @@ _django_completion() esac else case ${prev} in - adminindex|install|reset| \ - sql|sqlall|sqlclear|sqlindexes| \ - sqlinitialdata|sqlreset|sqlsequencereset) - # App completion - settings="" - # If settings.py in the PWD, use that - if [ -e settings.py ] ; then - settings="$PWD/settings.py" - else - # Use the ENV variable if it is set - if [ $DJANGO_SETTINGS_MODULE ] ; then - settings=$DJANGO_SETTINGS_MODULE + adminindex|dumpdata|reset| \ + sql|sqlall|sqlclear|sqlcustom|sqlindexes| \ + sqlreset|sqlsequencereset|test) + # App completion + settings="" + # If settings.py in the PWD, use that + if [ -e settings.py ] ; then + settings="$PWD/settings.py" + else + # Use the ENV variable if it is set + if [ $DJANGO_SETTINGS_MODULE ] ; then + settings=$DJANGO_SETTINGS_MODULE + fi fi - fi - # Couldn't find settings so return nothing - if [ -z $settings ] ; then - COMPREPLY=() - # Otherwise inspect settings.py file - else - apps=`sed -n "/INSTALLED_APPS = (/,/)/p" $settings | \ - grep -v "django.contrib" | - sed -n "s/^[ ]*'\(.*\.\)*\(.*\)'.*$/\2 /pg" | \ - tr -d "\n"` - COMPREPLY=( $(compgen -W "${apps}" -- ${cur}) ) - fi - return 0 - ;; + # Couldn't find settings so return nothing + if [ -z $settings ] ; then + COMPREPLY=() + # Otherwise inspect settings.py file + else + apps=`sed -n "/INSTALLED_APPS = (/,/)/p" $settings | \ + grep -v "django.contrib" | + sed -n "s/^[ ]*'\(.*\.\)*\(.*\)'.*$/\2 /pg" | \ + tr -d "\n"` + COMPREPLY=( $(compgen -W "${apps}" -- ${cur}) ) + fi + return 0 + ;; createcachetable|dbshell|diffsettings| \ inspectdb|runserver|startapp|startproject|syncdb| \ diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py index e78f5f7bd7..6ffd4d1bce 100644 --- a/tests/modeltests/model_forms/models.py +++ b/tests/modeltests/model_forms/models.py @@ -18,7 +18,7 @@ other Form, with one additional method: save(). The save() method updates the model instance. It also takes a commit=True parameter. The function django.newforms.save_instance() takes a bound form instance and a -model instance and saves the form's clean_data into the instance. It also takes +model instance and saves the form's cleaned_data into the instance. It also takes a commit=True parameter. """ @@ -94,7 +94,7 @@ __test__ = {'API_TESTS': """ >>> f = CategoryForm({'name': 'Entertainment', 'url': 'entertainment'}) >>> f.is_valid() True ->>> f.clean_data +>>> f.cleaned_data {'url': u'entertainment', 'name': u'Entertainment'} >>> obj = f.save() >>> obj @@ -105,7 +105,7 @@ True >>> f = CategoryForm({'name': "It's a test", 'url': 'test'}) >>> f.is_valid() True ->>> f.clean_data +>>> f.cleaned_data {'url': u'test', 'name': u"It's a test"} >>> obj = f.save() >>> obj @@ -119,7 +119,7 @@ save() on the resulting model instance. >>> f = CategoryForm({'name': 'Third test', 'url': 'third'}) >>> f.is_valid() True ->>> f.clean_data +>>> f.cleaned_data {'url': u'third', 'name': u'Third test'} >>> obj = f.save(commit=False) >>> obj @@ -134,10 +134,10 @@ If you call save() with invalid data, you'll get a ValueError. >>> f = CategoryForm({'name': '', 'url': 'foo'}) >>> f.errors {'name': [u'This field is required.']} ->>> f.clean_data +>>> f.cleaned_data Traceback (most recent call last): ... -AttributeError: 'CategoryForm' object has no attribute 'clean_data' +AttributeError: 'CategoryForm' object has no attribute 'cleaned_data' >>> f.save() Traceback (most recent call last): ... @@ -524,6 +524,6 @@ ValidationError: [u'Select a valid choice. 10 is not one of the available choice >>> f = PhoneNumberForm({'phone': '(312) 555-1212', 'description': 'Assistance'}) >>> f.is_valid() True ->>> f.clean_data +>>> f.cleaned_data {'phone': u'312-555-1212', 'description': u'Assistance'} """} diff --git a/tests/regressiontests/forms/regressions.py b/tests/regressiontests/forms/regressions.py index 789ac81715..5fe057b5d8 100644 --- a/tests/regressiontests/forms/regressions.py +++ b/tests/regressiontests/forms/regressions.py @@ -46,6 +46,6 @@ doesn't come back. >>> f = DataForm({'data': 'xyzzy'}) >>> f.is_valid() True ->>> f.clean_data +>>> f.cleaned_data {'data': u'xyzzy'} """ diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py index 82be58dd0c..5afa3d198d 100644 --- a/tests/regressiontests/forms/tests.py +++ b/tests/regressiontests/forms/tests.py @@ -1774,7 +1774,7 @@ True u'' >>> p.errors.as_text() u'' ->>> p.clean_data +>>> p.cleaned_data {'first_name': u'John', 'last_name': u'Lennon', 'birthday': datetime.date(1940, 10, 9)} >>> print p['first_name'] @@ -1810,10 +1810,10 @@ True {'first_name': [u'This field is required.'], 'last_name': [u'This field is required.'], 'birthday': [u'This field is required.']} >>> p.is_valid() False ->>> p.clean_data +>>> p.cleaned_data Traceback (most recent call last): ... -AttributeError: 'Person' object has no attribute 'clean_data' +AttributeError: 'Person' object has no attribute 'cleaned_data' >>> print p @@ -1844,10 +1844,10 @@ False {} >>> p.is_valid() False ->>> p.clean_data +>>> p.cleaned_data Traceback (most recent call last): ... -AttributeError: 'Person' object has no attribute 'clean_data' +AttributeError: 'Person' object has no attribute 'cleaned_data' >>> print p @@ -1886,10 +1886,10 @@ u'