diff --git a/src/authentic2_gnm/management/commands/sync-cut.py b/src/authentic2_gnm/management/commands/sync-cut.py index d1095ff..247f308 100644 --- a/src/authentic2_gnm/management/commands/sync-cut.py +++ b/src/authentic2_gnm/management/commands/sync-cut.py @@ -17,6 +17,7 @@ import requests import sys +import django.db from django.conf import settings from django.contrib.auth import get_user_model from django.core.management.base import BaseCommand @@ -31,6 +32,8 @@ class Command(BaseCommand): User = get_user_model() OU = get_ou_model() + verbose = int(options['verbosity']) > 0 + cut_agents = OIDCProvider.objects.get(name='cut-agents') ou_mapping = settings.CUT_GNM_OU_MAPPING @@ -47,13 +50,18 @@ class Command(BaseCommand): # fallback to getting the user from its (email, ou) try: user = User.objects.get(email=cut_user_data['email'], ou=ou_gnm) + except User.MultipleObjectsReturned: + if verbose: + print 'bad duplicated email', cut_user_data['email'] + continue except User.DoesNotExist: # uuid? try: user = User.objects.get(uuid=cut_user_data['sub']) except User.DoesNotExist: # at last, create new user - print 'creating', cut_user_data['email'] + if verbose: + print 'creating', cut_user_data['email'] user = User() if (user.uuid != cut_user_data['sub'] or @@ -61,6 +69,8 @@ class Command(BaseCommand): user.email != cut_user_data['email'] or user.first_name != cut_user_data['first_name'] or user.last_name != cut_user_data['last_name']): + if verbose: + print 'updating', user.email, '->', ou_gnm # only touch user if there are changes user.uuid = cut_user_data['sub'] user.ou = ou_gnm @@ -69,4 +79,8 @@ class Command(BaseCommand): user.last_name = cut_user_data['last_name'] user.save() - OIDCAccount.objects.get_or_create(provider=cut_agents, user=user, sub=cut_user_data['sub']) + try: + OIDCAccount.objects.get_or_create(provider=cut_agents, user=user, sub=cut_user_data['sub']) + except django.db.utils.IntegrityError: + if verbose: + print 'oops duplicated email?', cut_user_data['email']