add exam collections

This commit is contained in:
Ross
2024-01-29 09:58:18 +00:00
parent e89cf704ed
commit 04dcb74e67
15 changed files with 186 additions and 7 deletions
@@ -0,0 +1,20 @@
# Generated by Django 4.1.4 on 2024-01-29 09:52
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('generic', '0011_examcollection'),
('anatomy', '0010_alter_anatomyquestion_answer_suggest_incorrect'),
]
operations = [
migrations.AddField(
model_name='exam',
name='exam_collection',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='generic.examcollection'),
),
]
@@ -0,0 +1,20 @@
# Generated by Django 4.1.4 on 2024-01-29 09:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('generic', '0011_examcollection'),
('anatomy', '0011_exam_exam_collection'),
]
operations = [
migrations.AlterField(
model_name='exam',
name='exam_collection',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='anatomy_exams', to='generic.examcollection'),
),
]
+3 -1
View File
@@ -17,7 +17,7 @@ from sortedm2m.fields import SortedManyToManyField
import string
from generic.models import CidUser, CidUserGroup, ExamUserStatus, Examination, ExamBase, QuestionBase, QuestionNote, UserAnswerBase, UserUserGroup, Modality
from generic.models import CidUser, CidUserGroup, ExamCollection, ExamUserStatus, Examination, ExamBase, QuestionBase, QuestionNote, UserAnswerBase, UserUserGroup, Modality
from atlas.models import Structure
from collections import defaultdict
@@ -404,6 +404,8 @@ class Exam(ExamBase):
exam_user_status = GenericRelation(ExamUserStatus)
exam_collection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="anatomy_exams")
def get_exam_json(self, based=True):
questions = self.exam_questions.all()
+2 -2
View File
@@ -44,7 +44,7 @@ from generic.models import (
CidUser,
CidUserExam,
CidUserGroup,
ExamCollectionGenericBase,
ExamOrCollectionGenericBase,
Examination,
# Condition,
ExamBase,
@@ -618,7 +618,7 @@ class Series(SeriesBase):
return series_json
class CaseCollection(ExamCollectionGenericBase):
class CaseCollection(ExamOrCollectionGenericBase):
app_name = "atlas"
cases = models.ManyToManyField(Case, through="CaseDetail")
+21
View File
@@ -0,0 +1,21 @@
# Generated by Django 4.1.4 on 2024-01-29 09:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('generic', '0010_userprofile_site'),
]
operations = [
migrations.CreateModel(
name='ExamCollection',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('date', models.DateField(blank=True, null=True)),
],
),
]
+8 -2
View File
@@ -519,7 +519,7 @@ class SeriesBase(models.Model):
pass
class ExamCollectionGenericBase(models.Model):
class ExamOrCollectionGenericBase(models.Model):
"""Holds functions that relate to both case and other exams
e.g. user management
@@ -734,7 +734,7 @@ class ExamCollectionGenericBase(models.Model):
)
class ExamBase(ExamCollectionGenericBase):
class ExamBase(ExamOrCollectionGenericBase):
exam_mode = models.BooleanField(
help_text="If an exam should be taken in exam mode (users results will be submited to the server for marking)",
default=False,
@@ -1517,3 +1517,9 @@ def create_user_profile(sender, instance, created, **kwargs):
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userprofile.save()
class ExamCollection(models.Model):
name = models.CharField(max_length=255)
date = models.DateField(blank=True,null=True)
@@ -0,0 +1,20 @@
# Generated by Django 4.1.4 on 2024-01-29 09:57
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('generic', '0011_examcollection'),
('longs', '0014_exam_stats_graph'),
]
operations = [
migrations.AddField(
model_name='exam',
name='exam_collection',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='longs_exams', to='generic.examcollection'),
),
]
+3
View File
@@ -28,6 +28,7 @@ from helpers.images import image_as_base64, pretty_print_dicom
from generic.models import (
CidUser,
CidUserGroup,
ExamCollection,
ExamUserStatus,
Examination,
ExamBase,
@@ -465,6 +466,8 @@ class Exam(ExamBase):
exam_user_status = GenericRelation(ExamUserStatus)
exam_collection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="longs_exams")
def get_exam_question_json(self, question_id):
q = get_object_or_404(Long, pk=question_id)
@@ -0,0 +1,20 @@
# Generated by Django 4.1.4 on 2024-01-29 09:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('generic', '0011_examcollection'),
('physics', '0003_exam_stats_graph'),
]
operations = [
migrations.AddField(
model_name='exam',
name='exam_collection',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rapids_exams', to='generic.examcollection'),
),
]
@@ -0,0 +1,20 @@
# Generated by Django 4.1.4 on 2024-01-29 09:57
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('generic', '0011_examcollection'),
('physics', '0004_exam_exam_collection'),
]
operations = [
migrations.AlterField(
model_name='exam',
name='exam_collection',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='physics_exams', to='generic.examcollection'),
),
]
+3 -1
View File
@@ -12,7 +12,7 @@ from django.utils.translation import gettext_lazy as _
from sortedm2m.fields import SortedManyToManyField
from generic.models import CidUser, CidUserGroup, ExamBase, ExamUserStatus, QuestionBase, QuestionNote, UserAnswerBase, UserUserGroup
from generic.models import CidUser, CidUserGroup, ExamBase, ExamCollection, ExamUserStatus, QuestionBase, QuestionNote, UserAnswerBase, UserUserGroup
import reversion
@@ -182,6 +182,8 @@ class Exam(ExamBase):
exam_user_status = GenericRelation(ExamUserStatus)
exam_collection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="physics_exams")
def get_take_url(self):
return reverse("physics:exam_start", kwargs={"pk": self.pk})
@@ -0,0 +1,20 @@
# Generated by Django 4.1.4 on 2024-01-29 09:57
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('generic', '0011_examcollection'),
('rapids', '0003_exam_stats_graph'),
]
operations = [
migrations.AddField(
model_name='exam',
name='exam_collection',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rapids_exams', to='generic.examcollection'),
),
]
+3
View File
@@ -28,6 +28,7 @@ from django.contrib.contenttypes.fields import GenericRelation
from generic.models import (
CidUser,
CidUserGroup,
ExamCollection,
ExamUserStatus,
QuestionBase,
Site,
@@ -648,6 +649,8 @@ class Exam(ExamBase):
exam_user_status = GenericRelation(ExamUserStatus)
exam_collection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="rapids_exams")
def get_normal_abnormal_breakdown(self):
# Inefficient but more extendible
questions = self.exam_questions.all()
@@ -0,0 +1,20 @@
# Generated by Django 4.1.4 on 2024-01-29 09:57
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('generic', '0011_examcollection'),
('sbas', '0004_exam_stats_graph'),
]
operations = [
migrations.AddField(
model_name='exam',
name='exam_collection',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sbas_exams', to='generic.examcollection'),
),
]
+3 -1
View File
@@ -11,7 +11,7 @@ from django.utils.translation import gettext_lazy as _
from sortedm2m.fields import SortedManyToManyField
from generic.models import CidUser, CidUserGroup, ExamBase, ExamUserStatus, QuestionBase, QuestionNote, UserAnswerBase, UserUserGroup
from generic.models import CidUser, CidUserGroup, ExamBase, ExamCollection, ExamUserStatus, QuestionBase, QuestionNote, UserAnswerBase, UserUserGroup
import reversion
@@ -198,6 +198,8 @@ class Exam(ExamBase):
exam_user_status = GenericRelation(ExamUserStatus)
exam_collection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="sbas_exams")
def get_take_url(self):
return reverse("sbas:exam_start", kwargs={"pk": self.pk})