1

I'd like to implement a functionality in an app of mine, but I don't know how to go about it. What I want is this: I have a model class that uses imagekit to save its images, and I'd like to have the users being able to update the images easily for the vehicles without having to edit each respective vehicle record.

How they'll do this is that there will be a folder named originals and it'll contain folders for each vehicle in the format <stock_number>/PUBLIC If a user moves images into the PUBLIC folder for a vehicle, when the script is executed, it'll compare those images with the current ones and update them if those in the PUBLIC folder are newer. If the record has no images, then they will be added. Also, if the images have been deleted from the site_media directory, then their links should be deleted from the database.

How can I go about this in an efficient way? My models are as below:

class Photo(ImageModel):
   name = models.CharField(max_length = 100)
   original_image = models.ImageField(upload_to = 'photos')
   num_views = models.PositiveIntegerField(editable = False, default=0)
   position = models.ForeignKey(PhotoPosition)
   content_type = models.ForeignKey(ContentType)
   object_id = models.PositiveIntegerField()
   content_object = generic.GenericForeignKey('content_type', 'object_id')

   class IKOptions:
      spec_module = 'vehicles.specs'
      cache_dir = 'photos'
      image_field = 'original_image'
      save_count_as = 'num_views'


class Vehicle(models.Model):
   objects = VehicleManager()
   stock_number = models.CharField(max_length=6, blank=False, unique=True)
   vin = models.CharField(max_length=17, blank=False)
   ....
   images = generic.GenericRelation('Photo', blank=True, null=True)

Progress Update I've tried out the code, and while it works, I'm missing something as I can get the image, but after that, they aren't transferred into the site_media/photos directory...am I suppossed to do this or imagekit will do this automatically? I'm a bit confused.

I'm saving the photos like so:

Photo.objects.create(content_object = vehicle, object_id = vehicle.id, 
                     original_image = file)
Mariusz Jamro
  • 30,615
  • 24
  • 120
  • 162
Stephen
  • 5,959
  • 10
  • 33
  • 43
  • Could you clarify the question? Is this about writing the update script, or how/when to run it? You metion an "efficient way" of doing things; do you have something that works (even partially) and are looking for a more efficient algorithm? – André Caron Sep 24 '10 at 02:02
  • It's more of writing the script...I'm totally stuck as to how to go about it and would need help on this. Any ideas are totally welcome – Stephen Sep 24 '10 at 09:45

1 Answers1

2

My advice is running django script in a crontab job, lets say, 5 in 5 minutes.

The script would dive into the image folders and compare the images with the records.

A simplified example:

# Set up the Django Enviroment
from django.core.management import setup_environ 
import settings 
setup_environ(settings)
import os
from your_project.your_app.models import *
from datetime import datetime

vehicles_root = '/home/vehicles'
for stock_number in os.listdir(vehicles_root):
    cur_path = vehicles_root+'/'+stock_number
    if not os.path.isdir(cur_path):
        continue # skip non dirs
    for file in os.listdir(cur_path):
        if not isfile(cur_path+'/'+file):
            continue # skip non file
        ext = file.split('.')[-1]
        if ext.lower() not in ('png','gif','jpg',):
            continue # skip non image
        last_mod = os.stat(cur_path+'/'+file).st_mtime
        v = Vehicle.objects.get(stock_number=stock_number)
        if v.last_upd < datetime.fromtimestamp(last_mod):
            # do your magic here, move image, etc.
            v.last_upd = datetime.now()
            v.save()
Paulo Scardine
  • 73,447
  • 11
  • 124
  • 153
  • This is what I needed...thank you Paulo. I was already thinking of using the crontab so no need to mention that. I'll also make some changes so that the script runs via manage.py...this way I don't need to do much for settings as this will probably be part of a larger setup. – Stephen Sep 24 '10 at 12:14
  • @ Paulo: Seems I've ran into a bit of a problem...seem my edit – Stephen Sep 28 '10 at 14:58
  • I'm not used to imagekit, I would try something like: p = Photo(content_object=vehicle, object_id=vehicle.id, original_image=file); p.save() – Paulo Scardine Sep 28 '10 at 15:20
  • p = Photo(content_object=vehicle, object_id=vehicle.id, original_image=file); p.save() will basically do what I have I think...anyway, let me see if I can figure out the problem here...thnx again Paulo – Stephen Sep 28 '10 at 16:05
  • I've finally gotten the code to work as I want. Thank you for your idea. – Stephen Oct 21 '10 at 12:58