diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-07-29 05:09:29 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-07-29 05:09:29 +0000 |
| commit | b3b71a0922334c70bbc646a4873010f808196671 (patch) | |
| tree | d2e2e466066f4748ee7bb17d9c3006b8c790a39e /tests | |
| parent | 7bc728c826aa83338c5566f7f9e919de62f73390 (diff) | |
Fixed #7560 -- Moved a lot of the value conversion preparation for
loading/saving interactions with the databases into django.db.backend. This
helps external db backend writers and removes a bunch of database-specific
if-tests in django.db.models.fields.
Great work from Leo Soto.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@8131 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/modeltests/custom_methods/models.py | 3 | ||||
| -rw-r--r-- | tests/modeltests/validation/models.py | 22 | ||||
| -rw-r--r-- | tests/regressiontests/model_fields/tests.py | 24 | ||||
| -rw-r--r-- | tests/regressiontests/model_regress/models.py | 19 |
4 files changed, 59 insertions, 9 deletions
diff --git a/tests/modeltests/custom_methods/models.py b/tests/modeltests/custom_methods/models.py index b0ca4131a5..d420871373 100644 --- a/tests/modeltests/custom_methods/models.py +++ b/tests/modeltests/custom_methods/models.py @@ -31,7 +31,8 @@ class Article(models.Model): SELECT id, headline, pub_date FROM custom_methods_article WHERE pub_date = %s - AND id != %s""", [str(self.pub_date), self.id]) + AND id != %s""", [connection.ops.value_to_db_date(self.pub_date), + self.id]) # The asterisk in "(*row)" tells Python to expand the list into # positional arguments to Article(). return [self.__class__(*row) for row in cursor.fetchall()] diff --git a/tests/modeltests/validation/models.py b/tests/modeltests/validation/models.py index 63f9f7a361..7ed9d66674 100644 --- a/tests/modeltests/validation/models.py +++ b/tests/modeltests/validation/models.py @@ -16,6 +16,7 @@ class Person(models.Model): birthdate = models.DateField() favorite_moment = models.DateTimeField() email = models.EmailField() + best_time = models.TimeField() def __unicode__(self): return self.name @@ -28,7 +29,8 @@ __test__ = {'API_TESTS':""" ... 'name': 'John', ... 'birthdate': datetime.date(2000, 5, 3), ... 'favorite_moment': datetime.datetime(2002, 4, 3, 13, 23), -... 'email': 'john@example.com' +... 'email': 'john@example.com', +... 'best_time': datetime.time(16, 20), ... } >>> p = Person(**valid_params) >>> p.validate() @@ -130,6 +132,22 @@ datetime.datetime(2002, 4, 3, 13, 23) >>> p.favorite_moment datetime.datetime(2002, 4, 3, 0, 0) +>>> p = Person(**dict(valid_params, best_time='16:20:00')) +>>> p.validate() +{} +>>> p.best_time +datetime.time(16, 20) + +>>> p = Person(**dict(valid_params, best_time='16:20')) +>>> p.validate() +{} +>>> p.best_time +datetime.time(16, 20) + +>>> p = Person(**dict(valid_params, best_time='bar')) +>>> p.validate()['best_time'] +[u'Enter a valid time in HH:MM[:ss[.uuuuuu]] format.'] + >>> p = Person(**dict(valid_params, email='john@example.com')) >>> p.validate() {} @@ -153,5 +171,7 @@ u'john@example.com' [u'This field is required.'] >>> errors['birthdate'] [u'This field is required.'] +>>> errors['best_time'] +[u'This field is required.'] """} diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py index c2ba9ee008..5be852f407 100644 --- a/tests/regressiontests/model_fields/tests.py +++ b/tests/regressiontests/model_fields/tests.py @@ -20,16 +20,26 @@ ValidationError: [u'This value must be a decimal number.'] >>> x = f.to_python(2) >>> y = f.to_python('2.6') ->>> f.get_db_prep_save(x) +>>> f._format(x) u'2.0' ->>> f.get_db_prep_save(y) +>>> f._format(y) u'2.6' ->>> f.get_db_prep_save(None) ->>> f.get_db_prep_lookup('exact', x) -[u'2.0'] ->>> f.get_db_prep_lookup('exact', y) -[u'2.6'] +>>> f._format(None) >>> f.get_db_prep_lookup('exact', None) [None] +# DateTimeField and TimeField to_python should support usecs: +>>> f = DateTimeField() +>>> f.to_python('2001-01-02 03:04:05.000006') +datetime.datetime(2001, 1, 2, 3, 4, 5, 6) +>>> f.to_python('2001-01-02 03:04:05.999999') +datetime.datetime(2001, 1, 2, 3, 4, 5, 999999) + +>>> f = TimeField() +>>> f.to_python('01:02:03.000004') +datetime.time(1, 2, 3, 4) +>>> f.to_python('01:02:03.999999') +datetime.time(1, 2, 3, 999999) + + """ diff --git a/tests/regressiontests/model_regress/models.py b/tests/regressiontests/model_regress/models.py index 2252531564..9e11b43d2b 100644 --- a/tests/regressiontests/model_regress/models.py +++ b/tests/regressiontests/model_regress/models.py @@ -29,6 +29,9 @@ class Movie(models.Model): class Party(models.Model): when = models.DateField() +class Event(models.Model): + when = models.DateTimeField() + __test__ = {'API_TESTS': """ (NOTE: Part of the regression test here is merely parsing the model declaration. The verbose_name, in particular, did not always work.) @@ -68,5 +71,21 @@ u'' >>> [p.when for p in Party.objects.filter(when__year = 1998)] [datetime.date(1998, 12, 31)] +# Check that get_next_by_FIELD and get_previous_by_FIELD don't crash when we +# have usecs values stored on the database +# +# [It crashed after the Field.get_db_prep_* refactor, because on most backends +# DateTimeFields supports usecs, but DateTimeField.to_python didn't recognize +# them. (Note that Model._get_next_or_previous_by_FIELD coerces values to +# strings)] +# +>>> e = Event.objects.create(when = datetime.datetime(2000, 1, 1, 16, 0, 0)) +>>> e = Event.objects.create(when = datetime.datetime(2000, 1, 1, 6, 1, 1)) +>>> e = Event.objects.create(when = datetime.datetime(2000, 1, 1, 13, 1, 1)) +>>> e = Event.objects.create(when = datetime.datetime(2000, 1, 1, 12, 0, 20, 24)) +>>> e.get_next_by_when().when +datetime.datetime(2000, 1, 1, 13, 1, 1) +>>> e.get_previous_by_when().when +datetime.datetime(2000, 1, 1, 6, 1, 1) """ } |
