Files
Pinry/pinry/core/models.py
Krzysztof Klimonda 7db42bb075 Generate thumbnails when image is being saved
Too lax unique constraints for Thumbnail coped with "on demand" thumbnail
generation may leave database in inconsistent state where two thumbnail for
the same size are saved. We should be able to prevent that from happening
by generating all thumbnails when we save the image. Should fix #24, but
I can't figure out a way to actually test it.
2013-04-16 00:30:43 +02:00

50 lines
1.5 KiB
Python

import requests
from cStringIO import StringIO
from django.conf import settings
from django.core.files.uploadedfile import InMemoryUploadedFile
from django.db import models, transaction
from django_images.models import Image as BaseImage, Thumbnail
from taggit.managers import TaggableManager
from ..users.models import User
class ImageManager(models.Manager):
# FIXME: Move this into an asynchronous task
def create_for_url(self, url):
file_name = url.split("/")[-1]
buf = StringIO()
response = requests.get(url)
buf.write(response.content)
obj = InMemoryUploadedFile(buf, 'image', file_name,
None, buf.tell(), None)
# create the image and its thumbnails in one transaction, removing
# a chance of getting Database into a inconsistent state when we
# try to create thumbnails one by one later
image = self.create(image=obj)
for size in settings.IMAGE_SIZES.keys():
Thumbnail.objects.get_or_create_at_size(image.pk, size)
return image
class Image(BaseImage):
objects = ImageManager()
class Meta:
proxy = True
class Pin(models.Model):
submitter = models.ForeignKey(User)
url = models.URLField(null=True)
origin = models.URLField(null=True)
description = models.TextField(blank=True, null=True)
image = models.ForeignKey(Image, related_name='pin')
published = models.DateTimeField(auto_now_add=True)
tags = TaggableManager()
def __unicode__(self):
return self.url