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:
|