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