Improve User merge handling in merge_persons(). Fix minor bug in submit.checkers.py. Fixes #1900. Commit ready for merge.

- Legacy-Id: 13718
This commit is contained in:
Ryan Cross 2017-06-26 23:13:58 +00:00
parent 4d562e9bac
commit 7768e7c6b3
3 changed files with 41 additions and 14 deletions

View file

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

View file

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

View file

@ -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):