tidy up the marker changes
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
# Generated by Django 5.0.2 on 2024-08-05 10:09
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('longs', '0026_exam_markers'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='exam',
|
||||
name='markers',
|
||||
field=models.ManyToManyField(blank=True, help_text='Authorised markers for the exam', null=True, related_name='long_exam_markers', to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.0.2 on 2024-08-05 11:39
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('longs', '0027_alter_exam_markers'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='exam',
|
||||
name='double_mark',
|
||||
field=models.BooleanField(default=False, help_text='Defines if an exam is expected to be double marked'),
|
||||
),
|
||||
]
|
||||
+2
-1
@@ -449,12 +449,13 @@ class Exam(ExamBase):
|
||||
markers = models.ManyToManyField(
|
||||
settings.AUTH_USER_MODEL,
|
||||
blank=True,
|
||||
null=True,
|
||||
help_text="Authorised markers for the exam",
|
||||
related_name="long_exam_markers",
|
||||
)
|
||||
|
||||
double_mark = models.BooleanField(
|
||||
default=True, help_text="Defines if an exam is expected to be double marked"
|
||||
default=False, help_text="Defines if an exam is expected to be double marked"
|
||||
)
|
||||
|
||||
valid_cid_users = models.ManyToManyField(
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
|
||||
{% extends 'generic/exam_scores_base.html' %}
|
||||
|
||||
{% block navigation %}
|
||||
{{ block.super }}
|
||||
{% include 'generic/exam_link_headers.html' %}
|
||||
{% endblock navigation %}
|
||||
|
||||
{% block table_answers %}
|
||||
{% for question in questions %}
|
||||
<tr>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% extends 'longs/exams.html' %}
|
||||
|
||||
{% block content %}
|
||||
<a href="{% url 'longs:exam_question_detail' exam.id question_details.current|add:'-1' %}"
|
||||
Question -> <a href="{% url 'longs:exam_question_detail' exam.id question_details.current|add:'-1' %}"
|
||||
title="View the Question">View</a>
|
||||
<a href="{% url 'longs:long_update' question.id %}" title="Edit the Question">Edit</a> <a
|
||||
href="{% url 'admin:longs_long_change' question.id %}" title="Edit the Question using the admin interface">Admin
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% extends 'longs/exams.html' %}
|
||||
|
||||
{% block content %}
|
||||
<a href="{% url 'longs:exam_question_detail' exam.id question_details.current|add:'-1' %}"
|
||||
Question -> <a href="{% url 'longs:exam_question_detail' exam.id question_details.current|add:'-1' %}"
|
||||
title="View the Question">View</a>
|
||||
<a href="{% url 'longs:long_update' question.id %}" title="Edit the Question">Edit</a> <a
|
||||
href="{% url 'admin:longs_long_change' question.id %}" title="Edit the Question using the admin interface">Admin
|
||||
@@ -19,7 +19,7 @@
|
||||
<ul>
|
||||
{% for answer in user_answers %}
|
||||
<li>
|
||||
<a href="{% url 'longs:mark_answer' exam.id question_details.current|add:'-1' answer.id %}"
|
||||
<a class="mark-answer-link" href="{% url 'longs:mark_answer' exam.id question_details.current|add:'-1' answer.id %}"
|
||||
title="Click to mark"> {{answer.get_candidate_masked}}</a>:
|
||||
{% if answer.is_marked %}
|
||||
Score {{answer.get_answer_score}}
|
||||
|
||||
@@ -30,6 +30,7 @@ from longs.models import (
|
||||
from generic.models import CidUser, CidUserGroup, UserUserGroup
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.core.exceptions import PermissionDenied
|
||||
|
||||
from rad.tests.test_helpers import AssertNotFound, create_cid_user_and_groups
|
||||
|
||||
@@ -150,7 +151,7 @@ def test_exams(db, client):
|
||||
== 404
|
||||
)
|
||||
|
||||
users_tested = 1
|
||||
users_tested = 0
|
||||
for cid_user in [cid_user_1001, cid_user_1000, user1]:
|
||||
if isinstance(cid_user, CidUser):
|
||||
testing_cid_user = True
|
||||
@@ -550,16 +551,6 @@ def test_exams(db, client):
|
||||
assert str(answer_lis[-1]).count("Not answered") == 5
|
||||
|
||||
|
||||
## Load the mark overview page
|
||||
#mark_overview_res = client.get(reverse(
|
||||
# f"{exam.app_name}:mark_overview",
|
||||
# kwargs={"pk": exam.pk},
|
||||
# ))
|
||||
#print(mark_overview_res.content)
|
||||
#mark_overview_soup = BeautifulSoup(mark_overview_res.content, "html.parser")
|
||||
|
||||
#to_mark = mark_overview_soup.find("ul", {"id": "question-mark-list"}).find_all("li")
|
||||
#assert len(to_mark) == 5
|
||||
|
||||
|
||||
# Publish the results!
|
||||
@@ -642,3 +633,55 @@ def test_exams(db, client):
|
||||
|
||||
generated_questions.pop(-1).delete()
|
||||
users_tested = users_tested + 1
|
||||
|
||||
assert users_tested == 3
|
||||
|
||||
|
||||
# Some quick tests to check for user access to the marking page
|
||||
client.login(username="marker", password="test1234")
|
||||
|
||||
|
||||
# Load the mark overview page
|
||||
mark_overview_res = client.get(reverse(
|
||||
f"{exam.app_name}:mark_overview",
|
||||
kwargs={"pk": exam.pk},
|
||||
))
|
||||
|
||||
assert mark_overview_res.status_code == 403
|
||||
|
||||
exam.markers.add(User.objects.get(username="marker"))
|
||||
|
||||
|
||||
mark_overview_res = client.get(reverse(
|
||||
f"{exam.app_name}:mark_overview",
|
||||
kwargs={"pk": exam.pk},
|
||||
))
|
||||
assert mark_overview_res.status_code == 200
|
||||
mark_overview_soup = BeautifulSoup(mark_overview_res.content, "html.parser")
|
||||
|
||||
to_mark = mark_overview_soup.find("ul", {"id": "question-mark-list"}).find_all("li")
|
||||
assert len(to_mark) == 3
|
||||
|
||||
for n in range(0,3):
|
||||
mark_question_res = client.get(reverse(
|
||||
f"{exam.app_name}:mark",
|
||||
kwargs={"exam_id": exam.pk, "sk": n},
|
||||
))
|
||||
assert mark_question_res.status_code == 200
|
||||
mark_question_soup = BeautifulSoup(mark_question_res.content, "html.parser")
|
||||
print(mark_question_soup)
|
||||
|
||||
#mark_links = mark_question_soup.find_all("a", {"class": "mark-answer-link"})
|
||||
#assert len(mark_links) == 2
|
||||
|
||||
#for link in mark_links:
|
||||
# mark_res = client.get(link["href"])
|
||||
# assert mark_res.status_code == 200
|
||||
|
||||
|
||||
mark_question_res = client.get(reverse(
|
||||
f"{exam.app_name}:mark",
|
||||
kwargs={"exam_id": exam.pk, "sk": 4},
|
||||
))
|
||||
assert mark_question_res.status_code == 404
|
||||
mark_question_soup = BeautifulSoup(mark_question_res.content, "html.parser")
|
||||
+9
-4
@@ -641,17 +641,19 @@ class LongSeriesView(LoginRequiredMixin, SingleTableMixin, FilterView):
|
||||
filterset_class = LongSeriesFilter
|
||||
|
||||
|
||||
@user_is_long_marker
|
||||
@reversion.create_revision()
|
||||
#@user_is_long_marker
|
||||
def mark_answer_override(request, exam_id, question_number, cid):
|
||||
return mark_answer(request, exam_id, question_number, cid, override=True)
|
||||
|
||||
|
||||
@user_is_long_marker
|
||||
#@user_is_long_marker
|
||||
@reversion.create_revision()
|
||||
def mark_answer(request, exam_id, question_number, answer_id, override=False):
|
||||
exam = get_object_or_404(Exam, pk=exam_id)
|
||||
|
||||
if not GenericExamViews.check_user_marker_access(request.user, exam_id):
|
||||
raise PermissionDenied
|
||||
|
||||
questions = exam.get_questions()
|
||||
|
||||
n = question_number
|
||||
@@ -843,10 +845,13 @@ def mark_answer(request, exam_id, question_number, answer_id, override=False):
|
||||
|
||||
# @user_passes_test(user_is_admin, login_url="/accounts/login")
|
||||
@login_required
|
||||
@user_is_long_marker
|
||||
#@user_is_long_marker
|
||||
def mark(request, exam_id, sk):
|
||||
exam = get_object_or_404(Exam, pk=exam_id)
|
||||
|
||||
if not GenericExamViews.check_user_marker_access(request.user, exam_id):
|
||||
raise PermissionDenied
|
||||
|
||||
questions = exam.get_questions()
|
||||
|
||||
n = sk
|
||||
|
||||
Reference in New Issue
Block a user