Django

Code

root/django/trunk/tests/regressiontests/datatypes/models.py

Revision 8802, 2.8 kB (checked in by jacob, 5 days ago)

Fixed #8354: the MySQL backend no longer raises a cryptic error. Instead, it raises a less-cryptic error. Obiously this isn't a perfect solution by any means, but it'll do until we can revisit timezone handling in the future.

  • Property svn:eol-style set to native
Line 
1 """
2 This is a basic model to test saving and loading boolean and date-related
3 types, which in the past were problematic for some database backends.
4 """
5
6 from django.db import models
7 from django.conf import settings
8
9 class Donut(models.Model):
10     name = models.CharField(max_length=100)
11     is_frosted = models.BooleanField(default=False)
12     has_sprinkles = models.NullBooleanField()
13     baked_date = models.DateField(null=True)
14     baked_time = models.TimeField(null=True)
15     consumed_at = models.DateTimeField(null=True)
16
17     class Meta:
18         ordering = ('consumed_at',)
19
20     def __str__(self):
21         return self.name
22
23 __test__ = {'API_TESTS': """
24 # No donuts are in the system yet.
25 >>> Donut.objects.all()
26 []
27
28 >>> d = Donut(name='Apple Fritter')
29
30 # Ensure we're getting True and False, not 0 and 1
31 >>> d.is_frosted
32 False
33 >>> d.has_sprinkles
34 >>> d.has_sprinkles = True
35 >>> d.has_sprinkles == True
36 True
37 >>> d.save()
38 >>> d2 = Donut.objects.all()[0]
39 >>> d2
40 <Donut: Apple Fritter>
41 >>> d2.is_frosted == False
42 True
43 >>> d2.has_sprinkles == True
44 True
45
46 >>> import datetime
47 >>> d2.baked_date = datetime.date(year=1938, month=6, day=4)
48 >>> d2.baked_time = datetime.time(hour=5, minute=30)
49 >>> d2.consumed_at = datetime.datetime(year=2007, month=4, day=20, hour=16, minute=19, second=59)
50 >>> d2.save()
51
52 >>> d3 = Donut.objects.all()[0]
53 >>> d3.baked_date
54 datetime.date(1938, 6, 4)
55 >>> d3.baked_time
56 datetime.time(5, 30)
57 >>> d3.consumed_at
58 datetime.datetime(2007, 4, 20, 16, 19, 59)
59
60 # Year boundary tests (ticket #3689)
61
62 >>> d = Donut(name='Date Test 2007', baked_date=datetime.datetime(year=2007, month=12, day=31), consumed_at=datetime.datetime(year=2007, month=12, day=31, hour=23, minute=59, second=59))
63 >>> d.save()
64 >>> d1 = Donut(name='Date Test 2006', baked_date=datetime.datetime(year=2006, month=1, day=1), consumed_at=datetime.datetime(year=2006, month=1, day=1))
65 >>> d1.save()
66
67 >>> Donut.objects.filter(baked_date__year=2007)
68 [<Donut: Date Test 2007>]
69
70 >>> Donut.objects.filter(baked_date__year=2006)
71 [<Donut: Date Test 2006>]
72
73 >>> Donut.objects.filter(consumed_at__year=2007).order_by('name')
74 [<Donut: Apple Fritter>, <Donut: Date Test 2007>]
75
76 >>> Donut.objects.filter(consumed_at__year=2006)
77 [<Donut: Date Test 2006>]
78
79 >>> Donut.objects.filter(consumed_at__year=2005)
80 []
81
82 >>> Donut.objects.filter(consumed_at__year=2008)
83 []
84
85 """}
86
87 # Regression test for #8354: the MySQL backend should raise an error if given
88 # a timezone-aware datetime object.
89 if settings.DATABASE_ENGINE == 'mysql':
90     __test__['API_TESTS'] += """
91 >>> from django.utils import tzinfo
92 >>> dt = datetime.datetime(2008, 8, 31, 16, 20, tzinfo=tzinfo.FixedOffset(0))
93 >>> d = Donut(name='Bear claw', consumed_at=dt)
94 >>> d.save()
95 Traceback (most recent call last):
96     ....
97 ValueError: MySQL backend does not support timezone-aware datetimes.
98 """
Note: See TracBrowser for help on using the browser.