2010-09-16 6 views
1

Je souhaite implémenter une fonctionnalité dans une de mes applications, mais je ne sais pas comment procéder. Ce que je veux c'est ceci: j'ai une classe modèle qui utilise imagekit pour sauvegarder ses images, et j'aimerais que les utilisateurs puissent mettre à jour les images facilement pour les véhicules sans avoir à modifier chaque enregistrement de véhicule respectif.Mise à jour automatique des images

Comment ils vont le faire est qu'il y aura un dossier nommé originals et il y contenir des dossiers pour chaque véhicule dans le format <stock_number>/PUBLIC Si un utilisateur déplace les images dans le dossier PUBLIC pour un véhicule, lorsque le script est exécuté , il compare ces images avec celles en cours et les met à jour si celles du dossier PUBLIC sont plus récentes. Si l'enregistrement n'a pas d'images, elles seront ajoutées. En outre, si les images ont été supprimées du répertoire site_media, leurs liens doivent être supprimés de la base de données.

Comment puis-je m'y prendre de manière efficace? Mes modèles sont comme ci-dessous:

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 J'ai essayé le code, et tout cela fonctionne, je manque quelque chose que je peux obtenir l'image, mais après cela, ils aren » t transféré dans le répertoire site_media/photos ... suis-je supposé faire cela ou imagekit le fera automatiquement? Je suis un peu confus.

Je sauve les photos comme si:

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

Pourriez-vous clarifier la question? Est-ce sur l'écriture du script de mise à jour, ou comment/quand l'exécuter? Vous metion un "moyen efficace" de faire les choses; avez-vous quelque chose qui fonctionne (même partiellement) et cherchez un algorithme plus efficace? –

+0

Il s'agit plus d'écrire le script ... Je suis complètement coincé sur la façon de s'y prendre et aurait besoin d'aide à ce sujet. Toutes les idées sont totalement les bienvenus – Stephen

Répondre

2

Mon conseil est en cours d'exécution script django dans un crontab, disons, 5 en 5 minutes.

Le script plonger dans les dossiers d'images et de comparer les images avec les enregistrements.

Un exemple simplifié:

# 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() 
+0

C'est ce dont j'avais besoin ... merci Paulo. Je pensais déjà à utiliser le crontab donc pas besoin de le mentionner. Je vais également faire quelques changements pour que le script fonctionne via manage.py ... de cette façon, je n'ai pas besoin de faire grand-chose pour les paramètres car cela fera probablement partie d'une configuration plus importante. – Stephen

+0

@ Paulo: Semble que j'ai rencontré un peu de problème ... semble mon edit – Stephen

+0

Je ne suis pas habitué à l'image, je voudrais essayer quelque chose comme: p = Photo (content_object = véhicule, object_id = vehicle.id, original_image = fichier); p.save() –

Questions connexes