From 7768e7c6b3db8af04ced40a50bf7c3385261758c Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Mon, 26 Jun 2017 23:13:58 +0000 Subject: [PATCH] Improve User merge handling in merge_persons(). Fix minor bug in submit.checkers.py. Fixes #1900. Commit ready for merge. - Legacy-Id: 13718 --- ietf/person/tests.py | 25 ++++++++++++++++--------- ietf/person/utils.py | 29 ++++++++++++++++++++++++----- ietf/submit/checkers.py | 1 + 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/ietf/person/tests.py b/ietf/person/tests.py index 884c0e611..ff32747fa 100644 --- a/ietf/person/tests.py +++ b/ietf/person/tests.py @@ -9,12 +9,14 @@ from django.urls import reverse as urlreverse import debug # pyflakes:ignore -#from ietf.nomcom.models import Nominee, NomCom -#from ietf.nomcom.test_data import nomcom_test_data -from ietf.person.factories import EmailFactory, PersonFactory +from ietf.community.models import CommunityList +from ietf.group.models import Group +from ietf.nomcom.models import NomCom +from ietf.nomcom.test_data import nomcom_test_data +from ietf.person.factories import EmailFactory, PersonFactory, UserFactory from ietf.person.models import Person, Alias from ietf.person.utils import (merge_persons, determine_merge_order, send_merge_notification, - handle_users, get_extra_primary, dedupe_aliases, move_related_objects) + handle_users, get_extra_primary, dedupe_aliases, move_related_objects, merge_nominees, merge_users) from ietf.utils.test_data import make_test_data from ietf.utils.test_utils import TestCase from ietf.utils.mail import outbox, empty_outbox @@ -171,19 +173,14 @@ class PersonUtilsTests(TestCase): dedupe_aliases(person) self.assertEqual(person.alias_set.filter(name='Joe').count(),1) - """ def test_merge_nominees(self): nomcom_test_data() nomcom = NomCom.objects.first() source = PersonFactory() source.nominee_set.create(nomcom=nomcom,email=source.email()) - #source = Nominee.objects.first().email.person target = PersonFactory() - print source - print source.nominee_set.all() merge_nominees(source, target) self.assertTrue(target.nominee_set.all()) - """ def test_move_related_objects(self): source = PersonFactory() @@ -200,8 +197,18 @@ class PersonUtilsTests(TestCase): source_id = source.pk source_email = source.email_set.first() source_alias = source.alias_set.first() + source_user = source.user merge_persons(source, target, file=StringIO()) self.assertTrue(source_email in target.email_set.all()) self.assertTrue(source_alias in target.alias_set.all()) self.assertFalse(Person.objects.filter(id=source_id)) + self.assertFalse(source_user.is_active) + def test_merge_users(self): + make_test_data() + source = UserFactory() + target = UserFactory() + mars = Group.objects.get(acronym='mars') + communitylist = CommunityList.objects.create(user=source, group=mars) + merge_users(source, target) + self.assertTrue(communitylist in target.communitylist_set.all()) diff --git a/ietf/person/utils.py b/ietf/person/utils.py index d395dd120..a476ce06b 100755 --- a/ietf/person/utils.py +++ b/ietf/person/utils.py @@ -7,6 +7,7 @@ import syslog from django.contrib import admin from django.contrib.auth.models import User +from ietf.nomcom.models import Nominee from ietf.person.models import Person from ietf.utils.mail import send_mail @@ -24,7 +25,7 @@ def merge_persons(source, target, file=sys.stdout, verbose=False): changes.append('EMAIL ACTION: {} no longer marked as primary'.format(email.address)) changes.append(handle_users(source,target)) - #merge_nominees(source, target) + merge_nominees(source, target) move_related_objects(source, target, file=file, verbose=verbose) dedupe_aliases(target) @@ -84,11 +85,13 @@ def handle_users(source,target,check_only=False): if source.user and target.user: message = "DATATRACKER LOGIN ACTION: retaining login: {}, removing login: {}".format(target.user,source.user) if not check_only: + merge_users(source.user, target.user) syslog.syslog('merge-person-records: deleting user {}'.format(source.user.username)) - # user = source.user + user = source.user source.user = None source.save() - #user.delete() + user.is_active = False + user.save() return message def move_related_objects(source, target, file, verbose=False): @@ -105,6 +108,21 @@ def move_related_objects(source, target, file, verbose=False): kwargs = { field_name:target } queryset.update(**kwargs) +def merge_users(source, target): + '''Move related objects from source user to target user''' + # handle community list + for communitylist in source.communitylist_set.all(): + source.communitylist_set.remove(communitylist) + target.communitylist_set.add(communitylist) + # handle feedback + for feedback in source.feedback_set.all(): + source.feedback_set.remove(feedback) + target.feedback_set.add(feedback) + # handle nominations + for nomination in source.nomination_set.all(): + source.nomination_set.remove(nomination) + target.nomination_set.add(nomination) + def dedupe_aliases(person): '''Check person for duplicate aliases and purge''' seen = [] @@ -117,8 +135,9 @@ def dedupe_aliases(person): def merge_nominees(source, target): '''Move nominees and feedback to target''' for nominee in source.nominee_set.all(): - target_nominee = target.nominee_set.get(nomcom=nominee.nomcom) - if not target_nominee: + try: + target_nominee = target.nominee_set.get(nomcom=nominee.nomcom) + except Nominee.DoesNotExist: target_nominee = target.nominee_set.create(nomcom=nominee.nomcom, email=target.email()) nominee.nomination_set.all().update(nominee=target_nominee) for fb in nominee.feedback_set.all(): diff --git a/ietf/submit/checkers.py b/ietf/submit/checkers.py index ba4fa6784..d47b053e9 100644 --- a/ietf/submit/checkers.py +++ b/ietf/submit/checkers.py @@ -134,6 +134,7 @@ class DraftYangChecker(object): message = "" results = [] passed = True # Used by the submission tool. Yang checks always pass. + model_list = [] extractor = xym.YangModuleExtractor(path, workdir, strict=True, strict_examples=False, debug_level=0) if not os.path.exists(path):