## ## 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()