From ac0a055ca12f19a60dd7e33b47eccf7f1fda2c1f Mon Sep 17 00:00:00 2001 From: Dym03 Date: Thu, 20 Mar 2025 21:21:04 +0100 Subject: [PATCH 1/2] Added validation to prevent multiple classes of the same subject --- api/views/default.py | 7 ++++++- frontend/src/AddStudentsToClass.svelte | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) 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/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 = ''; From 8a1ce87675e2e199391849739e447c6d6a9485d3 Mon Sep 17 00:00:00 2001 From: Dym03 Date: Fri, 21 Mar 2025 08:21:57 +0100 Subject: [PATCH 2/2] Added support for inbus import --- common/bulk_import.py | 9 +++++++-- frontend/src/Teacher/InbusImport.vue | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) 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/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) { First name Last name User created + Already assigned @@ -382,6 +384,7 @@ function onTeacherSelected(event) { {{ item.firstname }} {{ item.lastname }} {{ item.created }} + {{ item.already_assigned }}