diff --git a/rad/views.py b/rad/views.py index 44ea3eae..3004fe8c 100644 --- a/rad/views.py +++ b/rad/views.py @@ -815,8 +815,20 @@ def accounts_bulk_create_check(request): if not UserGrades.objects.filter(name=user["grade"]): errors.append("Invalid grade") - if user["supervisor_email"] == "undefined": - errors.append("No supervisor email provided") + # Treat empty, missing or the string 'undefined' as no supervisor email provided + if not user.get("supervisor_email") or user["supervisor_email"] == "undefined": + # Supervisor email not provided; try to match by name + if not user.get("supervisor_name"): + errors.append("No supervisor provided") + else: + supervisor = Supervisor.objects.filter(name__iexact=user["supervisor_name"]) + if not supervisor.exists(): + info.append("Supervisor does not exist (will be created)") + else: + info.append("Supervisor exists (matched by name)") + if supervisor.count() > 1: + errors.append("More than one supervisor with that name") + # no further name check needed since matched by name else: supervisor = Supervisor.objects.filter(email=user["supervisor_email"]) @@ -828,8 +840,14 @@ def accounts_bulk_create_check(request): if supervisor.count() > 1: errors.append("More than one supervisor with that email") - if supervisor.first().name != user["supervisor_name"]: - errors.append("Supervisor name does not match") + # Compare names case-insensitively and trimmed to avoid false mismatches + try: + sup_name = (supervisor.first().name or '').strip().lower() + posted_name = (user.get("supervisor_name") or '').strip().lower() + if posted_name and sup_name != posted_name: + errors.append("Supervisor name does not match") + except Exception: + pass if errors: return HttpResponse( @@ -869,11 +887,22 @@ def accounts_bulk_create(request): grade = UserGrades.objects.get(name=user["grade"]) user_profile.grade = grade - if "supervisor_email" in user and "supervisor_name" in user: - s, created = Supervisor.objects.get_or_create( - email=user["supervisor_email"], - name=user["supervisor_name"], - ) + if "supervisor_name" in user and user.get("supervisor_name"): + sup_email = user.get("supervisor_email") + # If supervisor email provided, prefer that. Otherwise try to match by name or create placeholder + if sup_email and sup_email != 'undefined': + s, created = Supervisor.objects.get_or_create(email=sup_email, defaults={"name": user.get("supervisor_name")}) + else: + # try match by name + s_qs = Supervisor.objects.filter(name__iexact=user.get("supervisor_name")) + if s_qs.exists(): + s = s_qs.first() + created = False + else: + import uuid + placeholder = f"no-email-{uuid.uuid4().hex}@local.invalid" + s = Supervisor.objects.create(email=placeholder, name=user.get("supervisor_name")) + created = True if created: s.save() @@ -913,11 +942,20 @@ def accounts_bulk_create(request): user_profile = UserProfile.objects.get(user=new_user) user_profile.peninsula_trainee = True # TODO: check supervisor details are correct - if "supervisor_email" in user and "supervisor_name" in user: - s, created = Supervisor.objects.get_or_create( - email=user["supervisor_email"], - name=user["supervisor_name"], - ) + if "supervisor_name" in user and user.get("supervisor_name"): + sup_email = user.get("supervisor_email") + if sup_email and sup_email != 'undefined': + s, created = Supervisor.objects.get_or_create(email=sup_email, defaults={"name": user.get("supervisor_name")}) + else: + s_qs = Supervisor.objects.filter(name__iexact=user.get("supervisor_name")) + if s_qs.exists(): + s = s_qs.first() + created = False + else: + import uuid + placeholder = f"no-email-{uuid.uuid4().hex}@local.invalid" + s = Supervisor.objects.create(email=placeholder, name=user.get("supervisor_name")) + created = True if created: s.save() @@ -962,7 +1000,7 @@ def request_cid_details(request): email = request.POST.get("email") try: validate_email(email) - except ValidationError as e: + except ValidationError: return HttpResponse("Invalid email.") cid_users = CidUser.objects.filter(email=email) diff --git a/templates/accounts_bulk_create.html b/templates/accounts_bulk_create.html index 6fb4e040..34c55699 100644 --- a/templates/accounts_bulk_create.html +++ b/templates/accounts_bulk_create.html @@ -36,12 +36,20 @@
Please note users created this way bypass some of the validations so check details such as email addresses are correct
+