mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Changes to ImageFileDescriptor
and ImageField
to fix a few cases of setting image dimension fields.
* Moved dimension field update logic out of `ImageFileDescriptor.__set__` and into its own method on `ImageField`. * New `ImageField.update_dimension_fields` method is attached to model instance's `post_init` signal so that: * Dimension fields are set when defined before the ImageField. * Dimension fields are set when the field is assigned in the model constructor (fixes #11196), but only if the dimension fields don't already have values, so we avoid updating the dimensions every time an object is loaded from the database (fixes #11084). * Clear dimension fields when the ImageField is set to None, which also causes dimension fields to be cleared when `ImageFieldFile.delete()` is used. * Added many more tests for ImageField that test edge cases we weren't testing before, and moved the ImageField tests out of `file_storage` and into their own module within `model_fields`. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10858 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
7638651cc3
commit
d89ba464dd
8 changed files with 621 additions and 152 deletions
|
@ -1,93 +0,0 @@
|
|||
import os
|
||||
import tempfile
|
||||
import shutil
|
||||
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
|
||||
from PIL import Image, _imaging
|
||||
except ImportError:
|
||||
Image = None
|
||||
|
||||
# If we have PIL, do these tests
|
||||
if Image:
|
||||
temp_storage_dir = tempfile.mkdtemp()
|
||||
temp_storage = FileSystemStorage(temp_storage_dir)
|
||||
|
||||
class Person(models.Model):
|
||||
name = models.CharField(max_length=50)
|
||||
mugshot = models.ImageField(storage=temp_storage, upload_to='tests',
|
||||
height_field='mug_height',
|
||||
width_field='mug_width')
|
||||
mug_height = models.PositiveSmallIntegerField()
|
||||
mug_width = models.PositiveSmallIntegerField()
|
||||
|
||||
__test__ = {'API_TESTS': """
|
||||
>>> from django.core.files import File
|
||||
>>> 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
|
||||
|
||||
# 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
|
||||
|
||||
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
|
||||
|
||||
# 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()
|
||||
|
||||
# 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.
|
||||
>>> p3.mugshot.closed
|
||||
True
|
||||
|
||||
# After asking for the size, the file should still be closed.
|
||||
>>> _ = p3.mugshot.size
|
||||
>>> p3.mugshot.closed
|
||||
True
|
||||
|
||||
# Make sure that wrapping the file in a file still works
|
||||
>>> p3.mugshot.file.open()
|
||||
>>> p = Person.objects.create(name="Bob The Builder", mugshot=File(p3.mugshot.file))
|
||||
>>> p.save()
|
||||
>>> p3.mugshot.file.close()
|
||||
|
||||
# Delete all test files
|
||||
>>> shutil.rmtree(temp_storage_dir)
|
||||
"""}
|
Loading…
Add table
Add a link
Reference in a new issue