Projet

Général

Profil

0005-check-self-referene-in-keys-to-rebase.patch

Benjamin Dauvergne, 21 juin 2019 13:33

Télécharger (4,09 ko)

Voir les différences:

Subject: [PATCH 5/6] check self referene in keys (to rebase)

 src/authentic2/csv_import.py | 26 ++++++++++++++++++++++----
 tests/test_csv_import.py     | 18 ++++++++++++++++++
 2 files changed, 40 insertions(+), 4 deletions(-)
src/authentic2/csv_import.py
276 276
                self.add_error(self.csv_importer.error)
277 277

  
278 278
        def do_import():
279
            unique_map = {}
280

  
279 281
            try:
280 282
                with atomic():
281 283
                    for row in self.rows:
282
                        if not self.do_import_row(row):
284
                        if not self.do_import_row(row, unique_map):
283 285
                            self.rows_with_errors += 1
284 286
                    if simulate:
285 287
                        raise Simulate
......
446 448
    def username_is_unique(self):
447 449
        return app_settings.A2_USERNAME_IS_UNIQUE or self.ou.username_is_unique
448 450

  
449
    def check_unique_constraints(self, row, user=None):
451
    def check_unique_constraints(self, row, unique_map, user=None):
450 452
        ou_users = User.objects.filter(ou=self.ou)
451 453
        users = User.objects.all()
452 454
        if user:
453 455
            users = users.exclude(pk=user.pk)
454 456
            ou_users = ou_users.exclude(pk=user.pk)
455 457
        errors = []
458
        for cell in row:
459
            header = cell.header
460
            if header.name == SOURCE_ID:
461
                unique_key = (SOURCE_ID, row[SOURCE_NAME].value, cell.value)
462
            elif header.key or header.globally_unique or header.unique:
463
                unique_key = (header.name, cell.value)
464
            else:
465
                continue
466
            if unique_key in unique_map:
467
                errors.append(
468
                    Error('unique-constraint-failed',
469
                          _('Unique constraint on column "%s" failed: '
470
                            'value already appear on line %d') % (header.name, row.line)))
471
            else:
472
                unique_map[unique_key] = row.line
473

  
456 474
        for cell in row:
457 475
            if (not cell.header.globally_unique and not cell.header.unique) or (user and not cell.header.update):
458 476
                continue
......
472 490
        return not bool(errors)
473 491

  
474 492
    @atomic
475
    def do_import_row(self, row):
493
    def do_import_row(self, row, unique_map):
476 494
        if not row.is_valid:
477 495
            return False
478 496

  
......
516 534
        if users:
517 535
            user = users[0]
518 536

  
519
        if not self.check_unique_constraints(row, user=user):
537
        if not self.check_unique_constraints(row, unique_map, user=user):
520 538
            return False
521 539

  
522 540
        if not user:
tests/test_csv_import.py
263 263
    assert importer.rows[0].errors == [Error('unique-constraint-failed')]
264 264

  
265 265

  
266
def test_create_key_self_reference_error(profile, user_csv_importer_factory):
267
    content = '''email key,first_name,last_name,phone
268
tnoel@entrouvert.com,Thomas,Noël,1234
269
tnoel@entrouvert.com,Frédéric,Péters,1234'''
270
    importer = user_csv_importer_factory(content)
271

  
272
    assert importer.run()
273

  
274
    assert importer.created == 1
275
    assert importer.updated == 0
276
    assert len(importer.rows) == 2
277
    assert importer.rows[0].is_valid
278
    assert importer.rows[0].action == 'create'
279
    assert not importer.rows[1].is_valid
280
    assert importer.rows[1].action == 'update'
281
    assert importer.rows[1].errors == [Error('unique-constraint-failed')]
282

  
283

  
266 284
def test_update_unique_error(profile, user_csv_importer_factory):
267 285
    content = '''email key verified,first_name,last_name,phone unique update
268 286
tnoel@entrouvert.com,Thomas,Noël,1234'''
269
-