Improve user creation
This commit is contained in:
@@ -74,6 +74,11 @@ urlpatterns = [
|
||||
views.UpdateUserView.as_view(),
|
||||
name="account_update",
|
||||
),
|
||||
path(
|
||||
"accounts/delete/<int:pk>/",
|
||||
views.DeleteUserView.as_view(),
|
||||
name="account_delete",
|
||||
),
|
||||
path(
|
||||
"accounts/update_profile/<str:slug>/",
|
||||
views.UpdateUserProfileView.as_view(),
|
||||
|
||||
+68
-59
@@ -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>"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user