From a628bd59b29128815deb9c69707b58a6c9e85c98 Mon Sep 17 00:00:00 2001 From: Ross Date: Sat, 11 Dec 2021 13:01:40 +0000 Subject: [PATCH] . --- .../migrations/0015_ciduser_ciduserexam.py | 34 +++++++++++++++++++ generic/models.py | 5 +++ physics/migrations/0015_exam_valid_users.py | 19 +++++++++++ physics/models.py | 3 +- physics/views.py | 8 ++++- 5 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 generic/migrations/0015_ciduser_ciduserexam.py create mode 100644 physics/migrations/0015_exam_valid_users.py diff --git a/generic/migrations/0015_ciduser_ciduserexam.py b/generic/migrations/0015_ciduser_ciduserexam.py new file mode 100644 index 00000000..ddbfb8c4 --- /dev/null +++ b/generic/migrations/0015_ciduser_ciduserexam.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.8 on 2021-12-11 12:47 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('generic', '0014_alter_questionnote_note'), + ] + + operations = [ + migrations.CreateModel( + name='CidUser', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cid', models.IntegerField(blank=True, null=True)), + ('passcode', models.CharField(blank=True, max_length=50)), + ], + ), + migrations.CreateModel( + name='CidUserExam', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('object_id', models.PositiveIntegerField()), + ('start_time', models.DateTimeField(blank=True, null=True)), + ('end_time', models.DateTimeField(blank=True, null=True)), + ('cid_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='generic.ciduser')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), + ], + ), + ] diff --git a/generic/models.py b/generic/models.py index 5203d655..39aa30a7 100644 --- a/generic/models.py +++ b/generic/models.py @@ -94,6 +94,7 @@ class ExamBase(models.Model): default=False, ) + # time_limit = models.IntegerField( # help_text="Exam time limit (in seconds). Default is 2100 secondse (35 minutes)", # default=2100, @@ -190,6 +191,9 @@ class CidUser(models.Model): cid = models.IntegerField(blank=True, null=True) passcode = models.CharField(blank=True, max_length=50) + def __str__(self) -> str: + return self.cid + class CidUserExam(models.Model): content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() @@ -199,3 +203,4 @@ class CidUserExam(models.Model): end_time = models.DateTimeField(blank=True, null=True) cid_user = models.ForeignKey(CidUser, on_delete=models.CASCADE) + diff --git a/physics/migrations/0015_exam_valid_users.py b/physics/migrations/0015_exam_valid_users.py new file mode 100644 index 00000000..ba5aa506 --- /dev/null +++ b/physics/migrations/0015_exam_valid_users.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.8 on 2021-12-11 13:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('generic', '0015_ciduser_ciduserexam'), + ('physics', '0014_alter_exam_open_access'), + ] + + operations = [ + migrations.AddField( + model_name='exam', + name='valid_users', + field=models.ManyToManyField(blank=True, related_name='physics_exams', to='generic.CidUser'), + ), + ] diff --git a/physics/models.py b/physics/models.py index c853c8ae..694f1c4c 100644 --- a/physics/models.py +++ b/physics/models.py @@ -12,7 +12,7 @@ from django.utils.translation import ugettext_lazy as _ from sortedm2m.fields import SortedManyToManyField -from generic.models import ExamBase, QuestionNote +from generic.models import CidUser, ExamBase, QuestionNote import reversion @@ -154,6 +154,7 @@ class Exam(ExamBase): help_text='Author of exam', related_name="physics_exam_author") + valid_users = models.ManyToManyField(CidUser, blank=True, related_name="physics_exams") @reversion.register diff --git a/physics/views.py b/physics/views.py index d06f2da2..57353e35 100644 --- a/physics/views.py +++ b/physics/views.py @@ -315,13 +315,19 @@ def exam_finish(request, pk, cid): ) -def exam_take(request, pk, sk, cid): +def exam_take(request, pk, sk, cid, passcode=None): exam = get_object_or_404(Exam, pk=pk) if not exam.active: raise Http404("Exam not found") + if exam.valid_users is not None: + user = exam.valid_users.filter(cid=cid) + + if not user or user.passcode != passcode: + raise Http404("Exam not found") + question = exam.exam_questions.all()[sk] exam_length = len(exam.exam_questions.all())