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 -~----------~----~----~----~------~----~------~--~---