Implement importing old SQLite3 DB via command line.

This commit is contained in:
Josh Washburne 2018-01-04 16:29:59 -05:00
parent a5a275ef5a
commit e0465acb67
3 changed files with 163 additions and 0 deletions

View file

@ -0,0 +1,163 @@
from decimal import *
import os
import sqlite3
from django.core.management.base import BaseCommand, CommandError
from radio.models import Album, Artist, Game, Song
getcontext().prec = 8
def adapt_decimal(d):
return str(d)
def convert_decimal(s):
return Decimal(s.decode('utf8'))
# Register the adapter
sqlite3.register_adapter(Decimal, adapt_decimal)
# Register the converter
sqlite3.register_converter("decimal", convert_decimal)
class Command(BaseCommand):
help = 'Imports the old radio data from the original sqlite3 database'
def add_arguments(self, parser):
parser.add_argument('sqlite3_db_file', nargs=1)
def handle(self, *args, **options):
if not os.path.isfile(options['sqlite3_db_file'][0]):
raise CommandError('File does not exist')
else:
total_albums = 0
total_artists = 0
total_games = 0
total_songs = 0
total_jingles = 0
con = sqlite3.connect(options['sqlite3_db_file'][0],
detect_types=sqlite3.PARSE_DECLTYPES |
sqlite3.PARSE_COLNAMES)
cur = con.cursor()
# Fetching albums first
for album in con.execute('SELECT title, enabled FROM albums'):
album_disabled = not bool(album[1])
Album.objects.create(title=album[0], disabled=album_disabled)
total_albums += 1
self.stdout.write('Imported {} albums'.format(str(total_albums)))
# Next up, artists
cur.execute('''SELECT
artists_id,
alias,
firstname,
lastname,
enabled
FROM artists''')
artists = cur.fetchall()
for artist in artists:
artist_disabled = not bool(artist[4])
Artist.objects.create(alias=artist[1] or '',
first_name=artist[2] or '',
last_name=artist[3] or '',
disabled=artist_disabled)
total_artists += 1
self.stdout.write('Imported {} artists'.format(str(total_artists)))
# On to games
for game in con.execute('SELECT title, enabled FROM games'):
game_disabled = not bool(game[1])
Game.objects.create(title=game[0], disabled=game_disabled)
total_games += 1
self.stdout.write('Imported {} games'.format(str(total_games)))
# Followed by the songs
cur.execute('''SELECT
songs.songs_id AS id,
games.title AS game,
albums.title AS album,
songs.enabled AS enabled,
songs.type AS type,
songs.title AS title,
songs.length AS length,
songs.path AS path
FROM songs
LEFT JOIN games
ON (songs.game = games.games_id)
LEFT JOIN albums
ON (songs.album = albums.albums_id)''')
songs = cur.fetchall()
for song in songs:
try:
album = Album.objects.get(title__exact=song[2])
except Album.DoesNotExist:
album = None
try:
game = Game.objects.get(title__exact=song[1])
except Game.DoesNotExist:
game = None
song_disabled = not bool(song[3])
new_song = Song.objects.create(album=album,
game=game,
disabled=song_disabled,
song_type=song[4],
title=song[5],
length=song[6],
path=song[7])
if song[4] == 'S':
total_songs += 1
else:
total_jingles += 1
cur.execute('''SELECT
ifnull(alias, "") AS alias,
ifnull(firstname, "") AS firstname,
ifnull(lastname, "") AS lastname
FROM artists
WHERE artists_id
IN (SELECT artists_artists_id
FROM songs_have_artists
WHERE songs_songs_id = ?)''', [song[0]])
old_artists = cur.fetchall()
for old_artist in old_artists:
new_artist = Artist.objects.get(alias__exact=old_artist[0],
first_name__exact=old_artist[1],
last_name__exact=old_artist[2])
new_song.artists.add(new_artist)
self.stdout.write(
'Imported {} songs ({} requestables, {} jingles)'.format(
str(total_songs + total_jingles),
str(total_songs),
str(total_jingles)
)
)
pub = input('Do you want to publish all imported objects as well? '
'[Y/N] ')
if pub == 'Y' or pub == 'y':
for al in Album.objects.all():
al.publish()
for ar in Artist.objects.all():
ar.publish()
for g in Game.objects.all():
g.publish()
for s in Song.objects.all():
s.publish()
self.stdout.write('Published imported objects successfully')
else:
self.stdout.write('Skipped publishing songs')