Skip to content
Snippets Groups Projects
Unverified Commit ec641cce authored by Dan Braghis's avatar Dan Braghis Committed by GitHub
Browse files

Merge pull request #127 from OpenTechFund/191-user-migration

User migration management command
parents 2efdbf3c 30d80f52
No related branches found
No related tags found
No related merge requests found
import argparse
import json
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.core.management.base import BaseCommand
from django.db import transaction
from opentech.apply.users.groups import STAFF_GROUP_NAME
class Command(BaseCommand):
help = "User migration script. Requires a source JSON file."
groups = Group.objects.all()
def add_arguments(self, parser):
parser.add_argument('source', type=argparse.FileType('r'), help='Migration source JSON file')
@transaction.atomic
def handle(self, *args, **options):
with options['source'] as json_data:
User = get_user_model()
users = json.load(json_data)
for uid in users:
user = users[uid]
full_name = self.get_full_name(user)
user_object, created = User.objects.get_or_create(
email=user['mail'],
defaults={
'full_name': full_name,
'drupal_id': uid,
}
)
operation = "Imported" if created else "Processed"
groups = self.get_user_groups(user)
user_object.groups.set(groups)
# Ensure uid is set
user_object.drupal_id = uid
user_object.save()
self.stdout.write(f"{operation} user {uid} ({full_name})")
def get_full_name(self, user):
full_name = user.get('field_otf_real_name', None)
try:
# The Drupal data structure includes a language reference.
# The default is 'und' (undefined).
full_name = full_name['und'][0]['safe_value']
except (KeyError, TypeError):
full_name = user['name']
return full_name
def get_user_groups(self, user):
groups = []
role_map = {
'proposer': 'Applicant',
'council': 'Advisor',
'administrator': 'Administrator',
'dev': 'Administrator',
}
_, email_domain = user.get('mail').split('@')
if email_domain in settings.STAFF_EMAIL_DOMAINS:
groups.append(self.groups.filter(name=STAFF_GROUP_NAME).first())
roles = [role for role in user.get('roles').values() if role != "authenticated user"]
for role in roles:
group_name = role_map.get(role)
if group_name:
groups.append(self.groups.filter(name=group_name).first())
return groups
# -*- coding: utf-8 -*-
# Generated by Django 1.11.8 on 2018-02-28 15:21
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0004_drop_first_last_names'),
]
operations = [
migrations.AddField(
model_name='user',
name='drupal_id',
field=models.IntegerField(blank=True, editable=False, null=True),
),
]
...@@ -48,6 +48,9 @@ class User(AbstractUser): ...@@ -48,6 +48,9 @@ class User(AbstractUser):
email = models.EmailField(_('email address'), unique=True) email = models.EmailField(_('email address'), unique=True)
full_name = models.CharField(verbose_name='Full name', max_length=255, blank=True) full_name = models.CharField(verbose_name='Full name', max_length=255, blank=True)
# Meta: used for migration purposes only
drupal_id = models.IntegerField(null=True, blank=True, editable=False)
USERNAME_FIELD = 'email' USERNAME_FIELD = 'email'
REQUIRED_FIELDS = [] REQUIRED_FIELDS = []
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment