numerous updates
This commit is contained in:
+126
-53
@@ -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
|
||||
Reference in New Issue
Block a user