On 25/10/14 15:26, Daniel Grace wrote:
> I need to include the following steps, but I don't know how:
> 1. copy the 'picture' file
> 2. resize it (the copy)
> 3. save it to the upload directory
> 4. store it in the 'thumb' field
> ... continue as before and save the 'profile'.
> -- 

Daniel,

I've done something similar for a simple image manager. I have a
WebImage object that holds references to an image and its thumbnail. The
thumbnail is created using imagemagick's convert function when the image
is updated. Extracts from models.py and admin.py shown below should give
you all the clues you need.

John

#################
# models.py

from django.conf import settings
from django.db import models
from django.db.models import F, Q
import os
import uuid
import subprocess

_CONVERT_CMD = '/usr/bin/convert'
_CONVERT_THUMBNAIL_OPTS = ['-thumbnail','150x50']

# ...

class WebImage(models.Model):
  "Images that are used on the web pages. Limited to certain sizes. Can
be produced by an ImageGenerator."
  def get_image_file_path(inst, filename):
    fn, ext = os.path.splitext(filename)
    filename = "%s%s" % (uuid.uuid4(), ext)
    return os.path.join(settings.MEDIA_ROOT+'wi/', filename)
 
  name = models.CharField(max_length=80,help_text="Full name of the web
image")
  slug = models.SlugField(max_length=50,help_text="Slug for the web
image name")
  description = models.TextField(help_text="Image description")
  img =
models.ImageField(null=True,upload_to=get_image_file_path,height_field="height",width_field="width")
  img_gen = models.ForeignKey('ImageGenerator', blank=True, null=True,
on_delete=models.SET_NULL)
  img_size = models.ForeignKey('ImageSize', blank=True, null=True,
default=None, on_delete=models.SET_NULL)
  width = models.IntegerField(editable=False,blank=True,help_text="Width
of the picture. Not editable")
  height =
models.IntegerField(editable=False,blank=True,help_text="Height of the
picture. Not editable")
  licensing = models.TextField(blank=True,help_text="Details of image
ownership, copyright and licensing. Blank for 'same as original image'")
  created_by = models.CharField(editable=False,blank=True,max_length=80,
help_text="Uploader. Not editable")
  creation_date =
models.DateTimeField(editable=False,blank=True,auto_now_add=True,
help_text="Date/time uploaded. Not editable")
  uploaded_by =
models.CharField(editable=False,blank=True,max_length=80,
help_text="Uploader. Not editable")
  upload_date =
models.DateTimeField(editable=False,blank=True,auto_now_add=True,
help_text="Date/time uploaded. Not editable")
  tags = TaggableManager()

  def thumb_path(self):
    return
os.path.join(settings.MEDIA_ROOT+'thumb/',os.path.basename(self.img.name))

  def thumb_url(self):
    return "%sthumb/%s" %
(settings.MEDIA_URL,os.path.basename(self.img.name))

  def create_thumb(self):
    args = [_CONVERT_CMD, self.img.name] + _CONVERT_THUMBNAIL_OPTS +
[self.thumb_path()]
    try:
      output = subprocess.call(args)
    except subprocess.CalledProcessError, e:
      self.description = "%s\n%s\n%d" % (self.description, e.output,
e.returncode)
      pass # This needs to be a logger.
    self.save()

  def thumb_field(self):
    return ('<img src="%s" />' % self.thumb_url())
  thumb_field.short_description = "Thumbnail"
  thumb_field.allow_tags = True

  def get_absolute_url(self):
    return "%swi/%s" % (settings.MEDIA_URL,os.path.split(self.img.name)[1])

  def __unicode__(self):
    return "%s (%dx%d)" % (self.name,self.width,self.height)

########################
# admin.py

class WebImageAdmin(ModelAdmin):
  def save_model(self, req, obj, form, change):
    # Add the uploader info to the object
    if not change or obj.uploaded_by == '':
      obj.uploaded_by = "%s (%s %s)" % (req.user.username,
req.user.first_name, req.user.last_name)
    # And the creator info in the same manner
    if not change or obj.created_by == '':
      obj.created_by = "%s (%s %s)" % (req.user.username,
req.user.first_name, req.user.last_name)
    # And save
    obj.save()
    # Create a thumbnail
    obj.create_thumb()

  list_display = ("__unicode__","img_size","thumb_field",)
  list_filter = ('img_size','width','height')
  ordering = ('name','width','height')
  prepopulated_fields = {"slug": ("name",)}
  save_on_top = True
 
  form = WebImageForm

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/544BEA38.2030801%40martinhome.org.uk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to