numerous updates

This commit is contained in:
Ross
2022-05-20 20:26:02 +01:00
parent 0373b22e78
commit 77ccdbc92a
246 changed files with 22615 additions and 2409 deletions
+126 -53
View File
@@ -43,9 +43,10 @@ from .forms import (
CidUserForm,
ExaminationForm,
CidUserGroupForm,
UserUserGroupForm,
)
from .models import CidUser, CidUserGroup, Examination, QuestionNote
from .models import CidUser, CidUserGroup, Examination, QuestionNote, UserUserGroup
from rapids.models import Rapid as RapidQuestion
from rapids.models import Exam as RapidExam
@@ -623,14 +624,18 @@ class ExamViews(View, LoginRequiredMixin):
if not self.check_user_access(request.user, exam_id):
raise PermissionDenied
cid_users = exam.valid_users.all()
cid_users = exam.valid_cid_users.all()
cid_user_count = cid_users.count()
user_users = exam.valid_user_users.all()
user_user_count = user_users.count()
context = {
"exam": exam,
"cid_users": cid_users,
"cid_user_count": cid_user_count,
"user_users": user_users,
"user_user_count": user_user_count,
"app_name": self.app_name,
}
@@ -644,6 +649,41 @@ class ExamViews(View, LoginRequiredMixin):
)
def exam_users_edit(self, request, exam_id):
exam = get_object_or_404(self.Exam, pk=exam_id)
if not request.user.groups.filter(name="cid_user_manager").exists():
#raise PermissionDenied
if request.user not in exam.author.all():
if not self.check_user_access(request.user, exam_id):
raise PermissionDenied
current_user_users = exam.valid_user_users.all()
exam_groups = exam.user_user_groups.all()
available_user_users = list(User.objects.filter(user_groups__in=exam_groups).difference(current_user_users))
print(available_user_users)
#available_user_users = User.objects.all()
context = {
"exam": exam,
"groups": exam_groups,
"current_user_users": current_user_users,
"available_user_users": available_user_users,
"app_name": self.app_name,
}
if self.app_name == "atlas":
context["collection"] = exam
return render(
request,
"exam_users_edit.html",
context
)
def exam_cids_edit(self, request, exam_id):
exam = get_object_or_404(self.Exam, pk=exam_id)
@@ -653,7 +693,7 @@ class ExamViews(View, LoginRequiredMixin):
if not self.check_user_access(request.user, exam_id):
raise PermissionDenied
current_cid_users = exam.valid_users.all()
current_cid_users = exam.valid_cid_users.all()
exam_groups = exam.cid_user_groups.all()
@@ -725,6 +765,26 @@ class ExamViews(View, LoginRequiredMixin):
data = {"status": "success", "added": add}
return JsonResponse(data, status=200)
if "edit_user_user" in request.POST:
user_id = request.POST.get("edit_user_user")
add = request.POST.get("add") == "true"
user_user = User.objects.get(pk=user_id)
app_exam_map = {}
app_exam_map["rapids"] = user_user.user_rapid_exams
#app_exam_map["atlas"] = user_user.casecollection_exams
if add:
app_exam_map[self.app_name].add(pk)
else:
app_exam_map[self.app_name].remove(pk)
data = {"status": "success", "added": add}
return JsonResponse(data, status=200)
if "add_exam_questions" in request.POST:
question_ids = json.loads(request.POST.get("add_exam_questions"))
question_objects = self.Question.objects.filter(pk__in=question_ids)
@@ -932,7 +992,7 @@ class ExamViews(View, LoginRequiredMixin):
for exam in exams:
if exam.active or self.check_user_access(request.user, exam.pk):
print(exam.name, cid, passcode)
if exam.exam_mode and not exam.check_cid_user(cid, passcode):
if exam.exam_mode and not exam.check_cid_user(cid, passcode, user_id=request.user.pk):
print(exam.name, "fail")
continue
@@ -979,7 +1039,7 @@ class ExamViews(View, LoginRequiredMixin):
n = 0
for answer in json.loads(request.POST.get("answers")):
ret_status, ret = self.loadJsonAnswer(answer)
ret_status, ret = self.loadJsonAnswer(answer, user=request.user)
# try:
# ret_status, ret = self.loadJsonAnswer(answer)
# except:
@@ -996,15 +1056,18 @@ class ExamViews(View, LoginRequiredMixin):
# print(UserAnswer.objects.filter(exam__id=q["eid"]))
# print(request.urlencode())
exam_type, exam_id = request.POST.get("eid").split("/")
c = CidUser.objects.filter(cid=request.POST.get("cid")).first()
exam = self.Exam.objects.get(pk=exam_id)
t = timezone.make_aware(
datetime.fromtimestamp(float(request.POST.get("start_time")))
)
cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c, start_time=t)
if request.POST.get("cid").startswith("u-"):
cid_user_exam = exam.get_or_create_cid_user_exam(user_user=request.user, start_time=t)
else:
c = CidUser.objects.filter(cid=request.POST.get("cid")).first()
cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c, start_time=t)
cid_user_exam.end_time = timezone.now()
cid_user_exam.save()
@@ -1021,7 +1084,11 @@ class ExamViews(View, LoginRequiredMixin):
if not exam.active and not self.check_user_access(request.user, pk):
raise Http404("No available exam")
time = datetime.now()
exam_json = exam.get_exam_json(based=False)
exam_json["generated"] = time.isoformat()
exam_json["exam_json_id"] = exam.exam_json_id
# exam_json["exam_active"] = False
return JsonResponse(exam_json)
@@ -1115,10 +1182,10 @@ class ExamViews(View, LoginRequiredMixin):
if not exam.exam_mode:
raise Http404("Packet not in exam mode")
user_answers_and_marks = defaultdict(list)
#user_answers_and_marks = defaultdict(list)
user_answers_marks = defaultdict(list)
user_answers = defaultdict(list)
user_names = {}
#user_names = {}
# cid_passcodes = {}
by_question = defaultdict(dict)
@@ -1136,11 +1203,16 @@ class ExamViews(View, LoginRequiredMixin):
# Loop through all candidates
for cid_user_answer in cid_user_answers:
# Convoluted (probably...)
cid = cid_user_answer.cid
# cid_passcodes[cid] = cid_user_answer.passcode
cids.add(cid)
if cid_user_answer.user is None:
cid = cid_user_answer.cid
# cid_passcodes[cid] = cid_user_answer.passcode
cids.add(cid)
else:
cid = f"u/{cid_user_answer.user.username}"
cids.add(cid)
s = cid_user_answer
user_names[cid] = cid
#user_names[cid] = cid
q = cid_user_answer.question
@@ -1159,7 +1231,7 @@ class ExamViews(View, LoginRequiredMixin):
unmarked.add(index)
user_answers[cid].append(ans)
user_answers_marks[cid].append(answer_score)
user_answers_and_marks[cid].append((ans, answer_score))
#user_answers_and_marks[cid].append((ans, answer_score))
if self.app_name in ("rapids", "anatomy", "sbas"):
by_question[q][cid] = (ans, answer_score)
@@ -1247,13 +1319,13 @@ class ExamViews(View, LoginRequiredMixin):
"unmarked": unmarked,
"questions": questions,
"by_question": by_question,
"user_answers": dict(user_answers),
"user_answers_marks": dict(user_answers_marks),
#"user_answers": dict(user_answers),
#"user_answers_marks": dict(user_answers_marks),
"user_scores": user_scores,
"user_scores_normalised": user_scores_normalised,
"user_scores_list": user_scores_list,
"user_names": user_names,
"user_answers_and_marks": user_answers_and_marks,
#"user_scores_list": user_scores_list,
#"user_names": user_names,
#"user_answers_and_marks": user_answers_and_marks,
"max_score": max_score,
"mean": mean,
"median": median,
@@ -1480,36 +1552,43 @@ class CidUserView(CidManagerRequiredMixin, SingleTableMixin, FilterView):
return context
@login_required
@user_is_cid_user_manager
def group_view(request):
def cid_group_view(request):
groups = CidUserGroup.objects.filter(archive=False)
return render(
request,
"generic/group_view.html",
"generic/cid_group_view.html",
{"groups": groups},
)
@user_is_cid_user_manager
def group_view(request):
groups = CidUserGroup.objects.filter(archive=False)
return render(
request,
"generic/group_view.html",
{"groups": groups, "view_all": False},
)
@user_is_cid_user_manager
def group_view_all(request):
def cid_group_view_all(request):
groups = CidUserGroup.objects.filter()
return render(
request,
"generic/group_view.html",
"generic/cid_group_view.html",
{"groups": groups, "view_all": True},
)
@user_is_cid_user_manager
def user_group_view(request):
groups = UserUserGroup.objects.filter(archive=False)
return render(
request,
"generic/user_group_view.html",
{"groups": groups},
)
@user_is_cid_user_manager
def user_group_view_all(request):
groups = UserUserGroup.objects.filter()
return render(
request,
"generic/user_group_view.html",
{"groups": groups, "view_all": True},
)
@@ -1543,21 +1622,6 @@ def group_email(request, pk, resend=False):
{"users": users, "users_count": users.count(), "results": False},
)
# sent = []
# not_sent = []
# for u in users:
# success, msg = u.email_details(resend=resend)
# if success:
# sent.append(u)
# else:
# not_sent.append((u, msg))
# return render(
# request,
# "generic/group_emailed.html",
# {"sent": sent, "not_sent": not_sent, "users_count": users.count()},
# )
@user_is_cid_user_manager
def group_email_results(request, pk, resend=False):
@@ -1788,3 +1852,12 @@ class CidUserGroupCreate(RevisionMixin, CidManagerRequiredMixin, CreateView):
class CidUserGroupUpdate(RevisionMixin, CidManagerRequiredMixin, UpdateView):
model = CidUserGroup
form_class = CidUserGroupForm
class UserUserGroupCreate(RevisionMixin, CidManagerRequiredMixin, CreateView):
model = UserUserGroup
form_class = UserUserGroupForm
class UserUserGroupUpdate(RevisionMixin, CidManagerRequiredMixin, UpdateView):
model = UserUserGroup
form_class = UserUserGroupForm