Files

141 lines
4.7 KiB
Python
Executable File

from django.contrib import admin
from .models import Rapid, RapidImage, Examination, Site, Abnormality, Region, RapidCreationDefault, Answer, Exam, UserAnswer
from django.forms import ModelForm
from reversion.admin import VersionAdmin
from django.forms.widgets import RadioSelect
from django.contrib import messages
# Register your models here.
admin.site.register(Examination)
#admin.site.register(Site)
admin.site.register(Abnormality)
admin.site.register(Region)
admin.site.register(RapidCreationDefault)
admin.site.register(Answer)
class RapidAnswersInline(admin.TabularInline):
model = Answer
extra = 1
class RapidImageInline(admin.TabularInline):
model = RapidImage
extra = 1
readonly_fields = [
"image_tag",
]
class ExamInline(admin.TabularInline):
model = Rapid.exams.through
extra = 1
class RapidAdminForm(ModelForm):
class Meta:
model = Rapid
fields = [
"normal", "abnormality", "region", "laterality", "examination",
#"site",
#"sign", "condition",
"feedback", "author"
]
widgets = {
"laterality": RadioSelect(attrs={'style': 'display: inline-flex'}),
}
class RapidAdmin(VersionAdmin):
form = RapidAdminForm
filter_horizontal = (
"abnormality",
"region",
#"examination",
)
save_on_top = True
save_as = True
view_on_site = True
inlines = [
RapidImageInline,
RapidAnswersInline,
ExamInline,
]
actions = ["migrate_to_shorts"]
def migrate_to_shorts(self, request, queryset):
"""Admin action to migrate selected Rapid questions to shorts.Question"""
from shorts.models import Question as ShortQuestion
created = []
skipped = []
for rapid in queryset:
# allow admin or any author to perform migration
if request.user.is_superuser or rapid.author.filter(id=request.user.id).exists():
try:
q = ShortQuestion.from_rapid(rapid)
if q is None:
skipped.append(str(rapid.id))
else:
created.append(str(q.id))
except Exception as e:
self.message_user(request, f"Failed to migrate Rapid {rapid.id}: {e}", level=messages.ERROR)
else:
self.message_user(request, f"No permission to migrate Rapid {rapid.id}", level=messages.ERROR)
if created:
self.message_user(request, f"Created shorts questions: {', '.join(created)}", level=messages.SUCCESS)
if skipped:
self.message_user(request, f"Skipped normal rapids (not migrated): {', '.join(skipped)}", level=messages.INFO)
migrate_to_shorts.short_description = "Migrate selected rapids to shorts"
class ExamAdmin(VersionAdmin, admin.ModelAdmin):
save_as = True
actions = ["migrate_exam_questions"]
def migrate_exam_questions(self, request, queryset):
"""Admin action to migrate all Rapid questions linked to selected Exam(s)"""
from shorts.models import Question as ShortQuestion
created = []
skipped = []
for exam in queryset:
for rapid in exam.exam_questions.all():
# only allow if admin or author of rapid
if request.user.is_superuser or rapid.author.filter(id=request.user.id).exists():
try:
q = ShortQuestion.from_rapid(rapid)
if q is None:
skipped.append(str(rapid.id))
else:
created.append(str(q.id))
except Exception as e:
self.message_user(request, f"Failed to migrate Rapid {rapid.id}: {e}", level=messages.ERROR)
else:
self.message_user(request, f"No permission to migrate Rapid {rapid.id}", level=messages.ERROR)
if created:
self.message_user(request, f"Created shorts questions: {', '.join(created)}", level=messages.SUCCESS)
if skipped:
self.message_user(request, f"Skipped normal rapids (not migrated): {', '.join(skipped)}", level=messages.INFO)
migrate_exam_questions.short_description = "Migrate all rapids in selected exam(s) to shorts"
admin.site.register(Rapid, RapidAdmin)
admin.site.register(Exam, ExamAdmin)
class UserAnswerAdmin(admin.ModelAdmin):
exclude = []
readonly_fields = ["created", "updated"]
admin.site.register(UserAnswer, UserAnswerAdmin)
class RapidImageAdmin(admin.ModelAdmin):
readonly_fields = ('rapid',)
admin.site.register(RapidImage, RapidImageAdmin)