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

from django.core.management.base import BaseCommand
from django.contrib.auth.models import User

from student.models import UserProfile


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