Hi!

Before I paste the code here is what I want to achieve:
1) All content is supplied via django admin, no custom upload/edit
forms
2) The Photo class holds title and note (the text data), two images
(full and thumb), and stats data of hits and comments count
3) The stamp should be updated only when the text data or full image
change (only full as...)
4) When image is uploaded it should be resized if too large and the
thumbnail should be auto(re)generated

Here is the code:
from django.db import models
from django.conf import settings
from PIL import Image
from datetime import datetime as dt
import md5, time, os

class Tag(models.Model):
        stamp = models.DateTimeField(auto_now = True)
        name = models.CharField(max_length = 32)

        class Meta:
                ordering = ['name']
                get_latest_by = '-stamp'

        def __unicode__(self):
                return self.name

class Photo(models.Model):
        stamp = models.DateTimeField(auto_now_add = True)
        title = models.CharField(max_length = 255)
        note = models.TextField()
        content_hash = models.CharField(max_length = 32, editable = False)
        upload_image = models.ImageField(upload_to = 'photos/tmp', blank =
True)
        ifull = models.CharField(max_length = 128, editable = False)
        ithumb = models.CharField(max_length = 128, editable = False)
        image_hash = models.CharField(max_length = 32, editable = False)
        hits = models.PositiveIntegerField(default = 0, editable = False)
        comments_count = models.PositiveIntegerField(default = 0, editable =
False)
        tags = models.ManyToManyField(Tag)

        class Meta:
                ordering = ['-stamp']
                get_latest_by = '-stamp'

        def __unicode__(self):
                return self.title

        def save(self):
                try:
                        new_hash =
md5.new(self.upload_image.read(num_bytes = 1024)).hexdigest()
                        if new_hash != self.image_hash:
                                if self.ifull:
                                        name = self.ifull.split('/')
[-1]
                                else:
                                        name = str(int(time.time())) +
'.jpg'
                                img =
Image.open(self.upload_image.path)
                                img.load()
                                self.upload_image.delete(save = False)
                                if img.size > (800, 600):
                                        img.thumbnail((800, 600),
Image.ANTIALIAS)
                                img.save(settings.MEDIA_ROOT + 'photos/
full/' + name, 'jpeg')
                                img.thumbnail((128, 128),
Image.ANTIALIAS)
                                img.save(settings.MEDIA_ROOT + 'photos/
thumb/' + name, 'jpeg')
                                self.ifull = '/data/photos/full/' +
name
                                self.ithumb = '/data/photos/thumb/' +
name
                                self.image_hash = new_hash
                                self.stamp = dt.now()
                except Exception, e:
                        pass
                new_hash = md5.new(self.title + self.note).hexdigest()
                if new_hash != self.content_hash:
                        self.content_hash = new_hash
                        self.stamp = dt.now()
                super(Photo, self).save()

        def delete(self):
                if self.ifull:
                        name = self.ifull.split('/')[-1]
                        try:
                                os.remove(settings.MEDIA_ROOT +
'photos/thumb/' + name)
                                os.remove(settings.MEDIA_ROOT +
'photos/full/' + name)
                        except Exception, e:
                                pass
                super(Photo, self).delete()

class Comment(models.Model):
        stamp = models.DateTimeField(auto_now_add = True)
        ip = models.IPAddressField()
        signature = models.CharField(max_length = 64)
        content = models.TextField()
        photo = models.ForeignKey(Photo)

        class Meta:
                ordering = ['-stamp']
                get_latest_by = '-stamp'

        def __unicode__(self):
                return self.content

        def save(self):
                self.photo.comments_count += 1
                self.photo.save()
                super(Comment, self).save()

        def delete(self):
                self.photo.comments_count -= 1
                self.photo.save()
                super(Comment, self).delete()

As you can see, I'm using a temporary filed for image upload and
(hackish) code to make the thumbnail and generate urls, delete files
when removing, update the stamp only when necessary etc...

At first I was trying to use two ImageFields, so the uploaded image
will be the full image (resized if necessary), and the thumb generated
from the full image, but it is impossible to assign to an empty
ImageField anything that works right, and the .url attribute never
worked okey (the best i got was upload_to + filename). I have static
files served from another url ('/data' as you should figure out from
the code).

I think that it would be nice if i could do something like that:
1) full_image is ImageField with uploaded image, upload_to='photos/
full'
2) thumb_image is an empty ImageFIeld, upload_to='photos/thumb')
3) they both have somehow set base_url to '/data', so for example
full_image.url should be '/data/photos/full/name' (base_url +
upload_to + filename)
img = Image.open(full_image.path)
if img.size > (800, 600):
  img.thumbnail((800, 600), Image.ANTIALIAS)
img.save(full_image.file, 'jpeg') # this is _really_ what it should
work like.... :S
full_image.rename(_generated_name_)
thumb_image.new(_generated_name_) # creates a file in the directory
it's already assigned to, as when uploading...
img.thumbnail((128, 128), Image.ANTIALIAS)
img.save(thumb_image.file, 'jpeg')
# DONE!
and now:
full_image.url -> '/data/photos/full/_generated_name_'  (base_url +
upload_to + filename)
full_image.path -> '/mediaroot/photos/full/
_generated_name_' (media_root + upload_to + filename)

Huh, I hope you understand what I have on mind... Any ideas how to
make my code cleaner will be appreciated! :)

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to