Feature #400 - Resize images to fit on page - Additions
authorJoar Wandborg <git@wandborg.com>
Sun, 3 Jul 2011 03:46:00 +0000 (05:46 +0200)
committerJoar Wandborg <git@wandborg.com>
Sun, 3 Jul 2011 03:46:00 +0000 (05:46 +0200)
*   `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
mediagoblin/db/models.py
mediagoblin/process_media/__init__.py
mediagoblin/templates/mediagoblin/user_pages/media.html
mediagoblin/util.py

index 712f8ab44375906ecb8b3092c1c9bebdba55e24d..b888ad3e9d6237b52c2068e0cf782a0caaf766ce 100644 (file)
@@ -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):
         """
index bf825a2391bc82b20b7bb4989b92d76c325b6e66..3190d8fad469e663d44fb913a9d042ed34d8a11e 100644 (file)
@@ -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
     
index 0d1abcb3b3420fe9a7448da1932ffb6a26d480b7..9e0ceff78499b8ebf6e3169b86f4c42e0b817b15 100644 (file)
@@ -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()
 
index e16f1e002808c9e598453ec316313ac373e984f3..56d79662219928b92b8f1691dfdee27df5fd56bc 100644 (file)
       <h1>
         {{media.title}}
       </h1>
-      {% if media.media_files.medium %}
-        <img class="media_image" src="{{ request.app.public_store.file_url(
-                                     media.media_files.medium) }}" />
-      {% else %}
-        <img class="media_image" src="{{ request.app.public_store.file_url(
-                  media.media_files.main) }}" />
-      {% endif %}
+      <img class="media_image" src="{{ request.app.public_store.file_url(
+                                         media.get_display_media(media.media_files)) }}" />
       <p>
         Uploaded on
         {{ "%4d-%02d-%02d"|format(media.created.year,
index a20e87c45e6465d6680c59224bd1ee7cca064abb..a542566356d4bcc580fd7fb95a4fa2b26eb7ef3c 100644 (file)
@@ -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():
     """