Improve user creation

This commit is contained in:
Ross
2023-02-20 11:43:56 +00:00
parent 0eacd83446
commit 81d4dc72cc
7 changed files with 191 additions and 95 deletions
+68 -59
View File
@@ -125,17 +125,18 @@ def cid_results(request, cid):
},
)
@login_required
def user_scores(request):
# exam = get_object_or_404(Exam, pk=pk)
#cid = pk
# cid = pk
#cid_user = CidUser.objects.filter(cid=cid).first()
#print(cid_user)
#if not cid_user or cid_user.passcode != passcode:
# cid_user = CidUser.objects.filter(cid=cid).first()
# print(cid_user)
# if not cid_user or cid_user.passcode != passcode:
# raise Http404("CID / Passcode combination not found")
#print(cid_user.passcode)
# print(cid_user.passcode)
# questions = exam.exam_questions.all()
EXAM_ANSWER_MAP = {
@@ -156,8 +157,7 @@ def user_scores(request):
if exams_to_add:
exams.append((exam_type, exams_to_add))
#case_collections = request.user.casecollection_exams.all()
# case_collections = request.user.casecollection_exams.all()
USER_EXAM_TYPES = (
("Physics", "user_physics_exams"),
@@ -165,7 +165,7 @@ def user_scores(request):
("SBAs", "user_sba_exams"),
("Anatomy", "user_anatomy_exams"),
("Longs", "user_longs_exams"),
#("CaseCollection", "user_casecollection_exams"),
# ("CaseCollection", "user_casecollection_exams"),
)
available_exams = []
@@ -175,7 +175,7 @@ def user_scores(request):
temp_exams = exam_rel.filter(exam_mode=True, archive=False).order_by("name")
available_exams.append((n, temp_exams))
#available_exams = request.user.get_cid_exams()
# available_exams = request.user.get_cid_exams()
return render(
request,
@@ -187,13 +187,14 @@ def user_scores(request):
# "longs_exams": longs_exams,
# "sba_exams": sba_exams,
"all_exams": exams,
#"passcode": passcode,
# "passcode": passcode,
"cid_user": request.user,
"available_exams": available_exams,
"case_collections": [],#case_collections,
"case_collections": [], # case_collections,
},
)
def cid_scores(request, cid, passcode):
# exam = get_object_or_404(Exam, pk=pk)
@@ -345,7 +346,6 @@ class AddQuestionNote(CreateView):
return context
def form_valid(self, form):
model = form.save(commit=False)
if self.request.user.is_authenticated:
@@ -482,6 +482,7 @@ def view_feedback(request):
},
)
def privacy_view(request):
return render(request, "privacy.html")
@@ -517,6 +518,7 @@ class UserListView(CidManagerRequiredMixin, FilterView):
filterset_class = UserListFilter
class UserListTableView(CidManagerRequiredMixin, SingleTableMixin, FilterView):
model = User
table_class = UserUserTable
@@ -528,32 +530,36 @@ class UserListTableView(CidManagerRequiredMixin, SingleTableMixin, FilterView):
context = super().get_context_data(**kwargs)
# user = self.request.user
#filters = {"archive": False, "exam_mode": True}
# filters = {"archive": False, "exam_mode": True}
#physics_exams = [(i.name, i.pk) for i in PhysicsExam.objects.filter(**filters)]
#rapid_exams = [(i.name, i.pk) for i in RapidExam.objects.filter(**filters)]
#sba_exams = [(i.name, i.pk) for i in SbasExam.objects.filter(**filters)]
#longs_exams = [(i.name, i.pk) for i in LongExam.objects.filter(**filters)]
#anatomy_exams = [(i.name, i.pk) for i in AnatomyExam.objects.filter(**filters)]
#casecollection_exams = [
# physics_exams = [(i.name, i.pk) for i in PhysicsExam.objects.filter(**filters)]
# rapid_exams = [(i.name, i.pk) for i in RapidExam.objects.filter(**filters)]
# sba_exams = [(i.name, i.pk) for i in SbasExam.objects.filter(**filters)]
# longs_exams = [(i.name, i.pk) for i in LongExam.objects.filter(**filters)]
# anatomy_exams = [(i.name, i.pk) for i in AnatomyExam.objects.filter(**filters)]
# casecollection_exams = [
# (i.name, i.pk)
# for i in CaseCollection.objects.filter(archive=False, collection_type__gt=0)
#]
# ]
#context["physics_exams"] = physics_exams
#context["rapid_exams"] = rapid_exams
#context["sba_exams"] = sba_exams
#context["longs_exams"] = longs_exams
#context["anatomy_exams"] = anatomy_exams
#context["casecollection_exams"] = casecollection_exams
# context["physics_exams"] = physics_exams
# context["rapid_exams"] = rapid_exams
# context["sba_exams"] = sba_exams
# context["longs_exams"] = longs_exams
# context["anatomy_exams"] = anatomy_exams
# context["casecollection_exams"] = casecollection_exams
#cid_user_groups = [
# cid_user_groups = [
# (i.name, i.pk) for i in CidUserGroup.objects.filter(archive=False)
#]
# ]
#context["cid_user_groups"] = cid_user_groups
# context["cid_user_groups"] = cid_user_groups
return context
class DeleteUserView(CidManagerRequiredMixin, DeleteView):
model = User
template_name: str = "confirm_delete.html"
success_url = reverse_lazy("accounts_list")
class UpdateUserView(CidManagerRequiredMixin, UpdateView):
model = User
@@ -564,9 +570,10 @@ class UpdateUserView(CidManagerRequiredMixin, UpdateView):
slug_url_kwarg = "slug"
def get_success_url(self):
view_name = 'account_profile'
view_name = "account_profile"
# No need for reverse_lazy here, because it's called inside the method
return reverse(view_name, kwargs={'slug': self.object.username})
return reverse(view_name, kwargs={"slug": self.object.username})
class UpdateUserProfileView(CidManagerRequiredMixin, UpdateView):
model = UserProfile
@@ -581,9 +588,9 @@ class UpdateUserProfileView(CidManagerRequiredMixin, UpdateView):
slug_url_kwarg = "slug"
def get_success_url(self):
view_name = 'account_profile'
view_name = "account_profile"
# No need for reverse_lazy here, because it's called inside the method
return reverse(view_name, kwargs={'slug': self.object.username})
return reverse(view_name, kwargs={"slug": self.object.username})
# class UpdateUser(TemplateView):
@@ -617,6 +624,7 @@ class UpdateUserProfileView(CidManagerRequiredMixin, UpdateView):
# def get(self, request, *args, **kwargs):
# return self.post(request, *args, **kwargs)
@user_is_cid_user_manager
def accounts_check_users(request):
if request.method == "POST":
@@ -630,7 +638,7 @@ def accounts_check_users(request):
return JsonResponse({"users": existing_users})
return
return
@user_is_cid_user_manager
@@ -651,14 +659,25 @@ def accounts_bulk_create(request):
for user in users:
if not User.objects.filter(username=user["email"]).exists():
# Start by checking the email
try:
validate_email(user["email"])
except ValidationError:
error_text = (
error_text
+ f"<p>{user['email']} does not appear to be a valid email (account for {user['first_name']} {user['last_name']} not created).</p>"
)
continue
# Try to create the user
try:
print(user)
user_dict = {
"username": user["email"],
"first_name": user["first_name"],
"first_name": user["email"],
"last_name": user["last_name"],
"email": user["email"],
"password": secrets.token_hex(nbytes=16)
"password": secrets.token_hex(nbytes=16),
}
new_user = User.objects.create_user(**user_dict)
except Exception as error:
@@ -666,35 +685,39 @@ def accounts_bulk_create(request):
error_text
+ f"<p>Error creating user: { user['email'] }<br/>{error}</p>"
)
# No need to try and create a profile if we can't create a user
continue
try:
user_profile = UserProfile.objects.get(user=new_user)
user_profile.peninsula_trainee = True
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"])
s, created = Supervisor.objects.get_or_create(
email=user["supervisor_email"],
name=user["supervisor_name"],
)
if created:
s.save()
user_profile.supervisor = s
if "grade" in user:
if not user["grade"].startswith("ST"):
user["grade"] = f"ST{user['grade']}"
grade = UserGrades.objects.get(name=user["grade"])
user_profile.grade = grade
user_profile.save()
created_users.append(user["email"])
except Exception as error:
# If we fail to create the profile delete the user
new_user.delete()
error_text = (
error_text
+ f"<p>Error creating user profile: { user['email'] }<br/>{error}</p>"
+ f"<p>Error creating user profile: { user['email'] }<br/>{error} (user not created)</p>"
)
else:
existing_users.append(user["email"])
@@ -709,22 +732,7 @@ def accounts_bulk_create(request):
context["message"] = "The following users already exist: " + ", ".join(
existing_users
)
# if not self.check_user_edit_access(request.user):
# data = {"status": "error, insufficient permission"}
# return JsonResponse(data, status=400)
# exam = get_object_or_404(self.Exam, pk=pk)
# exam.publish_results = (
# True if request.POST.get("publish_results") == "true" else False
# )
# exam.save()
# data = {
# "status": "success",
# "publish_results": exam.publish_results,
# "name": exam.name,
# "id": exam.id,
# }
return render(request, "accounts_bulk_create.html", context)
else:
return render(request, "accounts_bulk_create.html", {})
@@ -743,5 +751,6 @@ def request_cid_details(request):
cid_user.email_details(resend=True)
cid_user.email_details()
return HttpResponse(f"Candidate details will be sent to the requested email (if it is found in the system). If you have not received an email after a few minutes you may need to contact <a href='mailto:{settings.CONTACT_EMAIL}'>{settings.CONTACT_EMAIL}</a>")
return HttpResponse(
f"Candidate details will be sent to the requested email (if it is found in the system). If you have not received an email after a few minutes you may need to contact <a href='mailto:{settings.CONTACT_EMAIL}'>{settings.CONTACT_EMAIL}</a>"
)