From a251076903f544cfc342e822e789421a6b705f8b Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Wed, 28 Jun 2017 20:43:28 +0000 Subject: [PATCH] Update secr.rolodex app to deactivate old Users when replaced on edit. Fixes #2001. Commit ready for merge. - Legacy-Id: 13726 --- ietf/person/utils.py | 4 ++-- ietf/secr/rolodex/tests.py | 38 ++++++++++++++++++++++++++++++++++++-- ietf/secr/rolodex/views.py | 12 ++++++++++-- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/ietf/person/utils.py b/ietf/person/utils.py index a476ce06b..7043c2f84 100755 --- a/ietf/person/utils.py +++ b/ietf/person/utils.py @@ -67,7 +67,7 @@ def get_extra_primary(source,target): def handle_users(source,target,check_only=False): ''' - Deletes extra Users. Retains target user. If check_only == True, just return a string + Deactivates extra Users. Retains target user. If check_only == True, just return a string describing action, otherwise perform user changes and return string. ''' if not (source.user or target.user): @@ -86,7 +86,7 @@ def handle_users(source,target,check_only=False): 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)) + syslog.syslog('merge-person-records: deactivating user {}'.format(source.user.username)) user = source.user source.user = None source.save() diff --git a/ietf/secr/rolodex/tests.py b/ietf/secr/rolodex/tests.py index fbcb3a3f9..0f8bede3e 100644 --- a/ietf/secr/rolodex/tests.py +++ b/ietf/secr/rolodex/tests.py @@ -1,7 +1,8 @@ from django.urls import reverse from ietf.utils.test_utils import TestCase -from ietf.person.models import Person +from ietf.person.factories import PersonFactory, UserFactory +from ietf.person.models import Person, User from ietf.utils.test_data import make_test_data @@ -24,4 +25,37 @@ class RolodexTestCase(TestCase): response = self.client.get(url) self.assertEqual(response.status_code, 200) - + def test_edit_replace_user(self): + person = PersonFactory() + user = UserFactory() + url = reverse('ietf.secr.rolodex.views.edit', kwargs={'id':person.id}) + redirect_url = reverse('ietf.secr.rolodex.views.view', kwargs={'id':person.id}) + self.client.login(username="secretary", password="secretary+password") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + post_data = { + 'name': person.name, + 'ascii': person.ascii, + 'ascii_short': person.ascii_short, + 'affiliation': person.affiliation, + 'address': person.address, + 'user': user.username, + 'email-0-person':person.pk, + 'email-0-address': person.email_address, + 'email-TOTAL_FORMS':1, + 'email-INITIAL_FORMS':1, + 'email-MIN_NUM_FORMS':0, + 'email-MAX_NUM_FORMS':1000, + 'submit': 'Submit', + } + #print person.user + #self.assertTrue(False) + original_user = person.user + person_id = person.pk + response = self.client.post(url, post_data, follow=True) + print response.content + person = Person.objects.get(id=person_id) + original_user = User.objects.get(id=original_user.id) + self.assertRedirects(response, redirect_url) + self.assertEqual(person.user, user) + self.assertTrue(not original_user.is_active) diff --git a/ietf/secr/rolodex/views.py b/ietf/secr/rolodex/views.py index aa291a4a9..b4ecb0948 100644 --- a/ietf/secr/rolodex/views.py +++ b/ietf/secr/rolodex/views.py @@ -7,6 +7,7 @@ from django.shortcuts import render, get_object_or_404, redirect from ietf.ietfauth.utils import role_required from ietf.person.models import Person, Email, Alias +from ietf.person.utils import merge_users from ietf.secr.rolodex.forms import EditPersonForm, EmailForm, NameForm, NewPersonForm, SearchForm @@ -174,8 +175,15 @@ def edit(request, id): person_form.save() email_formset.save() - # add new names to alias - + if 'user' in person_form.changed_data and person_form.initial['user']: + try: + source = User.objects.get(username=person_form.initial['user']) + merge_users(source, person_form.cleaned_data['user']) + source.is_active = False + source.save() + except User.DoesNotExist: + pass + messages.success(request, 'The Rolodex entry was changed successfully') return redirect('ietf.secr.rolodex.views.view', id=id)