mirror of
https://github.com/pinry/pinry.git
synced 2025-11-13 16:45:41 +01:00
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.
50 lines
1.5 KiB
Python
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
|