##// END OF EJS Templates
Show id of the post you reply to in the form title
Show id of the post you reply to in the form title

File last commit:

r1273:2c3f55c9 default
r1289:15cdb526 default
Show More
image.py
121 lines | 3.8 KiB | text/x-python | PythonLexer
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 import hashlib
import os
from random import random
import time
neko259
Don't return posts with the same image in random view
r1249
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 from django.db import models
neko259
Added image format and size label to images
r1245 from django.template.defaultfilters import filesizeformat
neko259
Don't return posts with the same image in random view
r1249
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 from boards import thumbs
neko259
Don't return posts with the same image in random view
r1249 import boards
neko259
Refactored post image
r931 from boards.models.base import Viewable
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693
__author__ = 'neko259'
IMAGE_THUMB_SIZE = (200, 150)
IMAGES_DIRECTORY = 'images/'
FILE_EXTENSION_DELIMITER = '.'
neko259
Refactored post image
r931 HASH_LENGTH = 36
CSS_CLASS_IMAGE = 'image'
CSS_CLASS_THUMB = 'thumb'
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693
neko259
Refactored post image code. Added a method to create an image or get an...
r1025 class PostImageManager(models.Manager):
def create_with_hash(self, image):
neko259
Refactoring
r1027 image_hash = self.get_hash(image)
neko259
Refactored post image code. Added a method to create an image or get an...
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
Refactoring
r1027 def get_hash(self, image):
"""
Gets hash of an image.
"""
md5 = hashlib.md5()
for chunk in image.chunks():
md5.update(chunk)
return md5.hexdigest()
neko259
Added random images, associated with the tag, to the tag page
r1252 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:
neko259
Show link to posts in this tag for the tag image even if the image is used in...
r1263 images = images.filter(post_images__threads__tags__in=tags)
neko259
Added random images, associated with the tag, to the tag page
r1252 return images.order_by('?')[:count]
neko259
Don't return posts with the same image in random view
r1249
neko259
Refactored post image code. Added a method to create an image or get an...
r1025
neko259
Refactored post image
r931 class PostImage(models.Model, Viewable):
neko259
Refactored post image code. Added a method to create an image or get an...
r1025 objects = PostImageManager()
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 class Meta:
app_label = 'boards'
ordering = ('id',)
neko259
Fixed image filenames
r714 def _update_image_filename(self, filename):
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 """
Gets unique image filename
"""
neko259
Refactored post image code. Added a method to create an image or get an...
r1025 # TODO Use something other than random number in file name
new_name = '{}{}.{}'.format(
neko259
Refactoring
r1027 str(int(time.mktime(time.gmtime()))),
str(int(random() * 1000)),
filename.split(FILE_EXTENSION_DELIMITER)[-1:][0])
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693
neko259
Added support for different attachment types
r1273 return os.path.join(IMAGES_DIRECTORY, new_name)
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693
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=_update_image_filename,
blank=True, sizes=(IMAGE_THUMB_SIZE,),
width_field='width',
height_field='height',
preview_width_field='pre_width',
preview_height_field='pre_height')
neko259
Refactored post image
r931 hash = models.CharField(max_length=HASH_LENGTH)
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
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
Refactoring
r1027 self.hash = PostImage.objects.get_hash(self.image)
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 super(PostImage, self).save(*args, **kwargs)
neko259
Made post image use url as a string in admin site
r812 def __str__(self):
return self.image.url
neko259
Refactored post image
r931 def get_view(self):
neko259
Added image format and size label to images
r1245 metadata = '{}, {}'.format(self.image.name.split('.')[-1],
filesizeformat(self.image.size))
neko259
Refactored post image
r931 return '<div class="{}">' \
neko259
Setting for image view mode: in post (simple) or in popup
r1122 '<a class="{}" href="{full}">' \
'<img class="post-image-preview"' \
neko259
Refactored post image
r931 ' src="{}"' \
' alt="{}"' \
' width="{}"' \
' height="{}"' \
' data-width="{}"' \
' data-height="{}" />' \
'</a>' \
neko259
Added image format and size label to images
r1245 '<div class="image-metadata">{image_meta}</div>' \
neko259
Refactored post image
r931 '</div>'\
neko259
Setting for image view mode: in post (simple) or in popup
r1122 .format(CSS_CLASS_IMAGE, CSS_CLASS_THUMB,
neko259
Refactored post image
r931 self.image.url_200x150,
str(self.hash), str(self.pre_width),
neko259
Added image format and size label to images
r1245 str(self.pre_height), str(self.width), str(self.height),
full=self.image.url, image_meta=metadata)
neko259
Don't return posts with the same image in random view
r1249
neko259
Speed up getting tag's random image
r1264 def get_random_associated_post(self):
neko259
Show link to posts in this tag for the tag image even if the image is used in...
r1263 posts = boards.models.Post.objects.filter(images__in=[self])
return posts.order_by('?').first()