from dateutil import parser as date_parser
from django.core.management.base import BaseCommand
from django.utils import timezone
import ujson
from nkdsu.apps.vote.models import Block, Play, Request, Show, Track, TwitterUser, Vote
[docs]
class Command(BaseCommand):
args = 'filename'
help = 'import data from a dumpdata from the old site'
[docs]
def handle(self, filename, *args, **options):
with open(filename) as the_file:
data = ujson.load(the_file)
for model in [Show, Track, Play, Block, Vote, TwitterUser]:
for instance in model.objects.all():
instance.delete()
self.create_old_shows()
def data_for_model(model_name):
return filter(lambda m: m['model'] == model_name, data)
for model, func in [
('vote.request', self.import_request),
('vote.scheduleoverride', self.import_scheduleoverride),
('vote.track', self.import_track),
('vote.play', self.import_play),
('vote.manualvote', self.import_manual_vote),
('vote.vote', self.import_vote),
('vote.block', self.import_block),
]:
for instance in data_for_model(model):
func(instance)
[docs]
def create_old_shows(self):
"""
Create the weeks between the first show on record and today.
"""
point = timezone.datetime(2012, 8, 23, tzinfo=timezone.get_current_timezone())
last = timezone.now()
while point <= last:
Show.at(point)
point += timezone.timedelta(days=1)
[docs]
def import_request(self, instance):
fields = instance['fields']
Request(**fields).save()
[docs]
def import_scheduleoverride(self, instance):
fields = instance['fields']
overridden = timezone.make_aware(
date_parser.parse(fields['overridden_showdate']), timezone.utc
)
relevant_show = Show.at(overridden)
relevant_show.showtime = date_parser.parse(fields['start'])
relevant_show.end = date_parser.parse(fields['finish'])
relevant_show.save()
[docs]
def import_track(self, instance):
fields = instance['fields']
track = Track(
pk=instance['pk'],
id3_artist=fields['id3_artist'],
id3_title=fields['id3_title'],
id3_album=fields['id3_album'],
msec=fields['msec'],
added=date_parser.parse(fields['added']),
hidden=fields['hidden'],
inudesu=fields['inudesu'],
)
if not fields['hidden']:
track.revealed = date_parser.parse(fields['added'])
track.save()
[docs]
def import_play(self, instance):
fields = instance['fields']
play = Play(
pk=instance['pk'],
track=Track.objects.get(pk=fields['track']),
tweet_id=fields['tweet_id'],
date=fields['datetime'],
)
play.save()
[docs]
def import_vote(self, instance):
fields = instance['fields']
this_vote_date = date_parser.parse(fields['date'])
user_qs = TwitterUser.objects.filter(user_id=fields['user_id'])
user_meta = {k: fields[k] for k in ['screen_name', 'user_image', 'name']}
if user_qs.exists():
user = user_qs.get()
if user.updated < this_vote_date:
for attr, value in user_meta.iteritems():
setattr(user, attr, value)
user.updated = this_vote_date
user.save()
else:
user = TwitterUser(
user_id=fields['user_id'], updated=this_vote_date, **user_meta
)
user.save()
track_pks = fields['tracks']
if fields['track'] is not None:
track_pks.append(fields['track'])
tracks = []
for track_pk in track_pks:
tracks.append(Track.objects.get(pk=track_pk))
if tracks:
vote = Vote(
date=this_vote_date,
text=fields['text'],
twitter_user=user,
tweet_id=instance['pk'],
)
vote.save()
for track in tracks:
vote.tracks.add(track)
vote.save()
[docs]
def import_manual_vote(self, instance):
fields = instance['fields']
vote = Vote(
date=date_parser.parse(fields['date']),
kind=fields['kind'],
name=fields['name'],
text=fields['message'],
)
vote.save()
vote.tracks.add(Track.objects.get(pk=fields['track']))
vote.save()
[docs]
def import_block(self, instance):
fields = instance['fields']
block = Block(
track=Track.objects.get(pk=fields['track']),
show=Show.at(date_parser.parse(fields['date'])),
reason=fields['reason'],
)
block.save()