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