From 404f1c169e2d70b466924d66d4d82ee5d0912139 Mon Sep 17 00:00:00 2001 From: Jim Driessen Date: Sat, 21 Jan 2017 00:11:54 +0100 Subject: [PATCH] Import users and songs from old Marietje. --- .../management/commands/importsongs.py | 28 ++++ .../management/commands/importusers.py | 126 ++++-------------- 2 files changed, 54 insertions(+), 100 deletions(-) create mode 100644 marietje/marietje/management/commands/importsongs.py diff --git a/marietje/marietje/management/commands/importsongs.py b/marietje/marietje/management/commands/importsongs.py new file mode 100644 index 0000000..3854e76 --- /dev/null +++ b/marietje/marietje/management/commands/importsongs.py @@ -0,0 +1,28 @@ +import json +from django.core.management.base import BaseCommand +from django.contrib.auth import get_user_model +from queues.models import Queue, Playlist +from songs.models import Song + + +class Command(BaseCommand): + help = 'Import songs from a JSON file exported from a previous version of Marietje.' + + def add_arguments(self, parser): + parser.add_argument('json_file') + + def handle(self, *args, **options): + filename = options['json_file'] + User = get_user_model() + + with open(filename) as fp: + for line in fp: + import_song = json.loads(line) + if 'd' in import_song and import_song['d']: + # Skip deleted songs. + continue + user = User.objects.filter(username=import_song['ub']).first() + song = Song(user=user, artist=import_song['a'], title=import_song['t'], duration=import_song['l'], + hash=import_song['k'], old_id=import_song['_id']['$oid']) + song.save() + print('Done importing songs.') diff --git a/marietje/marietje/management/commands/importusers.py b/marietje/marietje/management/commands/importusers.py index 4413885..dbdaa41 100644 --- a/marietje/marietje/management/commands/importusers.py +++ b/marietje/marietje/management/commands/importusers.py @@ -1,109 +1,35 @@ import json -from datetime import datetime - -from django.conf import settings -from django.contrib.auth.models import User -from django.core.exceptions import ImproperlyConfigured from django.core.management.base import BaseCommand -from django.utils import timezone -from django.utils import translation - - -def naive_to_aware(date_string): - """Convert string of form '%Y-%m-%d %H:%M:%S' - to timezone aware datetime object""" - - naive_datetime = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S') - return timezone.get_current_timezone().localize(naive_datetime) +from django.contrib.auth import get_user_model +from queues.models import Queue, Playlist class Command(BaseCommand): help = 'Import users from a JSON file exported from a previous version of Marietje.' + def add_arguments(self, parser): + parser.add_argument('json_file') + def handle(self, *args, **options): - translation.activate('nl') + filename = options['json_file'] + User = get_user_model() - if not settings.MIGRATION_KEY: - raise ImproperlyConfigured('MIGRATION_KEY not specified') - - events_api_url = 'https://thalia.nu/pizzas/api/?apikey={}'.format( - settings.MIGRATION_KEY) - - print('[*]Getting events json data') - try: - response = requests.get(events_api_url, - headers={'User-Agent': 'Trumpery'}) - - except requests.RequestException: - print('[!]Could not get {}'.format(events_api_url)) - return - - try: - data = response.json() - except json.decoder.JSONDecodeError: - print('[!]No json data found') - return - - activity_map = {} - product_map = {} - - print('[*]Parsing pizza events.') - for event_data in data['events']: - event_date = naive_to_aware(event_data['order_to']) - events = events_models.Event.objects.filter( - start__year=event_date.year, - start__month=event_date.month, - start__day=event_date.day - ) - - if len(events) == 1: - event = events.first() - else: - for e in events: - if 'borrel' in e.title_nl or 'Programmeerwedstrijd'\ - in e.title_nl: - event = e - - new_event = pizzas_models.PizzaEvent( - event=event, - start=naive_to_aware(event_data['order_from']), - end=naive_to_aware(event_data['order_to']), - ) - new_event.save() - activity_map[event_data['id']] = new_event.pk - - print('[*]Parsing pizza products.') - for pizza_data in data['products']: - new_pizza = pizzas_models.Product( - name=pizza_data['name'], - description_nl=pizza_data['description'], - description_en=pizza_data['description'], - price=pizza_data['price'], - available=pizza_data['available'] - ) - new_pizza.save() - product_map[pizza_data['id']] = new_pizza.pk - - print('[*]Parsing pizza orders.') - for order_data in data['orders']: - if order_data['username'] is None: - member = None - else: - registration_user = User.objects.get( - username=order_data['username'] - ) - member = members_models.Member.objects.get( - user=registration_user - ) - new_order = pizzas_models.Order( - member=member, - paid=order_data['paid'], - name=order_data['name'], - product=pizzas_models.Product.objects.get( - pk=product_map[order_data['product_id']] - ), - pizza_event=pizzas_models.PizzaEvent.objects.get( - pk=activity_map[order_data['activity_id']] - ) - ) - new_order.save() + with open(filename) as fp: + for line in fp: + import_user = json.loads(line) + user = User() + user.username = import_user['_id'].lower() + user.name = import_user['n'] + user.email = user.username + '@science.ru.nl' + user.password = 'md5$$' + import_user['p'] + queue = Queue.objects.first() + if queue is None: + playlist = Playlist() + playlist.save() + random_playlist = Playlist() + random_playlist.save() + queue = Queue(name='Queue', playlist=playlist, random_playlist=random_playlist) + queue.save() + user.queue = queue + user.save() + print('Done importing users.')