fix buggy media migration:
[wolnelektury.git] / apps / catalogue / migrations / 0005_many2many_files_for_books.py
index cf72b2c..0af3cba 100644 (file)
@@ -3,31 +3,24 @@ import datetime
 from south.db import db
 from south.v2 import SchemaMigration
 from django.db import models
+from django.utils import simplejson as json
+from mutagen import id3
+
+
+def get_mp3_info(file):
+    """Retrieves artist and director names from audio ID3 tags."""
+    try:
+        audio = id3.ID3(file.path)
+        artist_name = ', '.join(', '.join(tag.text) for tag in audio.getall('TPE1'))
+        director_name = ', '.join(', '.join(tag.text) for tag in audio.getall('TPE3'))
+    except:
+        artist_name = director_name = ''
+    return {'artist_name': artist_name, 'director_name': director_name}
+
 
 class Migration(SchemaMigration):
 
     def forwards(self, orm):
-        # Saving data which would be 'Lost In Migration'
-        if not db.dry_run:        
-            medias = []
-            for book in orm.Book.objects.all():
-                try:
-                    medias.append({"url": book.odt_file.url,   "book": book, "type": "odt"  })
-                except:
-                    pass
-                try:
-                    medias.append({"url": book.daisy_file.url, "book": book, "type": "daisy"})
-                except:
-                    pass
-                try:
-                    medias.append({"url": book.ogg_file.url,   "book": book, "type": "ogg"  })
-                except:
-                    pass
-                try:
-                    medias.append({"url": book.mp3_file.url,   "book": book, "type": "mp3"  })            
-                except:
-                    pass
-
         # Adding model 'BookMedia'
         db.create_table('catalogue_bookmedia', (
             ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
@@ -35,9 +28,40 @@ class Migration(SchemaMigration):
             ('name', self.gf('django.db.models.fields.CharField')(max_length='100', blank=True)),
             ('file', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)),
             ('uploaded_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+            ('extra_info', self.gf('catalogue.fields.JSONField')(default='{}')),
         ))
         db.send_create_signal('catalogue', ['BookMedia'])
 
+        # Adding M2M table for field medias on 'Book'
+        db.create_table('catalogue_book_medias', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('book', models.ForeignKey(orm['catalogue.book'], null=False)),
+            ('bookmedia', models.ForeignKey(orm['catalogue.bookmedia'], null=False))
+        ))
+        db.create_unique('catalogue_book_medias', ['book_id', 'bookmedia_id'])
+
+        # Data migration
+        if not db.dry_run:
+            jsonencoder = json.JSONEncoder()
+            for book in orm['old.book'].objects.all():
+                medias = []
+                if book.odt_file:
+                    medias.append({"file": book.odt_file, "type": "odt"})
+                if book.daisy_file:
+                    medias.append({"file": book.daisy_file, "type": "daisy"})
+                if book.ogg_file:
+                    medias.append({"file": book.ogg_file, "type": "ogg"})
+                if book.mp3_file:
+                    medias.append({"file": book.mp3_file, "type": "mp3"})
+                newbook = orm.Book.objects.get(pk=book.pk)
+                for media in medias:
+                    name = book.title
+                    bookMedia = orm.BookMedia.objects.create(file=media['file'], type=media['type'], name=name)
+                    if bookMedia.type == 'mp3':
+                        bookMedia.extra_info = jsonencoder.encode(get_mp3_info(bookMedia.file))
+                        bookMedia.save()
+                    newbook.medias.add(bookMedia)
+
         # Deleting field 'Book.odt_file'
         db.delete_column('catalogue_book', 'odt_file')
 
@@ -50,43 +74,25 @@ class Migration(SchemaMigration):
         # Deleting field 'Book.mp3_file'
         db.delete_column('catalogue_book', 'mp3_file')
 
-        # Adding M2M table for field medias on 'Book'
-        db.create_table('catalogue_book_medias', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('book', models.ForeignKey(orm['catalogue.book'], null=False)),
-            ('bookmedia', models.ForeignKey(orm['catalogue.bookmedia'], null=False))
-        ))
-        db.create_unique('catalogue_book_medias', ['book_id', 'bookmedia_id'])
-
         # Changing field 'Tag.main_page'
         db.alter_column('catalogue_tag', 'main_page', self.gf('django.db.models.fields.BooleanField')(blank=True))
 
-        # Moving data from previous state to the new one
-        if not db.dry_run:        
-            for media in medias:
-                try:
-                    name = media['url'].split("/")[-1].split(".")[1]
-                except:
-                    name = media['url'].split("/")[-1]
-                bookMedia = orm.BookMedia.objects.create(file=media['url'], type=media['type'], name=name)
-                media['book'].medias.add(bookMedia)
-                
+
     def backwards(self, orm):
-        
         # Deleting model 'BookMedia'
         db.delete_table('catalogue_bookmedia')
 
         # Adding field 'Book.odt_file'
-        db.add_column('catalogue_book', 'odt_file', self.gf('django.db.models.fields.files.FileField')(default=None, max_length=100, blank=True), keep_default=False)
+        db.add_column('catalogue_book', 'odt_file', self.gf('django.db.models.fields.files.FileField')(default='', max_length=100, blank=True), keep_default=False)
 
         # Adding field 'Book.daisy_file'
-        db.add_column('catalogue_book', 'daisy_file', self.gf('django.db.models.fields.files.FileField')(default=None, max_length=100, blank=True), keep_default=False)
+        db.add_column('catalogue_book', 'daisy_file', self.gf('django.db.models.fields.files.FileField')(default='', max_length=100, blank=True), keep_default=False)
 
         # Adding field 'Book.ogg_file'
-        db.add_column('catalogue_book', 'ogg_file', self.gf('django.db.models.fields.files.FileField')(default=None, max_length=100, blank=True), keep_default=False)
+        db.add_column('catalogue_book', 'ogg_file', self.gf('django.db.models.fields.files.FileField')(default='', max_length=100, blank=True), keep_default=False)
 
         # Adding field 'Book.mp3_file'
-        db.add_column('catalogue_book', 'mp3_file', self.gf('django.db.models.fields.files.FileField')(default=None, max_length=100, blank=True), keep_default=False)
+        db.add_column('catalogue_book', 'mp3_file', self.gf('django.db.models.fields.files.FileField')(default='', max_length=100, blank=True), keep_default=False)
 
         # Removing M2M table for field medias on 'Book'
         db.delete_table('catalogue_book_medias')
@@ -157,6 +163,7 @@ class Migration(SchemaMigration):
         },
         'catalogue.bookmedia': {
             'Meta': {'object_name': 'BookMedia'},
+            'extra_info': ('catalogue.fields.JSONField', [], {'default': "'{}'"}),
             'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
             'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
             'name': ('django.db.models.fields.CharField', [], {'max_length': "'100'"}),
@@ -226,6 +233,39 @@ class Migration(SchemaMigration):
             'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
             'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
             'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'old.book': {
+            'Meta': {'ordering': "('title',)", 'object_name': 'Book', 'db_table': "'catalogue_book'"},
+            '_short_html': ('django.db.models.fields.TextField', [], {}),
+            '_short_html_de': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
+            '_short_html_en': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
+            '_short_html_es': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
+            '_short_html_fr': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
+            '_short_html_lt': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
+            '_short_html_pl': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
+            '_short_html_ru': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
+            '_short_html_uk': ('django.db.models.fields.TextField', [], {'null': True, 'blank': True}),
+            '_tag_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}),
+            '_theme_counter': ('catalogue.fields.JSONField', [], {'null': 'True'}),
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'daisy_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'epub_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'extra_info': ('catalogue.fields.JSONField', [], {}),
+            'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}),
+            'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'mp3_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'ogg_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'children'", 'blank': 'True', 'null': 'True', 'to': "orm['catalogue.Book']"}),
+            'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'unique': 'True', 'db_index': 'True'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+            'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}),
+            'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'})
         }
     }