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) 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 '
' \ '' \ '{}' \ '' \ '
'\ '{image_meta}'\ '
' \ '
'\ .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()