From 5cdb9a3f3db2e7143afda714300acba16a3d631c Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 24 Feb 2021 15:45:18 +0100 Subject: [PATCH] csv_import: ignore deleted users for unicity checks (#49449) --- src/authentic2/csv_import.py | 4 ++-- tests/test_csv_import.py | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/authentic2/csv_import.py b/src/authentic2/csv_import.py index 5eae6970..879b3438 100644 --- a/src/authentic2/csv_import.py +++ b/src/authentic2/csv_import.py @@ -584,9 +584,9 @@ class UserCsvImporter(object): return ROLE_NAME in self.headers_by_name or ROLE_SLUG in self.headers_by_name def check_unique_constraints(self, row, unique_map, user=None): - ou_users = User.objects.filter(ou=self.ou) + ou_users = User.objects.filter(ou=self.ou, deleted__isnull=True) # ignore new users - users = User.objects.exclude(id__gt=self.max_user_id) + users = User.objects.filter(id__lte=self.max_user_id, deleted__isnull=True) if user: users = users.exclude(pk=user.pk) ou_users = ou_users.exclude(pk=user.pk) diff --git a/tests/test_csv_import.py b/tests/test_csv_import.py index fa1d9372..5a6afc03 100644 --- a/tests/test_csv_import.py +++ b/tests/test_csv_import.py @@ -24,6 +24,7 @@ import codecs from django.contrib.auth.hashers import make_password, check_password from django.core import mail +from django.utils import timezone from django_rbac.utils import get_role_model @@ -625,3 +626,23 @@ tnoel@entrouvert.com,Thomas,Noël,%s''' assert importer.run() assert importer.has_errors assert 'unknown hashing algorithm' in importer.rows[0].cells[-1].errors[0].description + + +def test_csv_import_deleted_user(profile, user_csv_importer_factory): + content = '''email key,first_name,last_name,phone unique +tnoel@entrouvert.com,Thomas,Noël,1234''' + importer = user_csv_importer_factory(content) + + user = User.objects.create(ou=get_default_ou()) + user.attributes.phone = '1234' + + assert importer.run() + assert importer.has_errors + assert importer.rows[0].errors == [Error('unique-constraint-failed')] + + user.deleted = timezone.now() + user.save() + importer = user_csv_importer_factory(content) + assert importer.run() + assert not importer.has_errors + assert User.objects.filter(email='tnoel@entrouvert.com').exists() -- 2.20.1