Projet

Général

Profil

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

Benjamin Dauvergne, 18 juin 2019 20:52

Télécharger (4,09 ko)

Voir les différences:

Subject: [PATCH 5/5] 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
281 281
                self.add_error(self.csv_importer.error)
282 282

  
283 283
        def do_import():
284
            unique_map = {}
285

  
284 286
            try:
285 287
                with atomic():
286 288
                    for row in self.rows:
287
                        if not self.do_import_row(row):
289
                        if not self.do_import_row(row, unique_map):
288 290
                            self.rows_with_errors += 1
289 291
                    if simulate:
290 292
                        raise Simulate
......
450 452
    def username_is_unique(self):
451 453
        return app_settings.A2_USERNAME_IS_UNIQUE or self.ou.username_is_unique
452 454

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

  
460 478
        for cell in row:
461 479
            if (not cell.header.globally_unique and not cell.header.unique) or (user and not cell.header.update):
462 480
                continue
......
476 494
        return not bool(errors)
477 495

  
478 496
    @atomic
479
    def do_import_row(self, row):
497
    def do_import_row(self, row, unique_map):
480 498
        if not row.is_valid:
481 499
            return False
482 500

  
......
520 538
        if users:
521 539
            user = users[0]
522 540

  
523
        if not self.check_unique_constraints(row, user=user):
541
        if not self.check_unique_constraints(row, unique_map, user=user):
524 542
            return False
525 543

  
526 544
        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
-