From 5ea910cd63e17c0ca44771fba9df5808d34a5942 Mon Sep 17 00:00:00 2001 From: Ross Date: Sat, 17 Feb 2024 23:16:06 +0000 Subject: [PATCH] migrate teh rest --- generic/views.py | 21 ++++++++++--- longs/migrations/0017_examquestiondetail.py | 30 +++++++++++++++++++ .../0018_alter_exam_exam_questions.py | 22 ++++++++++++++ longs/models.py | 11 ++++++- physics/migrations/0007_examquestiondetail.py | 30 +++++++++++++++++++ .../0008_alter_exam_exam_questions.py | 22 ++++++++++++++ physics/models.py | 12 +++++++- sbas/migrations/0007_examquestiondetail.py | 30 +++++++++++++++++++ .../0008_alter_exam_exam_questions.py | 22 ++++++++++++++ sbas/models.py | 12 +++++++- 10 files changed, 205 insertions(+), 7 deletions(-) create mode 100644 longs/migrations/0017_examquestiondetail.py create mode 100644 longs/migrations/0018_alter_exam_exam_questions.py create mode 100644 physics/migrations/0007_examquestiondetail.py create mode 100644 physics/migrations/0008_alter_exam_exam_questions.py create mode 100644 sbas/migrations/0007_examquestiondetail.py create mode 100644 sbas/migrations/0008_alter_exam_exam_questions.py diff --git a/generic/views.py b/generic/views.py index c1974ad0..8e404b92 100644 --- a/generic/views.py +++ b/generic/views.py @@ -88,13 +88,13 @@ from .models import ( from rapids.models import Rapid as RapidQuestion, ExamQuestionDetail as RapidsExamQuestionDetail from rapids.models import Exam as RapidsExam -from longs.models import Long as LongQuestion, LongSeries +from longs.models import Long as LongQuestion, LongSeries, ExamQuestionDetail as LongsExamQuestionDetail from longs.models import Exam as LongsExam from anatomy.models import AnatomyQuestion as AnatomyQuestion, ExamQuestionDetail as AnatomyExamQuestionDetail from anatomy.models import Exam as AnatomyExam -from sbas.models import Question as SbasQuestion +from sbas.models import Question as SbasQuestion, ExamQuestionDetail as SbasExamQuestionDetail from sbas.models import Exam as SbasExam -from physics.models import Question as PhysicsQuestion +from physics.models import Question as PhysicsQuestion, ExamQuestionDetail as PhysicsExamQuestionDetail from physics.models import Exam as PhysicsExam from django.db.models import Case, When @@ -881,6 +881,7 @@ class ExamViews(View, LoginRequiredMixin): # "examination", ) .all() + .order_by("examquestiondetail__sort_order") ) elif self.app_name == "rapids": questions = ( @@ -911,10 +912,11 @@ class ExamViews(View, LoginRequiredMixin): elif self.app_name == "physics": questions = ( exam.exam_questions.select_related("category").all() + .order_by("examquestiondetail__sort_order") # .prefetch_related("images", "abnormality", "region", "examination") ) else: - questions = exam.exam_questions.select_related().all() + questions = exam.exam_questions.select_related().all().order_by("examquestiondetail__sort_order") question_number = len(questions) @@ -1228,6 +1230,17 @@ class ExamViews(View, LoginRequiredMixin): question_detail = RapidsExamQuestionDetail.objects.get( rapid=question, exam=exam ) + case "longs": + question_detail = LongsExamQuestionDetail.objects.get( + long=question, exam=exam) + case "physics": + question_detail = PhysicsExamQuestionDetail.objects.get( + question=question, exam=exam + ) + case "sbas": + question_detail = SbasExamQuestionDetail.objects.get( + question=question, exam=exam + ) case _: data = {"status": "error"} return JsonResponse(data, status=200) diff --git a/longs/migrations/0017_examquestiondetail.py b/longs/migrations/0017_examquestiondetail.py new file mode 100644 index 00000000..f8c212c0 --- /dev/null +++ b/longs/migrations/0017_examquestiondetail.py @@ -0,0 +1,30 @@ +# Generated by Django 4.1.4 on 2024-02-17 23:03 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('longs', '0016_rename_exam_collection_exam_examcollection'), + ] + + operations = [ + migrations.CreateModel( + name='ExamQuestionDetail', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(default=1000)), + ('exam', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='longs.exam')), + ('rapid', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='longs.long')), + ], + options={ + 'ordering': ('sort_order',), + }, + ), + migrations.RunSQL( + """INSERT INTO longs_examquestiondetail + SELECT * FROM longs_exam_exam_questions;""" + ), + ] diff --git a/longs/migrations/0018_alter_exam_exam_questions.py b/longs/migrations/0018_alter_exam_exam_questions.py new file mode 100644 index 00000000..59631a87 --- /dev/null +++ b/longs/migrations/0018_alter_exam_exam_questions.py @@ -0,0 +1,22 @@ +# Generated by Django 4.1.4 on 2024-02-17 23:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('longs', '0017_examquestiondetail'), + ] + + operations = [ + migrations.RemoveField( + model_name='exam', + name='exam_questions', + ), + migrations.AddField( + model_name='exam', + name='exam_questions', + field=models.ManyToManyField(related_name='exams', through='longs.ExamQuestionDetail', to='longs.long'), + ), + ] diff --git a/longs/models.py b/longs/models.py index 5f811611..c4d5dc37 100644 --- a/longs/models.py +++ b/longs/models.py @@ -409,12 +409,21 @@ class LongCreationDefault(models.Model): def get_absolute_url(self): return reverse("longs:long_create") +class ExamQuestionDetail(models.Model): + sort_order = models.IntegerField(default=1000) + + exam = models.ForeignKey("Exam", on_delete=models.CASCADE) + rapid = models.ForeignKey(Long, on_delete=models.CASCADE) + + class Meta: + ordering = ("sort_order",) @reversion.register class Exam(ExamBase): app_name = "longs" - exam_questions = SortedManyToManyField(Long, related_name="exams", blank="true") + #exam_questions = SortedManyToManyField(Long, related_name="exams", blank="true") + exam_questions = models.ManyToManyField(Long, through=ExamQuestionDetail, related_name="exams") time_limit = models.IntegerField( help_text="Exam time limit (in seconds). Default is 4500 seconds (75 minutes)", diff --git a/physics/migrations/0007_examquestiondetail.py b/physics/migrations/0007_examquestiondetail.py new file mode 100644 index 00000000..f2459c6d --- /dev/null +++ b/physics/migrations/0007_examquestiondetail.py @@ -0,0 +1,30 @@ +# Generated by Django 4.1.4 on 2024-02-17 23:07 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('physics', '0006_rename_exam_collection_exam_examcollection'), + ] + + operations = [ + migrations.CreateModel( + name='ExamQuestionDetail', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(default=1000)), + ('exam', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='physics.exam')), + ('rapid', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='physics.question')), + ], + options={ + 'ordering': ('sort_order',), + }, + ), + migrations.RunSQL( + """INSERT INTO physics_examquestiondetail + SELECT * FROM physics_exam_exam_questions;""" + ), + ] diff --git a/physics/migrations/0008_alter_exam_exam_questions.py b/physics/migrations/0008_alter_exam_exam_questions.py new file mode 100644 index 00000000..809536d0 --- /dev/null +++ b/physics/migrations/0008_alter_exam_exam_questions.py @@ -0,0 +1,22 @@ +# Generated by Django 4.1.4 on 2024-02-17 23:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('physics', '0007_examquestiondetail'), + ] + + operations = [ + migrations.RemoveField( + model_name='exam', + name='exam_questions', + ), + migrations.AddField( + model_name='exam', + name='exam_questions', + field=models.ManyToManyField(related_name='exams', through='physics.ExamQuestionDetail', to='physics.question'), + ), + ] diff --git a/physics/models.py b/physics/models.py index 91397e88..46cb4d47 100644 --- a/physics/models.py +++ b/physics/models.py @@ -136,11 +136,21 @@ class Question(QuestionBase): return ((0,) * 5, ("Not answered",) * 5) +class ExamQuestionDetail(models.Model): + sort_order = models.IntegerField(default=1000) + + exam = models.ForeignKey("Exam", on_delete=models.CASCADE) + rapid = models.ForeignKey(Question, on_delete=models.CASCADE) + + class Meta: + ordering = ("sort_order",) + #@reversion.register class Exam(ExamBase): app_name = "physics" - exam_questions = SortedManyToManyField(Question, related_name="exams", blank="true") + #exam_questions = SortedManyToManyField(Question, related_name="exams", blank="true") + exam_questions = models.ManyToManyField(Question, through=ExamQuestionDetail, related_name="exams") time_limit = models.IntegerField( help_text="Exam time limit (in seconds)", diff --git a/sbas/migrations/0007_examquestiondetail.py b/sbas/migrations/0007_examquestiondetail.py new file mode 100644 index 00000000..63652b89 --- /dev/null +++ b/sbas/migrations/0007_examquestiondetail.py @@ -0,0 +1,30 @@ +# Generated by Django 4.1.4 on 2024-02-17 23:11 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sbas', '0006_rename_exam_collection_exam_examcollection'), + ] + + operations = [ + migrations.CreateModel( + name='ExamQuestionDetail', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(default=1000)), + ('exam', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sbas.exam')), + ('rapid', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sbas.question')), + ], + options={ + 'ordering': ('sort_order',), + }, + ), + migrations.RunSQL( + """INSERT INTO sbas_examquestiondetail + SELECT * FROM sbas_exam_exam_questions;""" + ), + ] diff --git a/sbas/migrations/0008_alter_exam_exam_questions.py b/sbas/migrations/0008_alter_exam_exam_questions.py new file mode 100644 index 00000000..37eeb342 --- /dev/null +++ b/sbas/migrations/0008_alter_exam_exam_questions.py @@ -0,0 +1,22 @@ +# Generated by Django 4.1.4 on 2024-02-17 23:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sbas', '0007_examquestiondetail'), + ] + + operations = [ + migrations.RemoveField( + model_name='exam', + name='exam_questions', + ), + migrations.AddField( + model_name='exam', + name='exam_questions', + field=models.ManyToManyField(related_name='exams', through='sbas.ExamQuestionDetail', to='sbas.question'), + ), + ] diff --git a/sbas/models.py b/sbas/models.py index 691cf8b0..04a33f67 100644 --- a/sbas/models.py +++ b/sbas/models.py @@ -154,11 +154,21 @@ class Question(QuestionBase): return self.stem.replace("

", "", 1).replace("

", "", 1) +class ExamQuestionDetail(models.Model): + sort_order = models.IntegerField(default=1000) + + exam = models.ForeignKey("Exam", on_delete=models.CASCADE) + rapid = models.ForeignKey(Question, on_delete=models.CASCADE) + + class Meta: + ordering = ("sort_order",) + @reversion.register class Exam(ExamBase): app_name = "sbas" - exam_questions = SortedManyToManyField(Question, related_name="exams", blank="true") + #exam_questions = SortedManyToManyField(Question, related_name="exams", blank="true") + exam_questions = models.ManyToManyField(Question, through=ExamQuestionDetail, related_name="exams") time_limit = models.IntegerField( help_text="Exam time limit (in seconds)",