mirror of
https://github.com/pinry/pinry.git
synced 2026-03-05 03:31:09 +01:00
Move custom ModelManagers to the managers.py module
This commit is contained in:
42
pinry/pins/managers.py
Normal file
42
pinry/pins/managers.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import os
|
||||
import urllib2
|
||||
from cStringIO import StringIO
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.files.uploadedfile import InMemoryUploadedFile
|
||||
from django.db import models
|
||||
|
||||
from . import utils
|
||||
|
||||
|
||||
class OriginalImageManager(models.Manager):
|
||||
def create_for_url(self, url):
|
||||
buf = StringIO()
|
||||
buf.write(urllib2.urlopen(url).read())
|
||||
fname = url.split('/')[-1]
|
||||
temporary_file = InMemoryUploadedFile(buf, "image", fname,
|
||||
content_type=None, size=buf.tell(), charset=None)
|
||||
temporary_file.name = fname
|
||||
return self.create(image=temporary_file)
|
||||
|
||||
|
||||
class BaseImageManager(models.Manager):
|
||||
image_size = None
|
||||
|
||||
def get_or_create_for(self, original):
|
||||
buf = StringIO()
|
||||
img = utils.scale_and_crop(original.image, settings.IMAGE_SIZES[self.image_size])
|
||||
img.save(buf, img.format, **img.info)
|
||||
original_dir, original_file = os.path.split(original.image.name)
|
||||
file_obj = InMemoryUploadedFile(buf, "image", original_file, None, buf.tell(), None)
|
||||
image = self.create(original=original, image=file_obj)
|
||||
|
||||
return image
|
||||
|
||||
|
||||
class StandardImageManager(BaseImageManager):
|
||||
image_size = 'standard'
|
||||
|
||||
|
||||
class ThumbnailManager(BaseImageManager):
|
||||
image_size = 'thumbnail'
|
||||
@@ -1,15 +1,13 @@
|
||||
import hashlib
|
||||
import os
|
||||
import urllib2
|
||||
|
||||
from cStringIO import StringIO
|
||||
from django.db import models
|
||||
from django.conf import settings
|
||||
from django.core.files.uploadedfile import InMemoryUploadedFile
|
||||
|
||||
from taggit.managers import TaggableManager
|
||||
|
||||
from pinry.core.models import User
|
||||
from . import utils
|
||||
from ..core.models import User
|
||||
from .managers import OriginalImageManager
|
||||
from .managers import StandardImageManager
|
||||
from .managers import ThumbnailManager
|
||||
|
||||
|
||||
def hashed_upload_to(prefix, instance, filename):
|
||||
@@ -39,43 +37,6 @@ def standard_upload_to(instance, filename):
|
||||
return hashed_upload_to('image/standard/by-md5', instance, filename)
|
||||
|
||||
|
||||
class OriginalImageManager(models.Manager):
|
||||
def create_for_url(self, url):
|
||||
buf = StringIO()
|
||||
buf.write(urllib2.urlopen(url).read())
|
||||
fname = url.split('/')[-1]
|
||||
temporary_file = InMemoryUploadedFile(buf, "image", fname,
|
||||
content_type=None, size=buf.tell(), charset=None)
|
||||
temporary_file.name = fname
|
||||
return OriginalImage.objects.create(image=temporary_file)
|
||||
|
||||
|
||||
class BaseImageManager(models.Manager):
|
||||
def get_or_create_for_id_class(self, original_id, cls, image_size):
|
||||
original = OriginalImage.objects.get(pk=original_id)
|
||||
buf = StringIO()
|
||||
img = utils.scale_and_crop(original.image, image_size)
|
||||
img.save(buf, img.format, **img.info)
|
||||
original_dir, original_file = os.path.split(original.image.name)
|
||||
file_obj = InMemoryUploadedFile(buf, "image", original_file, None, buf.tell(), None)
|
||||
image = cls.objects.create(original=original, image=file_obj)
|
||||
|
||||
return image
|
||||
|
||||
def get_or_create_for_id(self, original_id):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
class StandardImageManager(BaseImageManager):
|
||||
def get_or_create_for_id(self, original_id):
|
||||
return self.get_or_create_for_id_class(original_id, StandardImage, settings.IMAGE_SIZES['standard'])
|
||||
|
||||
|
||||
class ThumbnailManager(BaseImageManager):
|
||||
def get_or_create_for_id(self, original_id):
|
||||
return self.get_or_create_for_id_class(original_id, Thumbnail, settings.IMAGE_SIZES['thumbnail'])
|
||||
|
||||
|
||||
class Image(models.Model):
|
||||
height = models.PositiveIntegerField(default=0, editable=False)
|
||||
width = models.PositiveIntegerField(default=0, editable=False)
|
||||
@@ -120,8 +81,8 @@ class Pin(models.Model):
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.pk:
|
||||
self.original = OriginalImage.objects.create_for_url(self.url)
|
||||
self.standard = StandardImage.objects.get_or_create_for_id(self.original.pk)
|
||||
self.thumbnail = Thumbnail.objects.get_or_create_for_id(self.original.pk)
|
||||
self.standard = StandardImage.objects.get_or_create_for(self.original)
|
||||
self.thumbnail = Thumbnail.objects.get_or_create_for(self.original)
|
||||
super(Pin, self).save(*args, **kwargs)
|
||||
|
||||
class Meta:
|
||||
|
||||
Reference in New Issue
Block a user