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 import debug # pyflakes:ignore
#from ietf.nomcom.models import Nominee, NomCom from ietf.community.models import CommunityList
#from ietf.nomcom.test_data import nomcom_test_data from ietf.group.models import Group
from ietf.person.factories import EmailFactory, PersonFactory 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.models import Person, Alias
from ietf.person.utils import (merge_persons, determine_merge_order, send_merge_notification, 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_data import make_test_data
from ietf.utils.test_utils import TestCase from ietf.utils.test_utils import TestCase
from ietf.utils.mail import outbox, empty_outbox from ietf.utils.mail import outbox, empty_outbox
@ -171,19 +173,14 @@ class PersonUtilsTests(TestCase):
dedupe_aliases(person) dedupe_aliases(person)
self.assertEqual(person.alias_set.filter(name='Joe').count(),1) self.assertEqual(person.alias_set.filter(name='Joe').count(),1)
"""
def test_merge_nominees(self): def test_merge_nominees(self):
nomcom_test_data() nomcom_test_data()
nomcom = NomCom.objects.first() nomcom = NomCom.objects.first()
source = PersonFactory() source = PersonFactory()
source.nominee_set.create(nomcom=nomcom,email=source.email()) source.nominee_set.create(nomcom=nomcom,email=source.email())
#source = Nominee.objects.first().email.person
target = PersonFactory() target = PersonFactory()
print source
print source.nominee_set.all()
merge_nominees(source, target) merge_nominees(source, target)
self.assertTrue(target.nominee_set.all()) self.assertTrue(target.nominee_set.all())
"""
def test_move_related_objects(self): def test_move_related_objects(self):
source = PersonFactory() source = PersonFactory()
@ -200,8 +197,18 @@ class PersonUtilsTests(TestCase):
source_id = source.pk source_id = source.pk
source_email = source.email_set.first() source_email = source.email_set.first()
source_alias = source.alias_set.first() source_alias = source.alias_set.first()
source_user = source.user
merge_persons(source, target, file=StringIO()) merge_persons(source, target, file=StringIO())
self.assertTrue(source_email in target.email_set.all()) self.assertTrue(source_email in target.email_set.all())
self.assertTrue(source_alias in target.alias_set.all()) self.assertTrue(source_alias in target.alias_set.all())
self.assertFalse(Person.objects.filter(id=source_id)) 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 import admin
from django.contrib.auth.models import User from django.contrib.auth.models import User
from ietf.nomcom.models import Nominee
from ietf.person.models import Person from ietf.person.models import Person
from ietf.utils.mail import send_mail 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('EMAIL ACTION: {} no longer marked as primary'.format(email.address))
changes.append(handle_users(source,target)) changes.append(handle_users(source,target))
#merge_nominees(source, target) merge_nominees(source, target)
move_related_objects(source, target, file=file, verbose=verbose) move_related_objects(source, target, file=file, verbose=verbose)
dedupe_aliases(target) dedupe_aliases(target)
@ -84,11 +85,13 @@ def handle_users(source,target,check_only=False):
if source.user and target.user: if source.user and target.user:
message = "DATATRACKER LOGIN ACTION: retaining login: {}, removing login: {}".format(target.user,source.user) message = "DATATRACKER LOGIN ACTION: retaining login: {}, removing login: {}".format(target.user,source.user)
if not check_only: if not check_only:
merge_users(source.user, target.user)
syslog.syslog('merge-person-records: deleting user {}'.format(source.user.username)) syslog.syslog('merge-person-records: deleting user {}'.format(source.user.username))
# user = source.user user = source.user
source.user = None source.user = None
source.save() source.save()
#user.delete() user.is_active = False
user.save()
return message return message
def move_related_objects(source, target, file, verbose=False): 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 } kwargs = { field_name:target }
queryset.update(**kwargs) 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): def dedupe_aliases(person):
'''Check person for duplicate aliases and purge''' '''Check person for duplicate aliases and purge'''
seen = [] seen = []
@ -117,8 +135,9 @@ def dedupe_aliases(person):
def merge_nominees(source, target): def merge_nominees(source, target):
'''Move nominees and feedback to target''' '''Move nominees and feedback to target'''
for nominee in source.nominee_set.all(): for nominee in source.nominee_set.all():
target_nominee = target.nominee_set.get(nomcom=nominee.nomcom) try:
if not target_nominee: target_nominee = target.nominee_set.get(nomcom=nominee.nomcom)
except Nominee.DoesNotExist:
target_nominee = target.nominee_set.create(nomcom=nominee.nomcom, email=target.email()) target_nominee = target.nominee_set.create(nomcom=nominee.nomcom, email=target.email())
nominee.nomination_set.all().update(nominee=target_nominee) nominee.nomination_set.all().update(nominee=target_nominee)
for fb in nominee.feedback_set.all(): for fb in nominee.feedback_set.all():

View file

@ -134,6 +134,7 @@ class DraftYangChecker(object):
message = "" message = ""
results = [] results = []
passed = True # Used by the submission tool. Yang checks always pass. 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) extractor = xym.YangModuleExtractor(path, workdir, strict=True, strict_examples=False, debug_level=0)
if not os.path.exists(path): if not os.path.exists(path):