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:
parent
93214d8e02
commit
2c9e635ae2
@ -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
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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,
|
||||||
|
@ -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():
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user