##// END OF EJS Templates
Added image aliases to upload the same images (like "fake" or "gtfo")
Added image aliases to upload the same images (like "fake" or "gtfo")

File last commit:

r1500:9178427e default
r1500:9178427e default
Show More
image.py
98 lines | 3.3 KiB | text/x-python | PythonLexer
from django.db import models
from django.template.defaultfilters import filesizeformat
from boards import thumbs, utils
import boards
from boards.models.base import Viewable
from boards.models import STATUS_ARCHIVE
from boards.utils import get_upload_filename
__author__ = 'neko259'
IMAGE_THUMB_SIZE = (200, 150)
HASH_LENGTH = 36
CSS_CLASS_IMAGE = 'image'
CSS_CLASS_THUMB = 'thumb'
class PostImageManager(models.Manager):
def create_with_hash(self, image):
image_hash = utils.get_file_hash(image)
existing = self.filter(hash=image_hash)
if len(existing) > 0:
post_image = existing[0]
else:
post_image = PostImage.objects.create(image=image)
return post_image
def get_random_images(self, count, tags=None):
images = self.exclude(post_images__thread__status=STATUS_ARCHIVE)
if tags is not None:
images = images.filter(post_images__threads__tags__in=tags)
return images.order_by('?')[:count]
class PostImage(models.Model, Viewable):
objects = PostImageManager()
class Meta:
app_label = 'boards'
ordering = ('id',)
width = models.IntegerField(default=0)
height = models.IntegerField(default=0)
pre_width = models.IntegerField(default=0)
pre_height = models.IntegerField(default=0)
image = thumbs.ImageWithThumbsField(upload_to=get_upload_filename,
blank=True, sizes=(IMAGE_THUMB_SIZE,),
width_field='width',
height_field='height',
preview_width_field='pre_width',
preview_height_field='pre_height')
hash = models.CharField(max_length=HASH_LENGTH)
alias = models.TextField(unique=True, null=True, blank=True)
def save(self, *args, **kwargs):
"""
Saves the model and computes the image hash for deduplication purposes.
"""
if not self.pk and self.image:
self.hash = utils.get_file_hash(self.image)
super(PostImage, self).save(*args, **kwargs)
def __str__(self):
return self.image.url
def get_view(self):
metadata = '{}, {}'.format(self.image.name.split('.')[-1],
filesizeformat(self.image.size))
return '<div class="{}">' \
'<a class="{}" href="{full}">' \
'<img class="post-image-preview"' \
' src="{}"' \
' alt="{}"' \
' width="{}"' \
' height="{}"' \
' data-width="{}"' \
' data-height="{}" />' \
'</a>' \
'<div class="image-metadata">'\
'<a href="{full}" download>{image_meta}</a>'\
'</div>' \
'</div>'\
.format(CSS_CLASS_IMAGE, CSS_CLASS_THUMB,
self.image.url_200x150,
str(self.hash), str(self.pre_width),
str(self.pre_height), str(self.width), str(self.height),
full=self.image.url, image_meta=metadata)
def get_random_associated_post(self):
posts = boards.models.Post.objects.filter(images__in=[self])
return posts.order_by('?').first()