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)),
('type', self.gf('django.db.models.fields.CharField')(max_length='100')),
- ('name', self.gf('django.db.models.fields.CharField')(max_length='100')),
+ ('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')
# 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')
'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'}),
- 'odt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
- 'daisy_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
- 'mp3_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'}),
'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'}),
},
'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'"}),
'main_page': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}),
- 'sort_key': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}),
+ 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'})
},
'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'})
}
}