verdandi/modules/gallery.py

154 lines
5.1 KiB
Python

#!/usr/bin/env python2
import os
from datetime import datetime
from PIL import Image
import markdown
from verdandi.mixins.templatemixin import TemplateMixin
from verdandi.mixins.menuitemmixin import MenuItemMixin
from verdandi.mixins.fileassetsmixin import FileAssetsMixin
from verdandi.mixins.newsitemmixin import NewsItemMixin
from verdandi.mixins.metadatamixin import MetadataMixin
from verdandi.constants import CONTENT_DIRECTORY, MARKDOWN_EXTENSIONS
class Gallery(MenuItemMixin, NewsItemMixin, MetadataMixin, TemplateMixin, FileAssetsMixin):
gallery_description_file = 'description.md'
gallery_directory = 'gallery'
gallery_images_url = 'img/gallery'
gallery_thumbnail_size = 300
gallery_thumbnail_quality = 90
gallery_thumbnail_prefix = 'thumb_'
menu_title = 'Gallery'
menu_label = 'gallery'
news_item_len = 10
template = "gallery.html"
metadata_description_len = 10
content_directory = CONTENT_DIRECTORY
markdown_extensions = MARKDOWN_EXTENSIONS
images = []
def process_message(self, message):
if message == None:
self.full_gallery_path = os.path.join(self.content_directory, self.gallery_directory)
description_path = os.path.join(self.full_gallery_path, self.gallery_description_file)
self.description = self.read_content_file(description_path)
files = os.listdir(self.full_gallery_path)
self.images = filter(lambda image: os.path.splitext(image)[1] == '.jpg', files)
other_messages = super(Gallery, self).process_message(message)
return other_messages
def get_assets(self):
assets = super(Gallery, self).get_assets()
for image in self.images:
src_image = os.path.join(self.gallery_directory, image)
dst_image = os.path.join(self.gallery_images_url, image)
assets += [(src_image, dst_image)]
return assets
def get_news_item(self):
lines = self.description['content'].split('\n')
elipsized_description = '\n'.join(lines[0:self.news_item_len])
item = {
'title': self.description['title'],
'content': elipsized_description,
'creation_time': self.description['creation_time'],
'edit_time': self.description['edit_time'],
'url' : self.url
}
return item
def get_metadata(self):
markdown_converter = markdown.Markdown(extensions = self.markdown_extensions)
metadata = super(Gallery, self).get_metadata()
lines = self.description['content'].split('\n')
elipsized_description = '\n'.join(lines[0:self.news_item_len])
elipsized_description = markdown_converter.convert(elipsized_description)
meta = {
'url': "/%s" % self.url,
'title': self.description['title'],
'description' : elipsized_description
}
if 'image' in metadata:
meta['image'] = "/%s" % metadata['image']
return meta
def get_context(self):
context = super(Gallery,self).get_context()
context['title'] = self.description['title']
context['url'] = "/%s" % self.url
markdown_converter = markdown.Markdown(extensions = self.markdown_extensions)
context['content_creation_time'] = self.description['creation_time']
context['content_edit_time'] = self.description['edit_time']
markdown_source = self.description['content']
context['description'] = markdown_converter.convert(markdown_source)
context['images'] = []
for image in self.images:
image_url = os.path.join(self.gallery_images_url, image)
thumb_url = os.path.join(self.gallery_images_url, self.gallery_thumbnail_prefix + image)
context['images'] += [{'image' : image_url, 'thumb' : thumb_url}]
return context
def calulate_thumb_dimesions(self, input_dimensions):
input_width, input_height = input_dimensions
thumb_width = 0
thumb_height = 0
input_width = input_width * 1.0
input_height = input_height * 1.0
if input_width > input_height:
thumb_width = self.gallery_thumbnail_size
thumb_height = self.gallery_thumbnail_size / input_width * input_height
else:
thumb_width = self.gallery_thumbnail_size / input_height * input_width
thumb_height = self.gallery_thumbnail_size
return (int(thumb_width), int(thumb_height))
def render_files(self, context, output_directory, jinja_env):
dst_dir = os.path.join(output_directory, self.gallery_images_url)
for image in self.images:
src_path = os.path.join(self.full_gallery_path, image)
dst_path = os.path.join(dst_dir, self.gallery_thumbnail_prefix + image)
print "Creating thumbnail: %s" % dst_path
image = Image.open(src_path)
thumbnail = image.resize(self.calulate_thumb_dimesions(image.size), Image.LANCZOS)
thumbnail.save(dst_path, quality=self.gallery_thumbnail_quality)
super(Gallery, self).render_files(context, output_directory, jinja_env)