Implement importing old SQLite3 DB via command line.
This commit is contained in:
parent
a5a275ef5a
commit
e0465acb67
3 changed files with 163 additions and 0 deletions
0
savepointradio/radio/management/__init__.py
Normal file
0
savepointradio/radio/management/__init__.py
Normal file
0
savepointradio/radio/management/commands/__init__.py
Normal file
0
savepointradio/radio/management/commands/__init__.py
Normal file
163
savepointradio/radio/management/commands/importradio.py
Normal file
163
savepointradio/radio/management/commands/importradio.py
Normal 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')
|
Loading…
Reference in a new issue