2017-08-15 11:58:05 +02:00
|
|
|
import json
|
|
|
|
import sys
|
|
|
|
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
|
|
|
|
from django_rbac.utils import get_role_model, get_ou_model
|
|
|
|
from authentic2.models import Attribute, AttributeValue
|
|
|
|
|
|
|
|
|
|
|
|
User = get_user_model()
|
|
|
|
Role = get_role_model()
|
|
|
|
Ou = get_ou_model()
|
|
|
|
|
|
|
|
export = json.load(open(sys.argv[1]))
|
|
|
|
|
|
|
|
def get_role(role_dict):
|
|
|
|
kwargs = {'slug': role_dict['slug']}
|
|
|
|
if role_dict['is_service']:
|
|
|
|
kwargs['service__slug'] = role_dict['service_slug']
|
|
|
|
else:
|
|
|
|
kwargs['service__isnull'] = True
|
|
|
|
if role_dict['ou__slug']:
|
|
|
|
kwargs['ou__slug'] = role_dict['ou__slug']
|
|
|
|
else:
|
|
|
|
kwargs['ou__isnull'] = True
|
|
|
|
return Role.objects.get(**kwargs)
|
|
|
|
|
|
|
|
for user_dict in export['users']:
|
2017-11-24 10:34:14 +01:00
|
|
|
if user_dict.get('external_id'):
|
|
|
|
# don't create external users, hopefully they've already been
|
|
|
|
# synchronized.
|
|
|
|
try:
|
|
|
|
user = User.objects.get(
|
|
|
|
userexternalid__external_id=user_dict['external_id']['id'],
|
|
|
|
userexternalid__source=user_dict['external_id']['source']
|
|
|
|
)
|
|
|
|
except User.DoesNotExist:
|
|
|
|
print 'missing external:', user_dict['external_id']
|
|
|
|
continue
|
|
|
|
else:
|
|
|
|
user, created = User.objects.get_or_create(
|
2017-08-15 11:58:05 +02:00
|
|
|
uuid=user_dict['uuid'],
|
|
|
|
username=user_dict['username'],
|
|
|
|
ou=Ou.objects.get(slug=user_dict['ou__slug']) if user_dict['ou__slug'] else None)
|
2017-11-24 10:34:14 +01:00
|
|
|
if created:
|
|
|
|
user.password = user_dict['password']
|
|
|
|
for attribute in ('email', 'first_name', 'last_name', 'is_superuser', 'email_verified'):
|
|
|
|
setattr(user, attribute, user_dict.get(attribute))
|
2017-08-15 11:58:05 +02:00
|
|
|
|
2017-11-24 10:34:14 +01:00
|
|
|
user.save()
|
2017-08-15 11:58:05 +02:00
|
|
|
|
|
|
|
content_type = ContentType.objects.get_for_model(User)
|
|
|
|
for attribute_name, attribute_value in user_dict['attributes'].items():
|
|
|
|
Attribute.objects.get(name=attribute_name).set_value(user, attribute_value)
|
|
|
|
|
|
|
|
for role_dict in user_dict['roles']:
|
|
|
|
try:
|
|
|
|
user.roles.add(get_role(role_dict))
|
|
|
|
except Role.DoesNotExist:
|
|
|
|
print 'failed to add role "%s" to user "%s"' % (role_dict['name'], user)
|