import hashlib import os from random import random import time 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.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, include_archived=False, tags=None): images = self.filter(post_images__thread__archived=include_archived) 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()