2009-05-28 05:46:09 +00:00
|
|
|
import os
|
|
|
|
import tempfile
|
2013-09-28 08:22:46 +00:00
|
|
|
import warnings
|
2008-03-20 06:56:23 +00:00
|
|
|
|
2009-05-28 05:46:09 +00:00
|
|
|
try:
|
2014-03-21 14:54:53 +00:00
|
|
|
from PIL import Image
|
|
|
|
except ImportError:
|
2013-05-15 02:31:16 +00:00
|
|
|
Image = None
|
2009-05-28 05:46:09 +00:00
|
|
|
|
|
|
|
from django.core.files.storage import FileSystemStorage
|
|
|
|
from django.db import models
|
|
|
|
from django.db.models.fields.files import ImageFieldFile, ImageField
|
|
|
|
|
|
|
|
|
2008-03-20 06:56:23 +00:00
|
|
|
class Foo(models.Model):
|
|
|
|
a = models.CharField(max_length=10)
|
2008-07-30 00:18:49 +00:00
|
|
|
d = models.DecimalField(max_digits=5, decimal_places=3)
|
2008-03-20 06:56:23 +00:00
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2008-03-20 06:56:23 +00:00
|
|
|
def get_foo():
|
|
|
|
return Foo.objects.get(id=1)
|
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2008-03-20 06:56:23 +00:00
|
|
|
class Bar(models.Model):
|
|
|
|
b = models.CharField(max_length=10)
|
|
|
|
a = models.ForeignKey(Foo, default=get_foo)
|
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2008-07-27 07:22:39 +00:00
|
|
|
class Whiz(models.Model):
|
|
|
|
CHOICES = (
|
|
|
|
('Group 1', (
|
2013-10-19 23:33:10 +00:00
|
|
|
(1, 'First'),
|
|
|
|
(2, 'Second'),
|
2013-10-18 09:02:43 +00:00
|
|
|
)
|
2008-07-27 07:22:39 +00:00
|
|
|
),
|
|
|
|
('Group 2', (
|
2013-10-19 23:33:10 +00:00
|
|
|
(3, 'Third'),
|
|
|
|
(4, 'Fourth'),
|
2013-10-18 09:02:43 +00:00
|
|
|
)
|
2008-07-30 00:18:49 +00:00
|
|
|
),
|
2013-10-03 17:44:10 +00:00
|
|
|
(0, 'Other'),
|
2008-07-27 07:22:39 +00:00
|
|
|
)
|
|
|
|
c = models.IntegerField(choices=CHOICES, null=True)
|
2009-05-28 05:46:09 +00:00
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2008-11-12 00:35:24 +00:00
|
|
|
class BigD(models.Model):
|
|
|
|
d = models.DecimalField(max_digits=38, decimal_places=30)
|
2008-07-30 00:18:49 +00:00
|
|
|
|
2014-03-12 18:34:05 +00:00
|
|
|
|
2014-03-10 15:17:57 +00:00
|
|
|
class FloatModel(models.Model):
|
|
|
|
size = models.FloatField()
|
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2008-12-02 18:40:40 +00:00
|
|
|
class BigS(models.Model):
|
2009-05-28 05:46:09 +00:00
|
|
|
s = models.SlugField(max_length=255)
|
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2014-03-04 01:12:42 +00:00
|
|
|
class SmallIntegerModel(models.Model):
|
|
|
|
value = models.SmallIntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
class IntegerModel(models.Model):
|
|
|
|
value = models.IntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
class BigIntegerModel(models.Model):
|
2009-12-17 15:10:38 +00:00
|
|
|
value = models.BigIntegerField()
|
2013-10-03 17:44:10 +00:00
|
|
|
null_value = models.BigIntegerField(null=True, blank=True)
|
|
|
|
|
2009-05-28 05:46:09 +00:00
|
|
|
|
2014-03-04 01:12:42 +00:00
|
|
|
class PositiveSmallIntegerModel(models.Model):
|
|
|
|
value = models.PositiveSmallIntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
class PositiveIntegerModel(models.Model):
|
|
|
|
value = models.PositiveIntegerField()
|
|
|
|
|
|
|
|
|
2010-01-09 22:05:10 +00:00
|
|
|
class Post(models.Model):
|
|
|
|
title = models.CharField(max_length=100)
|
|
|
|
body = models.TextField()
|
2010-03-10 07:42:25 +00:00
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2010-03-10 07:42:25 +00:00
|
|
|
class NullBooleanModel(models.Model):
|
|
|
|
nbfield = models.NullBooleanField()
|
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2010-04-01 15:10:53 +00:00
|
|
|
class BooleanModel(models.Model):
|
2013-08-11 20:19:09 +00:00
|
|
|
bfield = models.BooleanField(default=None)
|
2010-04-09 12:39:08 +00:00
|
|
|
string = models.CharField(max_length=10, default='abc')
|
2010-03-10 07:42:25 +00:00
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2014-03-12 21:43:45 +00:00
|
|
|
class DateTimeModel(models.Model):
|
|
|
|
d = models.DateField()
|
|
|
|
dt = models.DateTimeField()
|
|
|
|
t = models.TimeField()
|
|
|
|
|
|
|
|
|
2013-09-29 19:56:04 +00:00
|
|
|
class PrimaryKeyCharModel(models.Model):
|
|
|
|
string = models.CharField(max_length=10, primary_key=True)
|
|
|
|
|
|
|
|
|
2012-10-25 23:25:59 +00:00
|
|
|
class FksToBooleans(models.Model):
|
2014-04-26 17:18:45 +00:00
|
|
|
"""Model with FKs to models with {Null,}BooleanField's, #15040"""
|
2012-10-25 23:25:59 +00:00
|
|
|
bf = models.ForeignKey(BooleanModel)
|
|
|
|
nbf = models.ForeignKey(NullBooleanModel)
|
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2013-09-29 19:56:04 +00:00
|
|
|
class FkToChar(models.Model):
|
|
|
|
"""Model with FK to a model with a CharField primary key, #19299"""
|
|
|
|
out = models.ForeignKey(PrimaryKeyCharModel)
|
|
|
|
|
|
|
|
|
2011-08-13 11:53:42 +00:00
|
|
|
class RenamedField(models.Model):
|
2013-10-03 17:44:10 +00:00
|
|
|
modelname = models.IntegerField(name="fieldname", choices=((1, 'One'),))
|
|
|
|
|
2011-08-13 11:53:42 +00:00
|
|
|
|
2012-09-01 16:32:27 +00:00
|
|
|
class VerboseNameField(models.Model):
|
|
|
|
id = models.AutoField("verbose pk", primary_key=True)
|
|
|
|
field1 = models.BigIntegerField("verbose field1")
|
2013-08-11 20:19:09 +00:00
|
|
|
field2 = models.BooleanField("verbose field2", default=False)
|
2012-09-01 16:32:27 +00: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 14:54:53 +00:00
|
|
|
# Don't want to depend on Pillow in this test
|
2012-09-01 16:32:27 +00:00
|
|
|
#field_image = models.ImageField("verbose field")
|
|
|
|
field12 = models.IntegerField("verbose field12")
|
2013-09-28 08:22:46 +00:00
|
|
|
with warnings.catch_warnings(record=True) as w:
|
|
|
|
warnings.simplefilter("always")
|
|
|
|
field13 = models.IPAddressField("verbose field13")
|
2012-09-01 16:32:27 +00: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-03 17:44:10 +00:00
|
|
|
|
2014-05-16 12:25:45 +00:00
|
|
|
###############################################################################
|
|
|
|
# These models aren't used in any test, just here to ensure they validate
|
|
|
|
# successfully.
|
|
|
|
|
2011-11-12 19:53:56 +00:00
|
|
|
# See ticket #16570.
|
|
|
|
class DecimalLessThanOne(models.Model):
|
|
|
|
d = models.DecimalField(max_digits=3, decimal_places=3)
|
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2014-05-16 12:25:45 +00:00
|
|
|
# See ticket #18389.
|
|
|
|
class FieldClassAttributeModel(models.Model):
|
|
|
|
field_class = models.CharField
|
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
|
|
|
|
|
2012-12-13 21:11:06 +00:00
|
|
|
class DataModel(models.Model):
|
|
|
|
short_data = models.BinaryField(max_length=10, default=b'\x08')
|
|
|
|
data = models.BinaryField()
|
|
|
|
|
2010-10-01 02:02:58 +00:00
|
|
|
###############################################################################
|
|
|
|
# FileField
|
|
|
|
|
2013-10-03 17:44:10 +00:00
|
|
|
|
2010-10-01 02:02:58 +00:00
|
|
|
class Document(models.Model):
|
|
|
|
myfile = models.FileField(upload_to='unused')
|
|
|
|
|
2009-05-28 05:46:09 +00:00
|
|
|
###############################################################################
|
|
|
|
# ImageField
|
|
|
|
|
2014-03-21 14:54:53 +00:00
|
|
|
# If Pillow available, do these tests.
|
2009-05-28 05:46:09 +00: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-03 17:44:10 +00:00
|
|
|
super(TestImageFieldFile, self).__init__(*args, **kwargs)
|
|
|
|
|
2009-05-28 05:46:09 +00: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.
|
|
|
|
temp_storage_dir = tempfile.mkdtemp()
|
|
|
|
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-03 17:44:10 +00:00
|
|
|
class AbsctractPersonWithHeight(models.Model):
|
2009-05-28 05:46:09 +00:00
|
|
|
"""
|
2013-10-03 17:44:10 +00: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 05:46:09 +00:00
|
|
|
"""
|
|
|
|
mugshot = TestImageField(storage=temp_storage, upload_to='tests',
|
|
|
|
height_field='mugshot_height')
|
|
|
|
mugshot_height = models.PositiveSmallIntegerField()
|
|
|
|
|
2013-10-03 17:44:10 +00: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 05:46:09 +00: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-19 23:33:10 +00:00
|
|
|
blank=True, null=True)
|
2009-05-28 05:46:09 +00:00
|
|
|
headshot_width = models.PositiveSmallIntegerField(
|
2013-10-19 23:33:10 +00:00
|
|
|
blank=True, null=True)
|
2009-05-28 05:46:09 +00:00
|
|
|
headshot = TestImageField(blank=True, null=True,
|
|
|
|
storage=temp_storage, upload_to='tests',
|
|
|
|
height_field='headshot_height',
|
|
|
|
width_field='headshot_width')
|
|
|
|
|
|
|
|
###############################################################################
|