From 2c9e635ae2ecbef0649df78636503be357f16a7f Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Sun, 3 Jul 2011 05:46:00 +0200 Subject: [PATCH 1/2] 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()` --- mediagoblin/db/migrations.py | 2 +- mediagoblin/db/models.py | 19 +++++++++++ mediagoblin/process_media/__init__.py | 33 +++++++++++-------- .../mediagoblin/user_pages/media.html | 9 ++--- mediagoblin/util.py | 2 ++ 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 712f8ab4..b888ad3e 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -49,7 +49,7 @@ class MediaEntryMigration(DocumentMigration): '$set': { 'description_html': cleaned_markdown_conversion( doc['description'])}} - + class UserMigration(DocumentMigration): def allmigration01_add_bio_and_url_profile(self): """ diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index bf825a23..3190d8fa 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -24,6 +24,7 @@ from mediagoblin import mg_globals from mediagoblin.db import migrations from mediagoblin.db.util import DESCENDING, ObjectId from mediagoblin.util import Pagination +from mediagoblin.util import DISPLAY_IMAGE_FETCHING_ORDER ################### # Custom validators @@ -109,6 +110,24 @@ class MediaEntry(Document): 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): pass diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 0d1abcb3..9e0ceff7 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -57,36 +57,43 @@ def process_media_initial(media_id): 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.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS) + medium_processed = False - if medium.mode != "RGB": - medium = medium.convert("RGB") + if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]: + medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS) - medium_filepath = create_pub_filepath(entry, 'medium.jpg') + if medium.mode != "RGB": + medium = medium.convert("RGB") - medium_file = mgg.public_store.get_file(medium_filepath, 'w') - with medium_file: - medium.save(medium_file, "JPEG") + medium_filepath = create_pub_filepath(entry, 'medium.jpg') + + medium_file = mgg.public_store.get_file(medium_filepath, 'w') + with medium_file: + medium.save(medium_file, "JPEG") + medium_processed = True # we have to re-read because unlike PIL, not everything reads # things in string representation :) queued_file = file(queued_filename, 'rb') 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: - main_file.write(queued_file.read()) + with mgg.public_store.get_file(original_filepath, 'wb') as original_file: + original_file.write(queued_file.read()) mgg.queue_store.delete_file(queued_filepath) entry['queued_media_file'] = [] media_files_dict = entry.setdefault('media_files', {}) media_files_dict['thumb'] = thumb_filepath - media_files_dict['main'] = main_filepath - media_files_dict['medium'] = medium_filepath + media_files_dict['original'] = original_filepath + if medium_processed: + media_files_dict['medium'] = medium_filepath entry['state'] = u'processed' entry.save() diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index e16f1e00..56d79662 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -26,13 +26,8 @@

{{media.title}}

- {% if media.media_files.medium %} - - {% else %} - - {% endif %} +

Uploaded on {{ "%4d-%02d-%02d"|format(media.created.year, diff --git a/mediagoblin/util.py b/mediagoblin/util.py index a20e87c4..a5425663 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -35,6 +35,8 @@ from mediagoblin import mg_globals from mediagoblin import messages from mediagoblin.db.util import ObjectId +DISPLAY_IMAGE_FETCHING_ORDER = [u'medium', u'original', u'thumb'] + TESTS_ENABLED = False def _activate_testing(): """ From 380ac094f6ebcf7b457d98a86ac7cc0af2347ba4 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Sun, 3 Jul 2011 06:37:40 +0200 Subject: [PATCH 2/2] Removed debug code, erroneously included in my last commit --- mediagoblin/db/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 3190d8fa..2d6a71f7 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -123,7 +123,7 @@ class MediaEntry(Document): (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]