vault backup: 2025-12-26 02:09:22
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 2m29s
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 2m29s
This commit is contained in:
58
stroma/quiz/admin/question_admin.py
Normal file
58
stroma/quiz/admin/question_admin.py
Normal file
@@ -0,0 +1,58 @@
|
||||
from django.contrib import admin
|
||||
from django.utils.html import format_html
|
||||
from quiz.models import Question
|
||||
from .option_inline import OptionInline
|
||||
|
||||
|
||||
@admin.register(Question)
|
||||
class QuestionAdmin(admin.ModelAdmin):
|
||||
"""Admin interface for Questions"""
|
||||
list_display = ['id', 'question_preview', 'exam', 'correct_answer', 'option_count', 'file_source', 'updated_at']
|
||||
list_filter = ['exam__course', 'exam', 'created_at', 'updated_at']
|
||||
search_fields = ['text', 'file_path', 'correct_answer']
|
||||
readonly_fields = ['file_path', 'file_mtime', 'created_at', 'updated_at', 'formatted_mtime']
|
||||
fieldsets = [
|
||||
('Question Content', {
|
||||
'fields': ['exam', 'text', 'correct_answer']
|
||||
}),
|
||||
('File Tracking', {
|
||||
'fields': ['file_path', 'file_mtime', 'formatted_mtime'],
|
||||
'classes': ['collapse']
|
||||
}),
|
||||
('Timestamps', {
|
||||
'fields': ['created_at', 'updated_at'],
|
||||
'classes': ['collapse']
|
||||
}),
|
||||
]
|
||||
inlines = [OptionInline]
|
||||
|
||||
def question_preview(self, obj):
|
||||
"""Show question text preview"""
|
||||
return obj.text[:60] + '...' if len(obj.text) > 60 else obj.text
|
||||
question_preview.short_description = 'Question'
|
||||
|
||||
def option_count(self, obj):
|
||||
"""Show number of options"""
|
||||
return obj.options.count()
|
||||
option_count.short_description = '# Options'
|
||||
|
||||
def file_source(self, obj):
|
||||
"""Show file path with folder highlight"""
|
||||
if obj.file_path:
|
||||
parts = obj.file_path.split('/')
|
||||
if len(parts) > 1:
|
||||
folder = parts[-2]
|
||||
filename = parts[-1]
|
||||
return format_html('<span style="color: #666;">{}/</span><strong>{}</strong>', folder, filename)
|
||||
return obj.file_path or '-'
|
||||
file_source.short_description = 'Source File'
|
||||
|
||||
def formatted_mtime(self, obj):
|
||||
"""Show formatted modification time"""
|
||||
if obj.file_mtime:
|
||||
from datetime import datetime
|
||||
dt = datetime.fromtimestamp(obj.file_mtime)
|
||||
return dt.strftime('%Y-%m-%d %H:%M:%S')
|
||||
return '-'
|
||||
formatted_mtime.short_description = 'File Modified'
|
||||
|
||||
Reference in New Issue
Block a user