From b21ea5a8a4c532aa85de9454f31a203990cf75e8 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Fri, 20 Jul 2012 16:39:19 -0400 Subject: [PATCH] Added import/export scripts --- .../management/commands/6002exportusers.py | 61 +++++++++++++++++ .../management/commands/6002importusers.py | 66 +++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 common/djangoapps/student/management/commands/6002exportusers.py create mode 100644 common/djangoapps/student/management/commands/6002importusers.py diff --git a/common/djangoapps/student/management/commands/6002exportusers.py b/common/djangoapps/student/management/commands/6002exportusers.py new file mode 100644 index 0000000000..0ea458408c --- /dev/null +++ b/common/djangoapps/student/management/commands/6002exportusers.py @@ -0,0 +1,61 @@ +## +## One-off script to export 6.002x users into the edX framework +## +## Could be modified to be general by: +## * Changing user_keys and up_keys to handle dates more cleanly +## * Providing a generic set of tables, rather than just users and user profiles +## * Handling certificates and grades +## * Handling merge/forks of UserProfile.meta + + +import datetime +import json + +import os.path + +from lxml import etree + +from django.core.management.base import BaseCommand +from django.conf import settings +from django.contrib.auth.models import User + +from student.models import UserProfile + +import mitxmako.middleware as middleware + +middleware.MakoMiddleware() + +class Command(BaseCommand): + help = \ +'''Exports all users and user profiles. +Caveat: Should be looked over before any run +for schema changes. + +Current version grabs user_keys from +django.contrib.auth.models.User and up_keys +from student.userprofile. ''' + def handle(self, *args, **options): + users = list(User.objects.all()) + user_profiles = list(UserProfile.objects.all()) + user_profile_dict = dict([(up.user_id, up) for up in user_profiles]) + + user_tuples = [(user_profile_dict[u.id], u) for u in users if u.id in user_profile_dict] + + user_keys = ['id', 'username', 'email', 'password', 'is_staff', + 'is_active', 'is_superuser', 'last_login', 'date_joined', + 'password'] + up_keys = ['language', 'location','meta','name', 'id','user_id'] + + def extract_dict(keys, object): + d = {} + for key in keys: + item = object.__getattribute__(key) + if type(item) == datetime.datetime: + item = item.isoformat() + d[key] = item + return d + + extracted = [{'up':extract_dict(up_keys, t[0]), 'u':extract_dict(user_keys, t[1])} for t in user_tuples] + fp = open('transfer_users.txt', 'w') + json.dump(extracted, fp) + fp.close() diff --git a/common/djangoapps/student/management/commands/6002importusers.py b/common/djangoapps/student/management/commands/6002importusers.py new file mode 100644 index 0000000000..e6d801edb5 --- /dev/null +++ b/common/djangoapps/student/management/commands/6002importusers.py @@ -0,0 +1,66 @@ +## +## One-off script to import 6.002x users into the edX framework +## See export for more info + + +import datetime +import json + +import dateutil.parser + +import os.path + +from lxml import etree + +from django.core.management.base import BaseCommand +from django.conf import settings +from django.contrib.auth.models import User + +from student.models import UserProfile + +import mitxmako.middleware as middleware + +middleware.MakoMiddleware() + +def import_user(u): + user_info = u['u'] + up_info = u['up'] + + # HACK to handle dates + user_info['last_login'] = dateutil.parser.parse(user_info['last_login']) + user_info['date_joined'] = dateutil.parser.parse(user_info['date_joined']) + + user_keys = ['id', 'username', 'email', 'password', 'is_staff', + 'is_active', 'is_superuser', 'last_login', 'date_joined', + 'password'] + up_keys = ['language', 'location','meta','name', 'id','user_id'] + + + u = User() + for key in user_keys: + u.__setattr__(key, user_info[key]) + u.save() + + up = UserProfile() + up.user = u + for key in up_keys: + up.__setattr__(key, up_info[key]) + up.save() + +class Command(BaseCommand): + help = \ +'''Exports all users and user profiles. +Caveat: Should be looked over before any run +for schema changes. + +Current version grabs user_keys from +django.contrib.auth.models.User and up_keys +from student.userprofile. ''' + def handle(self, *args, **options): + extracted = json.load(open('transfer_users.txt')) + n=0 + for u in extracted: + import_user(u) + if n%100 == 0: + print n + n = n+1