2008-08-09 04:59:02 +08:00
|
|
|
import os
|
|
|
|
import tempfile
|
2008-10-11 06:13:16 +08:00
|
|
|
import shutil
|
2008-08-09 04:59:02 +08:00
|
|
|
from django.db import models
|
|
|
|
from django.core.files.storage import FileSystemStorage
|
|
|
|
from django.core.files.base import ContentFile
|
|
|
|
|
|
|
|
# Test for correct behavior of width_field/height_field.
|
|
|
|
# Of course, we can't run this without PIL.
|
|
|
|
|
|
|
|
try:
|
|
|
|
# Checking for the existence of Image is enough for CPython, but
|
|
|
|
# for PyPy, you need to check for the underlying modules
|
2008-08-09 22:18:09 +08:00
|
|
|
from PIL import Image, _imaging
|
2008-08-09 04:59:02 +08:00
|
|
|
except ImportError:
|
|
|
|
Image = None
|
|
|
|
|
|
|
|
# If we have PIL, do these tests
|
|
|
|
if Image:
|
2009-04-06 04:59:20 +08:00
|
|
|
temp_storage_dir = tempfile.mkdtemp()
|
|
|
|
temp_storage = FileSystemStorage(temp_storage_dir)
|
|
|
|
|
2008-08-09 04:59:02 +08:00
|
|
|
class Person(models.Model):
|
|
|
|
name = models.CharField(max_length=50)
|
2008-12-16 12:52:55 +08:00
|
|
|
mugshot = models.ImageField(storage=temp_storage, upload_to='tests',
|
|
|
|
height_field='mug_height',
|
2008-08-09 04:59:02 +08:00
|
|
|
width_field='mug_width')
|
|
|
|
mug_height = models.PositiveSmallIntegerField()
|
|
|
|
mug_width = models.PositiveSmallIntegerField()
|
2008-12-16 12:52:55 +08:00
|
|
|
|
2008-08-09 04:59:02 +08:00
|
|
|
__test__ = {'API_TESTS': """
|
2009-05-08 23:08:09 +08:00
|
|
|
>>> from django.core.files import File
|
2008-08-09 04:59:02 +08:00
|
|
|
>>> image_data = open(os.path.join(os.path.dirname(__file__), "test.png"), 'rb').read()
|
|
|
|
>>> p = Person(name="Joe")
|
|
|
|
>>> p.mugshot.save("mug", ContentFile(image_data))
|
|
|
|
>>> p.mugshot.width
|
|
|
|
16
|
|
|
|
>>> p.mugshot.height
|
|
|
|
16
|
|
|
|
>>> p.mug_height
|
|
|
|
16
|
|
|
|
>>> p.mug_width
|
|
|
|
16
|
|
|
|
|
2008-12-16 12:52:55 +08:00
|
|
|
# Bug #9786: Ensure '==' and '!=' work correctly.
|
|
|
|
>>> image_data = open(os.path.join(os.path.dirname(__file__), "test1.png"), 'rb').read()
|
|
|
|
>>> p1 = Person(name="Bob")
|
|
|
|
>>> p1.mugshot.save("mug", ContentFile(image_data))
|
|
|
|
>>> p2 = Person.objects.get(name="Joe")
|
|
|
|
>>> p.mugshot == p2.mugshot
|
|
|
|
True
|
|
|
|
>>> p.mugshot != p2.mugshot
|
|
|
|
False
|
|
|
|
>>> p.mugshot != p1.mugshot
|
|
|
|
True
|
|
|
|
|
2009-03-08 17:59:17 +08:00
|
|
|
Bug #9508: Similarly to the previous test, make sure hash() works as expected
|
|
|
|
(equal items must hash to the same value).
|
|
|
|
>>> hash(p.mugshot) == hash(p2.mugshot)
|
|
|
|
True
|
|
|
|
|
2008-08-28 05:18:45 +08:00
|
|
|
# Bug #8175: correctly delete files that have been removed off the file system.
|
|
|
|
>>> import os
|
|
|
|
>>> p2 = Person(name="Fred")
|
|
|
|
>>> p2.mugshot.save("shot", ContentFile(image_data))
|
|
|
|
>>> os.remove(p2.mugshot.path)
|
|
|
|
>>> p2.delete()
|
2008-08-28 05:30:47 +08:00
|
|
|
|
|
|
|
# Bug #8534: FileField.size should not leave the file open.
|
|
|
|
>>> p3 = Person(name="Joan")
|
|
|
|
>>> p3.mugshot.save("shot", ContentFile(image_data))
|
|
|
|
|
|
|
|
# Get a "clean" model instance
|
|
|
|
>>> p3 = Person.objects.get(name="Joan")
|
|
|
|
|
|
|
|
# It won't have an opened file. This is a bit brittle since it depends on the
|
|
|
|
# the internals of FieldFile, but there's no other way of telling if the
|
|
|
|
# file's been opened or not.
|
2009-05-08 23:08:09 +08:00
|
|
|
>>> p3.mugshot._file is not None
|
2008-08-28 05:30:47 +08:00
|
|
|
False
|
|
|
|
|
|
|
|
# After asking for the size, the file should still be closed.
|
|
|
|
>>> _ = p3.mugshot.size
|
2009-05-08 23:08:09 +08:00
|
|
|
>>> p3.mugshot._file is not None
|
2008-08-28 05:30:47 +08:00
|
|
|
False
|
2008-10-11 06:13:16 +08:00
|
|
|
|
2009-05-08 23:08:09 +08:00
|
|
|
>>> p = Person.objects.create(name="Bob", mugshot=File(p3.mugshot.file))
|
|
|
|
|
2008-10-11 06:13:16 +08:00
|
|
|
>>> shutil.rmtree(temp_storage_dir)
|
2008-08-09 04:59:02 +08:00
|
|
|
"""}
|