2009-05-28 13:46:09 +08:00
|
|
|
import os
|
|
|
|
import tempfile
|
2014-07-15 17:35:29 +08:00
|
|
|
import uuid
|
2013-09-28 16:22:46 +08:00
|
|
|
import warnings
|
2008-03-20 14:56:23 +08:00
|
|
|
|
2009-05-28 13:46:09 +08:00
|
|
|
try:
|
2014-03-21 22:54:53 +08:00
|
|
|
from PIL import Image
|
|
|
|
except ImportError:
|
2013-05-15 10:31:16 +08:00
|
|
|
Image = None
|
2009-05-28 13:46:09 +08:00
|
|
|
|
|
|
|
from django.core.files.storage import FileSystemStorage
|
|
|
|
from django.db import models
|
|
|
|
from django.db.models.fields.files import ImageFieldFile, ImageField
|
2014-07-31 04:22:04 +08:00
|
|
|
from django.utils import six
|
2009-05-28 13:46:09 +08:00
|
|
|
|
|
|
|
|
2008-03-20 14:56:23 +08:00
|
|
|
class Foo(models.Model):
|
|
|
|
a = models.CharField(max_length=10)
|
2008-07-30 08:18:49 +08:00
|
|
|
d = models.DecimalField(max_digits=5, decimal_places=3)
|
2008-03-20 14:56:23 +08:00
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2008-03-20 14:56:23 +08:00
|
|
|
def get_foo():
|
|
|
|
return Foo.objects.get(id=1)
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2008-03-20 14:56:23 +08:00
|
|
|
class Bar(models.Model):
|
|
|
|
b = models.CharField(max_length=10)
|
|
|
|
a = models.ForeignKey(Foo, default=get_foo)
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2008-07-27 15:22:39 +08:00
|
|
|
class Whiz(models.Model):
|
|
|
|
CHOICES = (
|
|
|
|
('Group 1', (
|
2013-10-20 07:33:10 +08:00
|
|
|
(1, 'First'),
|
|
|
|
(2, 'Second'),
|
2013-10-18 17:02:43 +08:00
|
|
|
)
|
2008-07-27 15:22:39 +08:00
|
|
|
),
|
|
|
|
('Group 2', (
|
2013-10-20 07:33:10 +08:00
|
|
|
(3, 'Third'),
|
|
|
|
(4, 'Fourth'),
|
2013-10-18 17:02:43 +08:00
|
|
|
)
|
2008-07-30 08:18:49 +08:00
|
|
|
),
|
2013-10-04 01:44:10 +08:00
|
|
|
(0, 'Other'),
|
2008-07-27 15:22:39 +08:00
|
|
|
)
|
|
|
|
c = models.IntegerField(choices=CHOICES, null=True)
|
2009-05-28 13:46:09 +08:00
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2014-07-31 04:22:04 +08:00
|
|
|
class Counter(six.Iterator):
|
2014-07-28 05:39:40 +08:00
|
|
|
def __init__(self):
|
|
|
|
self.n = 1
|
|
|
|
|
|
|
|
def __iter__(self):
|
|
|
|
return self
|
|
|
|
|
2014-07-31 04:22:04 +08:00
|
|
|
def __next__(self):
|
2014-07-28 05:39:40 +08:00
|
|
|
if self.n > 5:
|
|
|
|
raise StopIteration
|
|
|
|
else:
|
|
|
|
self.n += 1
|
2014-07-31 20:06:46 +08:00
|
|
|
return (self.n, 'val-' + str(self.n))
|
2014-07-28 05:39:40 +08:00
|
|
|
|
|
|
|
|
|
|
|
class WhizIter(models.Model):
|
|
|
|
c = models.IntegerField(choices=Counter(), null=True)
|
|
|
|
|
|
|
|
|
|
|
|
class WhizIterEmpty(models.Model):
|
|
|
|
c = models.CharField(choices=(x for x in []), blank=True, max_length=1)
|
|
|
|
|
|
|
|
|
2008-11-12 08:35:24 +08:00
|
|
|
class BigD(models.Model):
|
|
|
|
d = models.DecimalField(max_digits=38, decimal_places=30)
|
2008-07-30 08:18:49 +08:00
|
|
|
|
2014-03-13 02:34:05 +08:00
|
|
|
|
2014-03-10 23:17:57 +08:00
|
|
|
class FloatModel(models.Model):
|
|
|
|
size = models.FloatField()
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2008-12-03 02:40:40 +08:00
|
|
|
class BigS(models.Model):
|
2009-05-28 13:46:09 +08:00
|
|
|
s = models.SlugField(max_length=255)
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2014-03-04 09:12:42 +08:00
|
|
|
class SmallIntegerModel(models.Model):
|
|
|
|
value = models.SmallIntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
class IntegerModel(models.Model):
|
|
|
|
value = models.IntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
class BigIntegerModel(models.Model):
|
2009-12-17 23:10:38 +08:00
|
|
|
value = models.BigIntegerField()
|
2013-10-04 01:44:10 +08:00
|
|
|
null_value = models.BigIntegerField(null=True, blank=True)
|
|
|
|
|
2009-05-28 13:46:09 +08:00
|
|
|
|
2014-03-04 09:12:42 +08:00
|
|
|
class PositiveSmallIntegerModel(models.Model):
|
|
|
|
value = models.PositiveSmallIntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
class PositiveIntegerModel(models.Model):
|
|
|
|
value = models.PositiveIntegerField()
|
|
|
|
|
|
|
|
|
2010-01-10 06:05:10 +08:00
|
|
|
class Post(models.Model):
|
|
|
|
title = models.CharField(max_length=100)
|
|
|
|
body = models.TextField()
|
2010-03-10 15:42:25 +08:00
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2010-03-10 15:42:25 +08:00
|
|
|
class NullBooleanModel(models.Model):
|
|
|
|
nbfield = models.NullBooleanField()
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2010-04-01 23:10:53 +08:00
|
|
|
class BooleanModel(models.Model):
|
2013-08-12 04:19:09 +08:00
|
|
|
bfield = models.BooleanField(default=None)
|
2010-04-09 20:39:08 +08:00
|
|
|
string = models.CharField(max_length=10, default='abc')
|
2010-03-10 15:42:25 +08:00
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2014-03-13 05:43:45 +08:00
|
|
|
class DateTimeModel(models.Model):
|
|
|
|
d = models.DateField()
|
|
|
|
dt = models.DateTimeField()
|
|
|
|
t = models.TimeField()
|
|
|
|
|
|
|
|
|
2013-09-30 03:56:04 +08:00
|
|
|
class PrimaryKeyCharModel(models.Model):
|
|
|
|
string = models.CharField(max_length=10, primary_key=True)
|
|
|
|
|
|
|
|
|
2012-10-26 07:25:59 +08:00
|
|
|
class FksToBooleans(models.Model):
|
2014-04-27 01:18:45 +08:00
|
|
|
"""Model with FKs to models with {Null,}BooleanField's, #15040"""
|
2012-10-26 07:25:59 +08:00
|
|
|
bf = models.ForeignKey(BooleanModel)
|
|
|
|
nbf = models.ForeignKey(NullBooleanModel)
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2013-09-30 03:56:04 +08:00
|
|
|
class FkToChar(models.Model):
|
|
|
|
"""Model with FK to a model with a CharField primary key, #19299"""
|
|
|
|
out = models.ForeignKey(PrimaryKeyCharModel)
|
|
|
|
|
|
|
|
|
2011-08-13 19:53:42 +08:00
|
|
|
class RenamedField(models.Model):
|
2013-10-04 01:44:10 +08:00
|
|
|
modelname = models.IntegerField(name="fieldname", choices=((1, 'One'),))
|
|
|
|
|
2011-08-13 19:53:42 +08:00
|
|
|
|
2012-09-02 00:32:27 +08:00
|
|
|
class VerboseNameField(models.Model):
|
|
|
|
id = models.AutoField("verbose pk", primary_key=True)
|
|
|
|
field1 = models.BigIntegerField("verbose field1")
|
2013-08-12 04:19:09 +08:00
|
|
|
field2 = models.BooleanField("verbose field2", default=False)
|
2012-09-02 00:32:27 +08:00
|
|
|
field3 = models.CharField("verbose field3", max_length=10)
|
|
|
|
field4 = models.CommaSeparatedIntegerField("verbose field4", max_length=99)
|
|
|
|
field5 = models.DateField("verbose field5")
|
|
|
|
field6 = models.DateTimeField("verbose field6")
|
|
|
|
field7 = models.DecimalField("verbose field7", max_digits=6, decimal_places=1)
|
|
|
|
field8 = models.EmailField("verbose field8")
|
|
|
|
field9 = models.FileField("verbose field9", upload_to="unused")
|
|
|
|
field10 = models.FilePathField("verbose field10")
|
|
|
|
field11 = models.FloatField("verbose field11")
|
2014-03-21 22:54:53 +08:00
|
|
|
# Don't want to depend on Pillow in this test
|
2012-09-02 00:32:27 +08:00
|
|
|
#field_image = models.ImageField("verbose field")
|
|
|
|
field12 = models.IntegerField("verbose field12")
|
2013-09-28 16:22:46 +08:00
|
|
|
with warnings.catch_warnings(record=True) as w:
|
|
|
|
warnings.simplefilter("always")
|
|
|
|
field13 = models.IPAddressField("verbose field13")
|
2012-09-02 00:32:27 +08:00
|
|
|
field14 = models.GenericIPAddressField("verbose field14", protocol="ipv4")
|
|
|
|
field15 = models.NullBooleanField("verbose field15")
|
|
|
|
field16 = models.PositiveIntegerField("verbose field16")
|
|
|
|
field17 = models.PositiveSmallIntegerField("verbose field17")
|
|
|
|
field18 = models.SlugField("verbose field18")
|
|
|
|
field19 = models.SmallIntegerField("verbose field19")
|
|
|
|
field20 = models.TextField("verbose field20")
|
|
|
|
field21 = models.TimeField("verbose field21")
|
|
|
|
field22 = models.URLField("verbose field22")
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2014-05-16 20:25:45 +08:00
|
|
|
###############################################################################
|
|
|
|
# These models aren't used in any test, just here to ensure they validate
|
|
|
|
# successfully.
|
|
|
|
|
2011-11-13 03:53:56 +08:00
|
|
|
# See ticket #16570.
|
|
|
|
class DecimalLessThanOne(models.Model):
|
|
|
|
d = models.DecimalField(max_digits=3, decimal_places=3)
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2014-05-16 20:25:45 +08:00
|
|
|
# See ticket #18389.
|
|
|
|
class FieldClassAttributeModel(models.Model):
|
|
|
|
field_class = models.CharField
|
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
|
|
|
|
|
2012-12-14 05:11:06 +08:00
|
|
|
class DataModel(models.Model):
|
|
|
|
short_data = models.BinaryField(max_length=10, default=b'\x08')
|
|
|
|
data = models.BinaryField()
|
|
|
|
|
2010-10-01 10:02:58 +08:00
|
|
|
###############################################################################
|
|
|
|
# FileField
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
|
2010-10-01 10:02:58 +08:00
|
|
|
class Document(models.Model):
|
|
|
|
myfile = models.FileField(upload_to='unused')
|
|
|
|
|
2009-05-28 13:46:09 +08:00
|
|
|
###############################################################################
|
|
|
|
# ImageField
|
|
|
|
|
2014-03-21 22:54:53 +08:00
|
|
|
# If Pillow available, do these tests.
|
2009-05-28 13:46:09 +08:00
|
|
|
if Image:
|
|
|
|
class TestImageFieldFile(ImageFieldFile):
|
|
|
|
"""
|
|
|
|
Custom Field File class that records whether or not the underlying file
|
|
|
|
was opened.
|
|
|
|
"""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
self.was_opened = False
|
2013-10-04 01:44:10 +08:00
|
|
|
super(TestImageFieldFile, self).__init__(*args, **kwargs)
|
|
|
|
|
2009-05-28 13:46:09 +08:00
|
|
|
def open(self):
|
|
|
|
self.was_opened = True
|
|
|
|
super(TestImageFieldFile, self).open()
|
|
|
|
|
|
|
|
class TestImageField(ImageField):
|
|
|
|
attr_class = TestImageFieldFile
|
|
|
|
|
|
|
|
# Set up a temp directory for file storage.
|
2014-06-23 20:51:53 +08:00
|
|
|
temp_storage_dir = tempfile.mkdtemp(dir=os.environ['DJANGO_TEST_TEMP_DIR'])
|
2009-05-28 13:46:09 +08:00
|
|
|
temp_storage = FileSystemStorage(temp_storage_dir)
|
|
|
|
temp_upload_to_dir = os.path.join(temp_storage.location, 'tests')
|
|
|
|
|
|
|
|
class Person(models.Model):
|
|
|
|
"""
|
|
|
|
Model that defines an ImageField with no dimension fields.
|
|
|
|
"""
|
|
|
|
name = models.CharField(max_length=50)
|
|
|
|
mugshot = TestImageField(storage=temp_storage, upload_to='tests')
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
class AbsctractPersonWithHeight(models.Model):
|
2009-05-28 13:46:09 +08:00
|
|
|
"""
|
2013-10-04 01:44:10 +08:00
|
|
|
Abstract model that defines an ImageField with only one dimension field
|
|
|
|
to make sure the dimension update is correctly run on concrete subclass
|
|
|
|
instance post-initialization.
|
2009-05-28 13:46:09 +08:00
|
|
|
"""
|
|
|
|
mugshot = TestImageField(storage=temp_storage, upload_to='tests',
|
|
|
|
height_field='mugshot_height')
|
|
|
|
mugshot_height = models.PositiveSmallIntegerField()
|
|
|
|
|
2013-10-04 01:44:10 +08:00
|
|
|
class Meta:
|
|
|
|
abstract = True
|
|
|
|
|
|
|
|
class PersonWithHeight(AbsctractPersonWithHeight):
|
|
|
|
"""
|
|
|
|
Concrete model that subclass an abctract one with only on dimension
|
|
|
|
field.
|
|
|
|
"""
|
|
|
|
name = models.CharField(max_length=50)
|
|
|
|
|
2009-05-28 13:46:09 +08:00
|
|
|
class PersonWithHeightAndWidth(models.Model):
|
|
|
|
"""
|
|
|
|
Model that defines height and width fields after the ImageField.
|
|
|
|
"""
|
|
|
|
name = models.CharField(max_length=50)
|
|
|
|
mugshot = TestImageField(storage=temp_storage, upload_to='tests',
|
|
|
|
height_field='mugshot_height',
|
|
|
|
width_field='mugshot_width')
|
|
|
|
mugshot_height = models.PositiveSmallIntegerField()
|
|
|
|
mugshot_width = models.PositiveSmallIntegerField()
|
|
|
|
|
|
|
|
class PersonDimensionsFirst(models.Model):
|
|
|
|
"""
|
|
|
|
Model that defines height and width fields before the ImageField.
|
|
|
|
"""
|
|
|
|
name = models.CharField(max_length=50)
|
|
|
|
mugshot_height = models.PositiveSmallIntegerField()
|
|
|
|
mugshot_width = models.PositiveSmallIntegerField()
|
|
|
|
mugshot = TestImageField(storage=temp_storage, upload_to='tests',
|
|
|
|
height_field='mugshot_height',
|
|
|
|
width_field='mugshot_width')
|
|
|
|
|
|
|
|
class PersonTwoImages(models.Model):
|
|
|
|
"""
|
|
|
|
Model that:
|
|
|
|
* Defines two ImageFields
|
|
|
|
* Defines the height/width fields before the ImageFields
|
|
|
|
* Has a nullalble ImageField
|
|
|
|
"""
|
|
|
|
name = models.CharField(max_length=50)
|
|
|
|
mugshot_height = models.PositiveSmallIntegerField()
|
|
|
|
mugshot_width = models.PositiveSmallIntegerField()
|
|
|
|
mugshot = TestImageField(storage=temp_storage, upload_to='tests',
|
|
|
|
height_field='mugshot_height',
|
|
|
|
width_field='mugshot_width')
|
|
|
|
headshot_height = models.PositiveSmallIntegerField(
|
2013-10-20 07:33:10 +08:00
|
|
|
blank=True, null=True)
|
2009-05-28 13:46:09 +08:00
|
|
|
headshot_width = models.PositiveSmallIntegerField(
|
2013-10-20 07:33:10 +08:00
|
|
|
blank=True, null=True)
|
2009-05-28 13:46:09 +08:00
|
|
|
headshot = TestImageField(blank=True, null=True,
|
|
|
|
storage=temp_storage, upload_to='tests',
|
|
|
|
height_field='headshot_height',
|
|
|
|
width_field='headshot_width')
|
|
|
|
|
|
|
|
###############################################################################
|
2014-07-15 17:35:29 +08:00
|
|
|
|
|
|
|
|
|
|
|
class UUIDModel(models.Model):
|
|
|
|
field = models.UUIDField()
|
|
|
|
|
|
|
|
|
|
|
|
class NullableUUIDModel(models.Model):
|
|
|
|
field = models.UUIDField(blank=True, null=True)
|
|
|
|
|
|
|
|
|
|
|
|
class PrimaryKeyUUIDModel(models.Model):
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4)
|