Great tip, Thanks!
Here my code, just in case someone is interested:
from django.db import models
from django.utils.translation import ugettext as _
import Image as PilImage
import settings as s
import os
class Gallery(models.Model):
title = models.CharField(_("Name"), max_length=200)
slug = models.SlugField(help_text=_("Used for URLs"))
def __unicode__(self):
return unicode(self.title)
def delete(self):
for p in self.photo_set.all():
p.delete()
super(Gallery, self).delete()
def get_absolute_url(self):
return '/portfolio/'+self.slug
class Photo(models.Model):
picture = models.ImageField(null=True, upload_to='./images/')
caption = models.CharField(_("Optional
caption"),max_length=100,null=True, blank=True)
item = models.ForeignKey(Gallery)
def __unicode__(self):
return unicode(self.picture)
def delete(self):
for t in self.thumbnail_set.all():
t.delete()
super(Photo, self).delete()
class Thumbnail(models.Model):
item = models.ForeignKey(Photo)
dimensions = models.CharField(max_length=10)
miniature_url = models.CharField(max_length=100)
x,y = None, None
def __unicode__(self):
return "Thumbnail %s of %s" %(self.dimensions, self.item)#
def delete(self):
try:
os.remove(self.miniature_filename)
except OSError:
pass
super(Thumbnail, self).delete()
if '.DS_Store' in os.listdir(self.miniature_folder):
os.listdir(self.miniature_folder).remove('.DS_Store')
def process(self):
x,y=None,None
if 'x' in self.dimensions:
x, y = [int(x) for x in self.dimensions.split('x')]
elif 'w' in self.dimensions:
x = int(self.dimensions[1:])
elif 'h' in self.dimensions:
y = int(self.dimensions[1:])
self.size = [x,y]
# defining the filename and the miniature filename
basename, format = self.item.picture.name.rsplit('.', 1)
self.miniature_folder = os.path.join(s.MEDIA_ROOT, basename
+'/')
if not os.path.exists(self.miniature_folder):
os.mkdir(self.miniature_folder)
miniature = basename + '/' +self.dimensions.replace(' ','') +
'.' + format
self.miniature_filename = os.path.join(s.MEDIA_ROOT, miniature)
self.miniature_url = os.path.join(s.MEDIA_URL, miniature)
self.filename =
os.path.join(s.MEDIA_ROOT,self.item.picture.name)
def make_thumbnail(self):
if not os.path.exists(self.miniature_filename):
image = PilImage.open(self.filename)
old_image_size=image.size
if not self.x or not self.y:
self.x, self.y = image.size
if not self.size[1]:
self.size[1]=int(self.y*(float(self.size[0])/self.x))
elif not self.size[0]:
self.size[0]=int(self.x*(float(self.size[1])/self.y))
image.thumbnail([self.size[0],self.size[1]],PilImage.ANTIALIAS)
image.save(self.miniature_filename, image.format)
### Signals instead of overwriting __init__(self)
from django.db.models.signals import post_init
def thumb_init(sender, **kwargs):
kwargs['instance'].process()
kwargs['instance'].make_thumbnail()
post_init.connect(thumb_init, sender=Thumbnail)
Am 01.10.2008 um 16:15 schrieb Manuel Meyer:
>
>
> Am 30.09.2008 um 20:21 schrieb Rajesh Dhawan:
>>
>> You are overriding __init__ but not making sure to call the base
>> class's __init__ method which does a whole bunch of stuff whenever a
>> new instance of a Model class is created. This is most definitely
>> causing your problem. It's best not to overload it with your own
>> __init__. A better option is to hook into the post_init signal with a
>> custom method and in that method do your process() and
>> make_thumbnail() calls.
>
> Thanks, I will have a look on it.
>>
>>
>> See:
>> - http://docs.djangoproject.com/en/dev//topics/signals/
>> - http://docs.djangoproject.com/en/dev/ref/signals/
>>
>>
>> -RD
>>>
>
>
> >
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---