Автоматически обновлять изображения

Я хотел бы реализовать функциональность в моем приложении, но я не знаю, как это сделать. Я хочу вот что: у меня есть класс модели, который использует imagekit для сохранения своих изображений, и я хотел бы, чтобы пользователи могли легко обновлять изображения для транспортных средств без необходимости редактирования каждой соответствующей записи транспортного средства.

Как они это сделают, так это то, что будет папка с именем originals, и она будет содержать папки для каждого автомобиля в формате <stock_number>/PUBLIC Если пользователь переместит изображения в папку PUBLIC для автомобиля, когда скрипт будет выполнен, он будет сравните эти изображения с текущими и обновите их, если те, что в папке PUBLIC, новее. Если в записи нет изображений, то они будут добавлены. Также, если изображения были удалены из каталога site_media, то их ссылки должны быть удалены из базы данных.

Как я могу сделать это эффективным способом? Мои модели, как показано ниже:

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)

Обновление хода выполнения Я опробовал код, и пока он работает, я что-то упускаю, так как могу получить изображение, но после этого они не переносятся в каталог site_media/photos... я должен это сделать или imagekit сделает это автоматически? Я немного смущен.

Я сохраняю фотографии так:

Photo.objects.create(content_object = vehicle, object_id = vehicle.id, 
                     original_image = file)

person Stephen    schedule 16.09.2010    source источник
comment
Не могли бы вы уточнить вопрос? Речь идет о написании сценария обновления или о том, как/когда его запускать? Вы упомянули эффективный способ ведения дел; у вас есть что-то, что работает (хотя бы частично) и вы ищете более эффективный алгоритм?   -  person André Caron    schedule 24.09.2010
comment
Это скорее написание сценария... Я полностью застрял в том, как это сделать, и мне нужна помощь в этом. Любые идеи полностью приветствуются   -  person Stephen    schedule 24.09.2010


Ответы (1)


Мой совет - запустить скрипт django в задании crontab, скажем, 5 за 5 минут.

Сценарий погружался в папки с изображениями и сравнивал изображения с записями.

Упрощенный пример:

# 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()
person Paulo Scardine    schedule 24.09.2010
comment
Это то, что мне было нужно... спасибо, Пауло. Я уже думал об использовании crontab, поэтому нет необходимости упоминать об этом. Я также внесу некоторые изменения, чтобы скрипт запускался через manage.py... таким образом, мне не нужно много делать для настроек, так как это, вероятно, будет частью более крупной установки. - person Stephen; 24.09.2010
comment
@ Пауло: Кажется, я столкнулся с небольшой проблемой... кажется, мое редактирование - person Stephen; 28.09.2010
comment
Я не привык к imagekit, я бы попробовал что-то вроде: p = Photo(content_object=vehicle, object_id=vehicle.id, original_image=file); п.сохранить() - person Paulo Scardine; 28.09.2010
comment
p = Фото(content_object=транспортное средство, object_id=транспортное средство.id, original_image=файл); p.save() будет в основном делать то, что я думаю... в любом случае, дайте мне посмотреть, смогу ли я понять проблему здесь... еще раз спасибо, Пауло - person Stephen; 28.09.2010
comment
Наконец-то я заставил код работать так, как я хочу. Спасибо за вашу идею. - person Stephen; 21.10.2010