diff --git a/api/views/default.py b/api/views/default.py index 21d172e0a..776a9fd25 100644 --- a/api/views/default.py +++ b/api/views/default.py @@ -392,7 +392,7 @@ def add_student_to_class(request, class_id): username = data["username"] errors = [] - + already_assigned = [] for username in data["username"]: username = username.strip().upper() user = None @@ -406,6 +406,10 @@ def add_student_to_class(request, class_id): user.save() if user: + if Class.objects.filter(subject=clazz.subject, students=user).exists(): + already_assigned.append(username) + errors.append(username) + continue clazz.students.add(user) else: errors.append(username) @@ -414,6 +418,7 @@ def add_student_to_class(request, class_id): { "success": not errors, "not_found": errors, + "already_assigned": already_assigned, } ) diff --git a/common/bulk_import.py b/common/bulk_import.py index dd470e648..f5a409f83 100644 --- a/common/bulk_import.py +++ b/common/bulk_import.py @@ -22,6 +22,7 @@ class ImportResult: firstname: str lastname: str created: bool + already_assigned: bool def run( @@ -103,6 +104,7 @@ def run( firstname, lastname = student.firstName, student.secondName created = False + already_assigned = False student_user = None try: @@ -111,6 +113,9 @@ def run( student_user = user_from_login(login) created = True - class_in_db[c].students.add(student_user) + if Class.objects.filter(subject=class_in_db[c].subject, students=user).exists(): + already_assigned = True + else: + class_in_db[c].students.add(student_user) - yield ImportResult(login, firstname, lastname, created) + yield ImportResult(login, firstname, lastname, created, already_assigned) diff --git a/frontend/src/AddStudentsToClass.svelte b/frontend/src/AddStudentsToClass.svelte index 0e827a09b..8e26e61d9 100644 --- a/frontend/src/AddStudentsToClass.svelte +++ b/frontend/src/AddStudentsToClass.svelte @@ -42,8 +42,11 @@ async function addStudents() { let res = await req.json(); if (res) { if (res['not_found'].length) { - addStudentError = 'Not found users left in textarea.'; - textarea = res['not_found'].join('\n'); + addStudentError = + 'Not found users left in textarea. Already assigned students are separated by a newline'; + textarea = res['not_found'].filter((x) => !res['already_assigned'].includes(x)).join('\n'); + textarea += '\n\n'; + textarea += res['already_assigned'].join('\n'); dispatch('update'); } else if (res['success'] === true) { textarea = ''; diff --git a/frontend/src/Teacher/InbusImport.vue b/frontend/src/Teacher/InbusImport.vue index 4a6450d5c..ff2544de3 100644 --- a/frontend/src/Teacher/InbusImport.vue +++ b/frontend/src/Teacher/InbusImport.vue @@ -28,6 +28,7 @@ interface ImportResult { firstname: string; lastname: string; created: boolean; + already_assigned: boolean; } interface Result { @@ -374,6 +375,7 @@ function onTeacherSelected(event) {