From 74d300ab167f9b41dfba178637b4c15ed3139914 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 29 Jul 2024 11:38:52 +0100 Subject: [PATCH] some more admin improvements --- anatomy/models.py | 2 +- atlas/models.py | 2 +- generic/admin.py | 109 +++++++++++++++++++++++++++++++++++++++++----- generic/models.py | 1 - longs/models.py | 2 +- physics/models.py | 2 +- rapids/models.py | 2 +- sbas/models.py | 2 +- 8 files changed, 105 insertions(+), 17 deletions(-) diff --git a/anatomy/models.py b/anatomy/models.py index da94ee3f..a56b2a34 100644 --- a/anatomy/models.py +++ b/anatomy/models.py @@ -409,7 +409,7 @@ class Exam(ExamBase): related_name="anatomy_user_user_groups" ) - exam_user_status = GenericRelation(ExamUserStatus) + exam_user_status = GenericRelation(ExamUserStatus, related_query_name="anatomy_exams") examcollection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="anatomy_exams") diff --git a/atlas/models.py b/atlas/models.py index 19338d70..ed836141 100644 --- a/atlas/models.py +++ b/atlas/models.py @@ -810,7 +810,7 @@ class CaseCollection(ExamOrCollectionGenericBase): help_text="If true allows users self complete and review cases in a self directed way.", ) - exam_user_status = GenericRelation(ExamUserStatus) + exam_user_status = GenericRelation(ExamUserStatus, related_query_name="atlas_exams") feedback_once_collection_complete = models.BooleanField(default=True, help_text="If true feedback is only given once the collection is complete. If false feedback is given after each case.") diff --git a/generic/admin.py b/generic/admin.py index 044898e3..5e47d5a8 100644 --- a/generic/admin.py +++ b/generic/admin.py @@ -1,11 +1,17 @@ -from longs.models import Exam +from longs.models import Exam as LongExam +from rapids.models import Exam as RapidExam +from anatomy.models import Exam as AnatomyExam +from physics.models import Exam as PhysicsExam +from sbas.models import Exam as SbasExam +from atlas.models import CaseCollection as AtlasExam + from django.contrib import admin # Register your models here. from .models import ( CidUserGroup, Examination, - #Sign, + # Sign, Modality, Plane, Contrast, @@ -18,15 +24,26 @@ from .models import ( UserProfile, Supervisor, ExamCollection, - Site + Site, ) + +def custom_title_filter_factory(filter_cls, title): + class Wrapper(filter_cls): + def __new__(cls, *args, **kwargs): + instance = filter_cls(*args, **kwargs) + instance.title = title + return instance + + return Wrapper + + # from .models import Examination, Sign, Site, Condition admin.site.register(Examination) -#admin.site.register(Sign) +# admin.site.register(Sign) admin.site.register(Site) -#admin.site.register(Condition) +# admin.site.register(Condition) admin.site.register(Plane) admin.site.register(Contrast) admin.site.register(QuestionNote) @@ -39,22 +56,94 @@ admin.site.register(Supervisor) admin.site.register(Modality) admin.site.register(ExamCollection) + +class ExamListFilter(admin.SimpleListFilter): + #title = "Long Exams" + #parameter_name = "exam" + #exam_model = None + + def __init__(self, request, params, model, model_admin): + self.parameter_name = self.related_field_name + super().__init__(request, params, model, model_admin) + + def lookups(self, request, model_admin): + return [(exam.id, exam.name) for exam in self.exam_model.objects.all()] + + def queryset(self, request, queryset): + if self.value(): + #return queryset.filter(longs_exams__id=self.value()) + kwargs = {f"{self.related_field_name}__id": self.value()} + return queryset.filter(**kwargs) + return queryset + +class LongExamListFilter(ExamListFilter): + title = "Long Exams" + related_field_name = "longs_exams" + exam_model = LongExam + +class RapidExamListFilter(ExamListFilter): + title = "Rapid Exams" + related_field_name = "rapids_exams" + exam_model = RapidExam + +class AnatomyExamListFilter(ExamListFilter): + title = "Anatomy Exams" + related_field_name = "anatomy_exams" + exam_model = AnatomyExam + +class PhysicsExamListFilter(ExamListFilter): + title = "Physics Exams" + related_field_name = "physics_exams" + exam_model = PhysicsExam + +class SbasExamListFilter(ExamListFilter): + title = "Sbas Exams" + related_field_name = "sbas_exams" + exam_model = SbasExam + +class AtlasExamListFilter(ExamListFilter): + title = "Atlas Exams" + related_field_name = "atlas_exams" + exam_model = AtlasExam + class CidUserExamAdmin(admin.ModelAdmin): - list_filter = ('cid_user', 'user_user', 'completed') + list_filter = ("cid_user", "user_user", "completed") def get_queryset(self, request): - qs = super().get_queryset(request).prefetch_related('cid_user', 'user_user', 'exam') + qs = ( + super() + .get_queryset(request) + .prefetch_related("cid_user", "user_user", "exam") + ) return qs + admin.site.register(CidUserExam, CidUserExamAdmin) + class ExamUserStatusAdmin(admin.ModelAdmin): - list_filter = ('status', 'cid_user_exam__user_user', 'cid_user_exam__cid_user') + list_filter = ( + "status", + "cid_user_exam__user_user", + "cid_user_exam__cid_user", + LongExamListFilter, + RapidExamListFilter, + AnatomyExamListFilter, + PhysicsExamListFilter, + SbasExamListFilter, + AtlasExamListFilter, + + ) + + exclude = ("anatomy_exams", "longs_exams", "rapids_exams", "physics_exams", "sbas_exams", "atlas_exams") + + readonly_fields = ("cid_user_exam",) def get_queryset(self, request): - qs = super().get_queryset(request).prefetch_related('cid_user_exam', 'exam') + qs = super().get_queryset(request).prefetch_related("cid_user_exam", "exam") return qs -admin.site.register(ExamUserStatus, ExamUserStatusAdmin) \ No newline at end of file + +admin.site.register(ExamUserStatus, ExamUserStatusAdmin) diff --git a/generic/models.py b/generic/models.py index d9870225..3ba5e338 100644 --- a/generic/models.py +++ b/generic/models.py @@ -871,7 +871,6 @@ class ExamBase(ExamOrCollectionGenericBase): def __str__(self): if self.start_date and self.start_date is not None: - print(f"Start date: {self.start_date:%d %B %Y}") return f"{self.name} ({self.start_date:%d %B %Y})" else: return self.name diff --git a/longs/models.py b/longs/models.py index d74423fc..38d95807 100644 --- a/longs/models.py +++ b/longs/models.py @@ -472,7 +472,7 @@ class Exam(ExamBase): related_name="longs_user_user_groups", ) - exam_user_status = GenericRelation(ExamUserStatus) + exam_user_status = GenericRelation(ExamUserStatus, related_query_name="longs_exams") examcollection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="longs_exams") diff --git a/physics/models.py b/physics/models.py index 378cd572..6b7cb58a 100644 --- a/physics/models.py +++ b/physics/models.py @@ -190,7 +190,7 @@ class Exam(ExamBase): related_name="physics_user_user_groups" ) - exam_user_status = GenericRelation(ExamUserStatus) + exam_user_status = GenericRelation(ExamUserStatus, related_query_name="physics_exams") examcollection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="physics_exams") diff --git a/rapids/models.py b/rapids/models.py index 3a9cc8c8..26f15c90 100644 --- a/rapids/models.py +++ b/rapids/models.py @@ -651,7 +651,7 @@ class Exam(ExamBase): related_name="rapid_user_user_groups", ) - exam_user_status = GenericRelation(ExamUserStatus) + exam_user_status = GenericRelation(ExamUserStatus, related_query_name="rapids_exams") examcollection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="rapids_exams") diff --git a/sbas/models.py b/sbas/models.py index e74fd4a1..c919872d 100644 --- a/sbas/models.py +++ b/sbas/models.py @@ -206,7 +206,7 @@ class Exam(ExamBase): related_name="sba_user_user_groups" ) - exam_user_status = GenericRelation(ExamUserStatus) + exam_user_status = GenericRelation(ExamUserStatus, related_query_name="sba_exams") examcollection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="sbas_exams")