From 0eb7acf9a5915e38e1c8c414467eb1ede72da4a8 Mon Sep 17 00:00:00 2001 From: Emmanuel Cazenave Date: Wed, 29 Sep 2021 13:03:14 +0200 Subject: [PATCH] sync-tabellio: do not crash if a user to desactivate has multiple accounts (#57393) --- .../pfwb/management/commands/sync-tabellio.py | 32 +++++++++---------- tests/pfwb/test_sync_tabellio.py | 25 +++++++++++++++ 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/docbow_project/pfwb/management/commands/sync-tabellio.py b/docbow_project/pfwb/management/commands/sync-tabellio.py index 79234b1..7571519 100644 --- a/docbow_project/pfwb/management/commands/sync-tabellio.py +++ b/docbow_project/pfwb/management/commands/sync-tabellio.py @@ -110,26 +110,24 @@ class Command(BaseCommand): username = get_username(last_name, first_name) - try: - user = User.objects.get(first_name=first_name, last_name=last_name, is_active=True) - except User.DoesNotExist: + to_disable_users = User.objects.filter(first_name=first_name, last_name=last_name, is_active=True) + if not to_disable_users.count(): # a user didn't exist for that person, fine. continue + for user in to_disable_users: + if verbose: + print('disabling', username) + # disable the user + user.is_active = False + user.save() - if verbose: - print('disabling', username) - - # disable the user - user.is_active = False - user.save() - - # remove the user from lists - if user in parl_list.members.all(): - parl_list.members.remove(user) - parl_list.save() - if user in ministres_list.members.all(): - ministres_list.members.remove(user) - ministres_list.save() + # remove the user from lists + if user in parl_list.members.all(): + parl_list.members.remove(user) + parl_list.save() + if user in ministres_list.members.all(): + ministres_list.members.remove(user) + ministres_list.save() # get current deputies deputies = {} diff --git a/tests/pfwb/test_sync_tabellio.py b/tests/pfwb/test_sync_tabellio.py index 540a694..7afbdb4 100644 --- a/tests/pfwb/test_sync_tabellio.py +++ b/tests/pfwb/test_sync_tabellio.py @@ -188,6 +188,31 @@ def test_remove_deputy_because_no_fonction(session, db, ministres_list, parl_lis session.bind.engine.dispose() +def test_remove_user_does_not_crash_if_multiple_active_user_found(session, db, ministres_list, parl_list): + user = User.objects.create(first_name='John', last_name='Doe', email='john@doe.be') + assert user.is_active + parl_list.members.add(user) + assert parl_list.members.count() == 1 + user_bis = User.objects.create( + first_name='John', last_name='Doe', email='john+bis@doe.be', username='johndoebis' + ) + assert user_bis.is_active + + deputy = create_deputy(session, 'John', 'Doe', 'john@doe.be', compol_name='foo') + # make him not deputy anymore + histo = deputy.tperhistolines[0] + histo.fin = datetime.now() + session.add(histo) + session.commit() + management.call_command('sync-tabellio', '--verbosity', '2') + + user = User.objects.get(first_name='John', last_name='Doe', email='john@doe.be') + assert not user.is_active + user_bis = User.objects.get(first_name='John', last_name='Doe', email='john+bis@doe.be') + assert not user_bis.is_active + assert parl_list.members.count() == 0 + + def test_remove_deputy_because_become_ministre(session, db, ministres_list, parl_list): user = User.objects.create(first_name='John', last_name='Doe', email='john@doe.be') assert user.is_active