Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
- Loading branch information
Showing
8 changed files
with
621 additions
and
152 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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) | |||
"""} | |||
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.