concurrency: no model save at file save in tasks
[audio.git] / apps / archive / tasks.py
index 9af3492..27b6d00 100755 (executable)
@@ -31,8 +31,8 @@ class AudioFormatTask(Task):
 
     @classmethod
     def set_status(cls, audiobook, status):
-        setattr(audiobook, '%s_status' % cls.ext, status)
-        audiobook.save()
+        Audiobook.objects.filter(pk=audiobook.pk).update(
+            **{'%s_status' % cls.ext: status})
 
     @staticmethod
     def encode(in_path, out_path):
@@ -47,18 +47,25 @@ class AudioFormatTask(Task):
 
     @classmethod
     def save(cls, audiobook, file_name):
-        getattr(audiobook, "%s_file" % cls.ext).save(
+        field = "%s_file" % cls.ext
+        getattr(audiobook, field).save(
             "%d.%s" % (audiobook.pk, cls.ext),
-            ExistingFile(file_name)
+            ExistingFile(file_name),
+            save=False
             )
+        Audiobook.objects.filter(pk=audiobook.pk).update(
+            **{field: getattr(audiobook, field)})
 
     @classmethod
     def published(cls, audiobook):
-        setattr(audiobook, "%s_published_tags" % cls.ext,
-            getattr(audiobook, "%s_tags" % cls.ext))
-        setattr(audiobook, "%s_tags" % cls.ext, None)
-        setattr(audiobook, "%s_published" % cls.ext, datetime.now())
-        cls.set_status(audiobook, None)
+        kwargs = {
+            "%s_published_tags" % cls.ext: 
+                    getattr(audiobook, "%s_tags" % cls.ext),
+            "%s_tags" % cls.ext: None,
+            "%s_published" % cls.ext: datetime.now(),
+            '%s_status' % cls.ext: None,
+        }
+        Audiobook.objects.filter(pk=audiobook.pk).update(**kwargs)
 
     @classmethod
     def put(cls, audiobook):
@@ -72,7 +79,6 @@ class AudioFormatTask(Task):
             pipes.quote(slug),
             pipes.quote(name)
             )).encode('utf-8')
-        print command
         if UPLOAD_SUDO:
             api.sudo(command, user=UPLOAD_SUDO, shell=False)
         else:
@@ -101,7 +107,6 @@ class AudioFormatTask(Task):
         self.put(audiobook)
 
         self.published(audiobook)
-        audiobook.save()
 
 
 class Mp3Task(AudioFormatTask):