Enhance supervisor email handling and input format options in bulk user creation

This commit is contained in:
Ross
2025-11-03 09:31:55 +00:00
parent 206f0afd32
commit 7eeb989b9e
2 changed files with 123 additions and 36 deletions
+53 -15
View File
@@ -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)