.
This commit is contained in:
@@ -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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -94,6 +94,7 @@ class ExamBase(models.Model):
|
|||||||
default=False,
|
default=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# time_limit = models.IntegerField(
|
# time_limit = models.IntegerField(
|
||||||
# help_text="Exam time limit (in seconds). Default is 2100 secondse (35 minutes)",
|
# help_text="Exam time limit (in seconds). Default is 2100 secondse (35 minutes)",
|
||||||
# default=2100,
|
# default=2100,
|
||||||
@@ -190,6 +191,9 @@ class CidUser(models.Model):
|
|||||||
cid = models.IntegerField(blank=True, null=True)
|
cid = models.IntegerField(blank=True, null=True)
|
||||||
passcode = models.CharField(blank=True, max_length=50)
|
passcode = models.CharField(blank=True, max_length=50)
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return self.cid
|
||||||
|
|
||||||
class CidUserExam(models.Model):
|
class CidUserExam(models.Model):
|
||||||
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
|
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
|
||||||
object_id = models.PositiveIntegerField()
|
object_id = models.PositiveIntegerField()
|
||||||
@@ -199,3 +203,4 @@ class CidUserExam(models.Model):
|
|||||||
end_time = models.DateTimeField(blank=True, null=True)
|
end_time = models.DateTimeField(blank=True, null=True)
|
||||||
|
|
||||||
cid_user = models.ForeignKey(CidUser, on_delete=models.CASCADE)
|
cid_user = models.ForeignKey(CidUser, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
|||||||
@@ -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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
+2
-1
@@ -12,7 +12,7 @@ from django.utils.translation import ugettext_lazy as _
|
|||||||
|
|
||||||
from sortedm2m.fields import SortedManyToManyField
|
from sortedm2m.fields import SortedManyToManyField
|
||||||
|
|
||||||
from generic.models import ExamBase, QuestionNote
|
from generic.models import CidUser, ExamBase, QuestionNote
|
||||||
|
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
@@ -154,6 +154,7 @@ class Exam(ExamBase):
|
|||||||
help_text='Author of exam',
|
help_text='Author of exam',
|
||||||
related_name="physics_exam_author")
|
related_name="physics_exam_author")
|
||||||
|
|
||||||
|
valid_users = models.ManyToManyField(CidUser, blank=True, related_name="physics_exams")
|
||||||
|
|
||||||
|
|
||||||
@reversion.register
|
@reversion.register
|
||||||
|
|||||||
+7
-1
@@ -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)
|
exam = get_object_or_404(Exam, pk=pk)
|
||||||
|
|
||||||
if not exam.active:
|
if not exam.active:
|
||||||
raise Http404("Exam not found")
|
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]
|
question = exam.exam_questions.all()[sk]
|
||||||
|
|
||||||
exam_length = len(exam.exam_questions.all())
|
exam_length = len(exam.exam_questions.all())
|
||||||
|
|||||||
Reference in New Issue
Block a user