141 lines
4.7 KiB
Python
Executable File
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) |