##// END OF EJS Templates
Version bump
Version bump

File last commit:

r1695:6ee0d7fe default
r1709:19785af3 3.4.0 default
Show More
viewers.py
182 lines | 4.9 KiB | text/x-python | PythonLexer
neko259
Use real image stub sizes, not 200x150
r1684 import os
neko259
Store images as regular attachments instead of separate model
r1590 from django.core.files.images import get_image_dimensions
neko259
Added support for different attachment types
r1273 from django.template.defaultfilters import filesizeformat
neko259
Updated file image
r1290 from django.contrib.staticfiles.templatetags.staticfiles import static
neko259
Use real image stub sizes, not 200x150
r1684 from django.contrib.staticfiles import finders
neko259
Added support for different attachment types
r1273
neko259
Support audio viewer
r1279 FILE_STUB_IMAGE = 'images/file.png'
neko259
Different images for different URL protocols
r1677 FILE_STUB_URL = 'url'
neko259
Support audio viewer
r1279
neko259
Video formats are not limited to webm
r1307 FILE_TYPES_VIDEO = (
'webm',
'mp4',
neko259
Treat .mpeg files as video
r1342 'mpeg',
neko259
View ogv format as video
r1493 'ogv',
neko259
Video formats are not limited to webm
r1307 )
neko259
Added basic SVG support
r1284 FILE_TYPE_SVG = 'svg'
neko259
Support audio viewer
r1279 FILE_TYPES_AUDIO = (
'ogg',
'mp3',
neko259
Opus is an audio format too
r1339 'opus',
neko259
Support audio viewer
r1279 )
neko259
Store images as regular attachments instead of separate model
r1590 FILE_TYPES_IMAGE = (
'jpeg',
'jpg',
'png',
'bmp',
'gif',
)
neko259
Support audio viewer
r1279
neko259
Added images for different file formats
r1326 PLAIN_FILE_FORMATS = {
'pdf': 'pdf',
'djvu': 'djvu',
'txt': 'txt',
neko259
New file images
r1665 'tex': 'tex',
'xcf': 'xcf',
neko259
Added images for different file formats
r1326 }
neko259
Different images for different URL protocols
r1677 URL_PROTOCOLS = {
'magnet': 'magnet',
}
neko259
Added ability to add links to specific domains and show the domain logo as an image substitute
r1695 URL_DOMAINS = {
'meduza.io': 'meduza',
}
neko259
Store images as regular attachments instead of separate model
r1590 CSS_CLASS_IMAGE = 'image'
CSS_CLASS_THUMB = 'thumb'
neko259
Added support for different attachment types
r1273
neko259
Autodetect attachment viewers by getting all abstract viewer subclasses
r1286 def get_viewers():
return AbstractViewer.__subclasses__()
neko259
Use real image stub sizes, not 200x150
r1684 def get_static_dimensions(filename):
file_path = finders.find(filename)
return get_image_dimensions(file_path)
neko259
Added support for different attachment types
r1273 class AbstractViewer:
neko259
Load URL if the file could not be loaded
r1660 def __init__(self, file, file_type, hash, url):
neko259
Added support for different attachment types
r1273 self.file = file
self.file_type = file_type
neko259
Fixed popup image preview
r1596 self.hash = hash
neko259
Load URL if the file could not be loaded
r1660 self.url = url
neko259
Added support for different attachment types
r1273
@staticmethod
def supports(file_type):
neko259
Support audio viewer
r1279 return True
neko259
Added support for different attachment types
r1273
def get_view(self):
neko259
Show file metadata for all attachments
r1300 return '<div class="image">'\
'{}'\
neko259
Removed obsolete code. Added download link to files
r1308 '<div class="image-metadata"><a href="{}" download >{}, {}</a></div>'\
'</div>'.format(self.get_format_view(), self.file.url,
neko259
Show file metadata for all attachments
r1300 self.file_type, filesizeformat(self.file.size))
def get_format_view(self):
neko259
Added images for different file formats
r1326 if self.file_type in PLAIN_FILE_FORMATS:
image = 'images/fileformats/{}.png'.format(
PLAIN_FILE_FORMATS[self.file_type])
else:
image = FILE_STUB_IMAGE
neko259
Use real image stub sizes, not 200x150
r1684 w, h = get_static_dimensions(image)
neko259
Show file metadata for all attachments
r1300 return '<a href="{}">'\
neko259
Use real image stub sizes, not 200x150
r1684 '<img class="url-image" src="{}" width="{}" height="{}"/>'\
'</a>'.format(self.file.url, static(image), w, h)
neko259
Added support for different attachment types
r1273
neko259
Video formats are not limited to webm
r1307 class VideoViewer(AbstractViewer):
neko259
Added support for different attachment types
r1273 @staticmethod
def supports(file_type):
neko259
Video formats are not limited to webm
r1307 return file_type in FILE_TYPES_VIDEO
neko259
Added support for different attachment types
r1273
neko259
Show file metadata for all attachments
r1300 def get_format_view(self):
return '<video width="200" height="150" controls src="{}"></video>'\
.format(self.file.url)
neko259
Added support for different attachment types
r1273
neko259
Support audio viewer
r1279
class AudioViewer(AbstractViewer):
@staticmethod
def supports(file_type):
return file_type in FILE_TYPES_AUDIO
neko259
Show file metadata for all attachments
r1300 def get_format_view(self):
return '<audio controls src="{}"></audio>'.format(self.file.url)
neko259
Added basic SVG support
r1284
class SvgViewer(AbstractViewer):
@staticmethod
def supports(file_type):
return file_type == FILE_TYPE_SVG
neko259
Show file metadata for all attachments
r1300 def get_format_view(self):
return '<a class="thumb" href="{}">'\
'<img class="post-image-preview" width="200" height="150" src="{}" />'\
'</a>'.format(self.file.url, self.file.url)
neko259
Store images as regular attachments instead of separate model
r1590
class ImageViewer(AbstractViewer):
@staticmethod
def supports(file_type):
return file_type in FILE_TYPES_IMAGE
def get_format_view(self):
metadata = '{}, {}'.format(self.file.name.split('.')[-1],
filesizeformat(self.file.size))
width, height = get_image_dimensions(self.file.file)
preview_path = self.file.path.replace('.', '.200x150.')
pre_width, pre_height = get_image_dimensions(preview_path)
split = self.file.url.rsplit('.', 1)
w, h = 200, 150
thumb_url = '%s.%sx%s.%s' % (split[0], w, h, split[1])
return '<a class="{}" href="{full}">' \
'<img class="post-image-preview"' \
' src="{}"' \
neko259
Fixed popup image preview
r1596 ' alt="{}"' \
neko259
Store images as regular attachments instead of separate model
r1590 ' width="{}"' \
' height="{}"' \
' data-width="{}"' \
' data-height="{}" />' \
'</a>' \
.format(CSS_CLASS_THUMB,
thumb_url,
neko259
Fixed popup image preview
r1596 self.hash,
neko259
Store images as regular attachments instead of separate model
r1590 str(pre_width),
str(pre_height), str(width), str(height),
full=self.file.url, image_meta=metadata)
neko259
Load URL if the file could not be loaded
r1660
class UrlViewer(AbstractViewer):
@staticmethod
def supports(file_type):
return file_type is None
def get_view(self):
return '<div class="image">' \
'{}' \
'</div>'.format(self.get_format_view())
neko259
Different images for different URL protocols
r1677
neko259
Load URL if the file could not be loaded
r1660 def get_format_view(self):
neko259
Different images for different URL protocols
r1677 protocol = self.url.split('://')[0]
neko259
Added ability to add links to specific domains and show the domain logo as an image substitute
r1695 domain = self.url.split('/')[2]
if protocol in URL_PROTOCOLS:
url_image_name = URL_PROTOCOLS.get(protocol)
elif domain in URL_DOMAINS:
url_image_name = URL_DOMAINS.get(domain)
else:
url_image_name = FILE_STUB_URL
neko259
Different images for different URL protocols
r1677 image = static('images/' + url_image_name + '.png')
neko259
Use real image stub sizes, not 200x150
r1684 w, h = get_static_dimensions('images/' + url_image_name + '.png')
neko259
Load URL if the file could not be loaded
r1660 return '<a href="{}">' \
neko259
Use real image stub sizes, not 200x150
r1684 '<img class="url-image" src="{}" width="{}" height="{}"/>' \
'</a>'.format(self.url, image, w, h)