Feature #400 - Resize images to fit on page - Additions

*   `migrations.py`
    *   Removed empty line
    *   Added empty line
*   `models.py`
    *   Added `MediaEntry.get_display_media()` helper function
*   `process_media.__init__.py`
    *	Updated `process_media_initial()`
    	*   Renamed `main` => `original`.
	*   Added condition to `medium`, it's only created if the original
	    dimensions exceed the MEDIUM_SIZE dimensions.
*   `media.html`
    *	The image tag is now populated by `MediaEntry.get_display_media()`
*   `util.py`
    *	Added `DISPLAY_IMAGE_FETCHING_ORDER`, used by `MediaEntry.get_display_media()`
This commit is contained in:
Joar Wandborg 2011-07-03 05:46:00 +02:00
parent 93214d8e02
commit 2c9e635ae2
5 changed files with 44 additions and 21 deletions

View File

@ -24,6 +24,7 @@ from mediagoblin import mg_globals
from mediagoblin.db import migrations from mediagoblin.db import migrations
from mediagoblin.db.util import DESCENDING, ObjectId from mediagoblin.db.util import DESCENDING, ObjectId
from mediagoblin.util import Pagination from mediagoblin.util import Pagination
from mediagoblin.util import DISPLAY_IMAGE_FETCHING_ORDER
################### ###################
# Custom validators # Custom validators
@ -109,6 +110,24 @@ class MediaEntry(Document):
migration_handler = migrations.MediaEntryMigration migration_handler = migrations.MediaEntryMigration
def get_display_media(self, media_map, fetch_order=DISPLAY_IMAGE_FETCHING_ORDER):
"""
Find the best media for display.
Args:
- media_map: a dict like
{u'image_size': [u'dir1', u'dir2', u'image.jpg']}
- fetch_order: the order we should try fetching images in
Returns:
(media_size, media_path)
"""
media_sizes = media_map.keys()
print media_sizes
for media_size in DISPLAY_IMAGE_FETCHING_ORDER:
if media_size in media_sizes:
return media_map[media_size]
def main_mediafile(self): def main_mediafile(self):
pass pass

View File

@ -57,9 +57,14 @@ def process_media_initial(media_id):
thumb.save(thumb_file, "JPEG") thumb.save(thumb_file, "JPEG")
""" """
Create medium file, used in `media.html` If the size of the original file exceeds the specified size of a `medium`
file, a `medium.jpg` files is created and later associated with the media
entry.
""" """
medium = Image.open(queued_filename) medium = Image.open(queued_filename)
medium_processed = False
if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]:
medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS) medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS)
if medium.mode != "RGB": if medium.mode != "RGB":
@ -70,22 +75,24 @@ def process_media_initial(media_id):
medium_file = mgg.public_store.get_file(medium_filepath, 'w') medium_file = mgg.public_store.get_file(medium_filepath, 'w')
with medium_file: with medium_file:
medium.save(medium_file, "JPEG") medium.save(medium_file, "JPEG")
medium_processed = True
# we have to re-read because unlike PIL, not everything reads # we have to re-read because unlike PIL, not everything reads
# things in string representation :) # things in string representation :)
queued_file = file(queued_filename, 'rb') queued_file = file(queued_filename, 'rb')
with queued_file: with queued_file:
main_filepath = create_pub_filepath(entry, queued_filepath[-1]) original_filepath = create_pub_filepath(entry, queued_filepath[-1])
with mgg.public_store.get_file(main_filepath, 'wb') as main_file: with mgg.public_store.get_file(original_filepath, 'wb') as original_file:
main_file.write(queued_file.read()) original_file.write(queued_file.read())
mgg.queue_store.delete_file(queued_filepath) mgg.queue_store.delete_file(queued_filepath)
entry['queued_media_file'] = [] entry['queued_media_file'] = []
media_files_dict = entry.setdefault('media_files', {}) media_files_dict = entry.setdefault('media_files', {})
media_files_dict['thumb'] = thumb_filepath media_files_dict['thumb'] = thumb_filepath
media_files_dict['main'] = main_filepath media_files_dict['original'] = original_filepath
if medium_processed:
media_files_dict['medium'] = medium_filepath media_files_dict['medium'] = medium_filepath
entry['state'] = u'processed' entry['state'] = u'processed'
entry.save() entry.save()

View File

@ -26,13 +26,8 @@
<h1> <h1>
{{media.title}} {{media.title}}
</h1> </h1>
{% if media.media_files.medium %}
<img class="media_image" src="{{ request.app.public_store.file_url( <img class="media_image" src="{{ request.app.public_store.file_url(
media.media_files.medium) }}" /> media.get_display_media(media.media_files)) }}" />
{% else %}
<img class="media_image" src="{{ request.app.public_store.file_url(
media.media_files.main) }}" />
{% endif %}
<p> <p>
Uploaded on Uploaded on
{{ "%4d-%02d-%02d"|format(media.created.year, {{ "%4d-%02d-%02d"|format(media.created.year,

View File

@ -35,6 +35,8 @@ from mediagoblin import mg_globals
from mediagoblin import messages from mediagoblin import messages
from mediagoblin.db.util import ObjectId from mediagoblin.db.util import ObjectId
DISPLAY_IMAGE_FETCHING_ORDER = [u'medium', u'original', u'thumb']
TESTS_ENABLED = False TESTS_ENABLED = False
def _activate_testing(): def _activate_testing():
""" """